54 SSL* ssl =
static_cast<SSL*>(X509_STORE_CTX_get_ex_data(ctx, SSL_get_ex_data_X509_STORE_CTX_idx()));
56 std::string connectionName = *
static_cast<std::string*>(SSL_get_ex_data(ssl, 0));
58 X509* curr_cert = X509_STORE_CTX_get_current_cert(ctx);
59 const int depth = X509_STORE_CTX_get_error_depth(ctx);
61 char subjectName[256];
62 X509_NAME_oneline(X509_get_subject_name(curr_cert), subjectName, 256);
65 X509_NAME_oneline(X509_get_issuer_name(curr_cert), issuerName, 256);
67 if (preverify_ok != 0) {
68 LOG(DEBUG) << connectionName <<
": SSL/TLS verify success at depth=" << depth;
69 LOG(DEBUG) <<
" Issuer: " << issuerName;
70 LOG(DEBUG) <<
" Subject: " << subjectName;
72 const int err = X509_STORE_CTX_get_error(ctx);
75
76
77
79 LOG(DEBUG) << connectionName <<
": SSL/TLS verify error at depth=" << depth <<
": " << X509_verify_cert_error_string(err);
80 LOG(DEBUG) <<
" Issuer: " << issuerName;
81 LOG(DEBUG) <<
" Subject: " << subjectName;
92 static int sslSessionCtxId = 1;
94 SSL_CTX* ctx = SSL_CTX_new(sslConfig.server ? TLS_server_method() : TLS_client_method());
97 SSL_CTX_set_read_ahead(ctx, 1);
99 SSL_CTX_set_mode(ctx, SSL_MODE_ENABLE_PARTIAL_WRITE);
100 SSL_CTX_set_mode(ctx, SSL_MODE_ACCEPT_MOVING_WRITE_BUFFER);
104 if (sslConfig.server) {
105 SSL_CTX_set_session_id_context(ctx,
reinterpret_cast<
const unsigned char*>(&sslSessionCtxId),
sizeof(sslSessionCtxId));
108 if (!sslConfig.caCert.empty() || !sslConfig.caCertDir.empty()) {
109 if (SSL_CTX_load_verify_locations(ctx,
110 !sslConfig.caCert.empty() ? sslConfig.caCert.c_str() :
nullptr,
111 !sslConfig.caCertDir.empty() ? sslConfig.caCertDir.c_str() :
nullptr) == 0) {
112 ssl_log_error(sslConfig.instanceName +
" SSL/TLS: CA certificate error loading file '" + sslConfig.caCert +
"', dir '" +
113 sslConfig.caCertDir +
"'");
116 if (!sslConfig.caCert.empty()) {
117 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificate loaded";
118 LOG(TRACE) <<
" " << sslConfig.caCert;
120 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificate not loaded from a file";
122 if (!sslConfig.caCertDir.empty()) {
123 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificates load from";
124 LOG(TRACE) <<
" " << sslConfig.caCertDir;
126 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificates not loaded from a directory";
130 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificate not loaded from a file";
131 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificates not loaded from a directory";
133 if (!sslErr && sslConfig.caCertUseDefaultDir) {
134 if (SSL_CTX_set_default_verify_paths(ctx) == 0) {
135 ssl_log_error(sslConfig.instanceName +
" SSL/TLS: CA certificates error load from default openssl CA directory");
138 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificates enabled load from default openssl CA directory";
141 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA certificates not loaded from default openssl CA directory";
144 SSL_CTX_set_verify_depth(ctx, 5);
145 SSL_CTX_set_verify(ctx,
146 (sslConfig.caCertAcceptUnknown ? SSL_VERIFY_NONE
147 : (!sslConfig.caCert.empty() || !sslConfig.caCertDir.empty() || sslConfig.caCertUseDefaultDir)
148 ? SSL_VERIFY_PEER | SSL_VERIFY_CLIENT_ONCE | SSL_VERIFY_FAIL_IF_NO_PEER_CERT
151 if ((SSL_CTX_get_verify_mode(ctx) & SSL_VERIFY_PEER) != 0) {
152 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: CA requested verify";
154 if (!sslConfig.cert.empty()) {
155 if (SSL_CTX_use_certificate_chain_file(ctx, sslConfig.cert.c_str()) == 0) {
156 ssl_log_error(sslConfig.instanceName +
" SSL/TLS: Cert chain error loading from file '" + sslConfig.cert +
"'");
158 }
else if (!sslConfig.certKey.empty()) {
159 if (!sslConfig.password.empty()) {
161 SSL_CTX_set_default_passwd_cb_userdata(ctx, ::strdup(sslConfig.password.c_str()));
163 if (SSL_CTX_use_PrivateKey_file(ctx, sslConfig.certKey.c_str(), SSL_FILETYPE_PEM) == 0) {
164 ssl_log_error(sslConfig.instanceName +
" SSL/TLS: Cert chain key error loading file '" + sslConfig.certKey +
167 }
else if (SSL_CTX_check_private_key(ctx) != 1) {
168 ssl_log_error(sslConfig.instanceName +
" SSL/TLS: Cert chain key error");
170 LOG(TRACE) <<
" " << sslConfig.certKey;
173 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: Cert chain key loaded";
174 LOG(TRACE) <<
" " << sslConfig.certKey;
176 LOG(TRACE) << sslConfig.instanceName <<
" SSL/TLS: Cert chain loaded";
177 LOG(TRACE) <<
" " << sslConfig.cert;
183 if (sslConfig.sslOptions != 0) {
184 SSL_CTX_set_options(ctx, sslConfig.sslOptions);
186 if (!sslConfig.cipherList.empty()) {
187 SSL_CTX_set_cipher_list(ctx, sslConfig.cipherList.c_str());
199 std::map<std::string, SSL_CTX*> sans;
201 if (sslCtx !=
nullptr) {
202 X509* x509 = SSL_CTX_get0_certificate(sslCtx);
203 if (x509 !=
nullptr) {
204 GENERAL_NAMES* subjectAltNames =
205 static_cast<GENERAL_NAMES*>(X509_get_ext_d2i(x509, NID_subject_alt_name,
nullptr,
nullptr));
207#pragma GCC diagnostic push
209#if __has_warning
("-Wused-but-marked-unused")
210#pragma GCC diagnostic ignored "-Wused-but-marked-unused"
214 const int32_t altNameCount = sk_GENERAL_NAME_num(subjectAltNames);
216#pragma GCC diagnostic pop
218 for (int32_t i = 0; i < altNameCount; ++i) {
220#pragma GCC diagnostic push
222#if __has_warning
("-Wused-but-marked-unused")
223#pragma GCC diagnostic ignored "-Wused-but-marked-unused"
227 GENERAL_NAME* generalName = sk_GENERAL_NAME_value(subjectAltNames, i);
229#pragma GCC diagnostic pop
231 if (generalName->type == GEN_DNS || generalName->type == GEN_URI || generalName->type == GEN_EMAIL) {
232 const std::string subjectAltName =
233 std::string(
reinterpret_cast<
const char*>(ASN1_STRING_get0_data(generalName->d.dNSName)),
234 static_cast<std::size_t>(ASN1_STRING_length(generalName->d.dNSName)));
235 sans.insert({subjectAltName, sslCtx});
239#pragma GCC diagnostic push
241#if __has_warning
("-Wused-but-marked-unused")
242#pragma GCC diagnostic ignored "-Wused-but-marked-unused"
246 sk_GENERAL_NAME_pop_free(subjectAltNames, GENERAL_NAME_free);
248#pragma GCC diagnostic pop
263 SSL_CTX* newSslCtx = SSL_set_SSL_CTX(ssl, sslCtx);
264 SSL_clear_options(ssl, 0xFFFFFFFFL);
265 SSL_set_options(ssl, SSL_CTX_get_options(sslCtx));
266 SSL_set_verify(ssl, SSL_CTX_get_verify_mode(sslCtx), SSL_CTX_get_verify_callback(sslCtx));
267 SSL_set_verify_depth(ssl, SSL_CTX_get_verify_depth(sslCtx));
268 SSL_set_mode(ssl, SSL_CTX_get_mode(sslCtx));
281 const unsigned char* ext =
nullptr;
284 size_t server_name_list_len = 0;
285 size_t server_name_len = 0;
287 if (SSL_client_hello_get0_ext(ssl, TLSEXT_TYPE_server_name, &ext, &ext_len) == 0) {
297 server_name_list_len =
static_cast<size_t>((ext[p] << 8) + ext[p + 1]);
299 if (p + server_name_list_len != ext_len) {
304 if (ext[p] != TLSEXT_NAMETYPE_host_name) {
310 server_name_len =
static_cast<size_t>((ext[p] << 8) + ext[p + 1]);
312 if (p + server_name_len != ext_len) {
320 return std::string(
reinterpret_cast<
const char*>(ext + p), ext_len - p);