48 return Trinity::make_unique_ptr_with_deleter<&::OSSL_STORE_close>(OSSL_STORE_open(uri.c_str(), passwordCallback, passwordCallbackData,
nullptr,
nullptr));
55 return boost::system::error_code(
static_cast<int>(::ERR_GET_REASON(ossl_error)), boost::asio::error::get_system_category());
57 return boost::system::error_code(
static_cast<int>(ossl_error), boost::asio::error::get_ssl_category());
63 boost::system::error_code err;
64#define LOAD_CHECK(fn) do { fn; \
67 TC_LOG_ERROR("server.ssl", #fn " failed: {}", err.message()); \
71 std::string certificateChainFile =
sConfigMgr->GetStringDefault(
"CertificatesFile",
"./bnetserver.cert.pem");
73 auto passwordCallback = [](std::size_t , boost::asio::ssl::context::password_purpose ) -> std::string
75 return sConfigMgr->GetStringDefault(
"PrivateKeyPassword",
"");
80 SSL_CTX* nativeContext =
instance().native_handle();
81 auto password_ui_method = CreatePasswordUiMethodFromPemCallback(SSL_CTX_get_default_passwd_cb(nativeContext));
83 auto store = OpenOpenSSLStore(boost::filesystem::absolute(certificateChainFile),
84 password_ui_method.get(), SSL_CTX_get_default_passwd_cb_userdata(nativeContext));
88 err = GetLastOpenSSLError();
89 TC_LOG_ERROR(
"server.ssl",
"OSSL_STORE_open failed: {}", err.message());
93 EVP_PKEY* key =
nullptr;
94 STACK_OF(X509)* certs = sk_X509_new_null();
95 while (!OSSL_STORE_eof(store.get()))
97 OSSL_STORE_INFO* info = OSSL_STORE_load(store.get());
101 switch (OSSL_STORE_INFO_get_type(info))
103 case OSSL_STORE_INFO_PKEY:
104 key = OSSL_STORE_INFO_get1_PKEY(info);
106 case OSSL_STORE_INFO_CERT:
107 sk_X509_push(certs, OSSL_STORE_INFO_get1_CERT(info));
114 if (sk_X509_num(certs) > 0)
116 X509* cert = sk_X509_shift(certs);
120 X509_NAME
const* nm = X509_get_subject_name(cert);
124 lastpos = X509_NAME_get_index_by_NID(nm, NID_commonName, lastpos);
128 X509_NAME_ENTRY
const* e = X509_NAME_get_entry(nm, lastpos);
132 ASN1_STRING
const* text = X509_NAME_ENTRY_get_data(e);
136 unsigned char* utf8TextRaw =
nullptr;
137 if (
int utf8Length = ASN1_STRING_to_UTF8(&utf8TextRaw, text); utf8Length >= 0)
140 if (std::string_view(
reinterpret_cast<char const*
>(utf8Text.get()), utf8Length) ==
"*.*")
148 SSL_CTX_use_cert_and_key(nativeContext, cert, key, certs, 1);
155 std::string privateKeyFile =
sConfigMgr->GetStringDefault(
"PrivateKeyFile",
"./bnetserver.key.pem");
156 LOAD_CHECK(
instance().use_private_key_file(privateKeyFile, boost::asio::ssl::context::pem, err));
static boost::asio::ssl::context & instance()
static bool _usesDevWildcardCertificate