76 SSL* ssl =
static_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
78 const std::string connectionName = *
static_cast<std::string*>(SSL_get_ex_data(ssl, 0));
80 X509* curr_cert = X509_STORE_CTX_get_current_cert(ctx);
81 const int depth = X509_STORE_CTX_get_error_depth(ctx);
83 char subjectName[256];
84 X509_NAME_oneline(X509_get_subject_name(curr_cert), subjectName, 256);
87 X509_NAME_oneline(X509_get_issuer_name(curr_cert), issuerName, 256);
89 if (preverify_ok != 0) {
90 LOG(DEBUG) << connectionName <<
": SSL/TLS verify success at depth=" << depth;
91 LOG(DEBUG) <<
" Issuer: " << issuerName;
92 LOG(DEBUG) <<
" Subject: " << subjectName;
94 const int err = X509_STORE_CTX_get_error(ctx);
96 LOG(DEBUG) << connectionName <<
": SSL/TLS verify error at depth=" << depth <<
": " << X509_verify_cert_error_string(err);
97 LOG(DEBUG) <<
" Issuer: " << issuerName;
98 LOG(DEBUG) <<
" Subject: " << subjectName;
101
102
103
104
115 static int sslSessionCtxId = 1;
117 SSL_CTX* ctx = SSL_CTX_new(sslConfig
.server ? TLS_server_method() : TLS_client_method());
119 if (ctx !=
nullptr) {
120 SSL_CTX_set_read_ahead(ctx, 1);
122 SSL_CTX_set_mode(ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
123 SSL_CTX_set_mode(ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
128 SSL_CTX_set_session_id_context(ctx,
reinterpret_cast<
const unsigned char*>(&sslSessionCtxId),
sizeof(sslSessionCtxId));
132 if (SSL_CTX_load_verify_locations(ctx,
139 if (!sslConfig
.caCert.empty()) {
140 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificate loaded";
141 LOG(TRACE) <<
" " << sslConfig
.caCert;
143 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificate not loaded from a file";
146 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificates load from";
149 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificates not loaded from a directory";
153 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificate not loaded from a file";
154 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificates not loaded from a directory";
157 if (SSL_CTX_set_default_verify_paths(ctx) == 0) {
161 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificates enabled load from default openssl CA directory";
164 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA certificates not loaded from default openssl CA directory";
167 SSL_CTX_set_verify_depth(ctx, 5);
168 SSL_CTX_set_verify(ctx,
171 ? SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE | SSL_VERIFY_FAIL_IF_NO_PEER_CERT
174 if ((SSL_CTX_get_verify_mode(ctx) & SSL_VERIFY_PEER) != 0) {
175 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: CA requested verify";
177 if (!sslConfig
.cert.empty()) {
178 if (SSL_CTX_use_certificate_chain_file(ctx, sslConfig
.cert.c_str()) == 0) {
181 }
else if (!sslConfig
.certKey.empty()) {
184 SSL_CTX_set_default_passwd_cb_userdata(ctx, ::strdup(sslConfig
.password.c_str()));
186 if (SSL_CTX_use_PrivateKey_file(ctx, sslConfig
.certKey.c_str(), SSL_FILETYPE_PEM) == 0) {
190 }
else if (SSL_CTX_check_private_key(ctx) != 1) {
193 LOG(TRACE) <<
" " << sslConfig
.certKey;
196 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: Cert chain key loaded";
197 LOG(TRACE) <<
" " << sslConfig
.certKey;
199 LOG(TRACE) << sslConfig
.instanceName <<
" SSL/TLS: Cert chain loaded";
200 LOG(TRACE) <<
" " << sslConfig
.cert;
210 SSL_CTX_set_cipher_list(ctx, sslConfig
.cipherList.c_str());
222 std::map<std::string, SSL_CTX*> sans;
224 if (sslCtx !=
nullptr) {
225 X509* x509 = SSL_CTX_get0_certificate(sslCtx);
226 if (x509 !=
nullptr) {
227 GENERAL_NAMES* subjectAltNames =
228 static_cast<GENERAL_NAMES*>(X509_get_ext_d2i(x509, NID_subject_alt_name,
nullptr,
nullptr));
230 const int32_t altNameCount = sk_GENERAL_NAME_num(subjectAltNames);
232 for (int32_t i = 0; i < altNameCount; ++i) {
233 GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
234 if (generalName->type == GEN_DNS || generalName->type == GEN_URI || generalName->type == GEN_EMAIL) {
235 const std::string subjectAltName =
236 std::string(
reinterpret_cast<
const char*>(ASN1_STRING_get0_data(generalName->d.dNSName)),
237 static_cast<std::size_t>(ASN1_STRING_length(generalName->d.dNSName)));
238 sans.insert({subjectAltName, sslCtx});
242 sk_GENERAL_NAME_pop_free(subjectAltNames, GENERAL_NAME_free);
256 SSL_CTX* newSslCtx = SSL_set_SSL_CTX(ssl, sslCtx);
257 SSL_clear_options(ssl, 0xFFFFFFFFL);
258 SSL_set_options(ssl, SSL_CTX_get_options(sslCtx));
259 SSL_set_verify(ssl, SSL_CTX_get_verify_mode(sslCtx), SSL_CTX_get_verify_callback(sslCtx));
260 SSL_set_verify_depth(ssl, SSL_CTX_get_verify_depth(sslCtx));
261 SSL_set_mode(ssl, SSL_CTX_get_mode(sslCtx));
274 const unsigned char* ext =
nullptr;
277 size_t server_name_list_len = 0;
278 size_t server_name_len = 0;
280 if (SSL_client_hello_get0_ext(ssl, TLSEXT_TYPE_server_name, &ext, &ext_len) == 0) {
290 server_name_list_len =
static_cast<size_t>((ext[p] << 8) + ext[p + 1]);
292 if (p + server_name_list_len != ext_len) {
297 if (ext[p] != TLSEXT_NAMETYPE_host_name) {
303 server_name_len =
static_cast<size_t>((ext[p] << 8) + ext[p + 1]);
305 if (p + server_name_len != ext_len) {
313 return std::string(
reinterpret_cast<
const char*>(ext + p), ext_len - p);