X-Git-Url: https://vcs.fsf.org/?p=exim.git;a=blobdiff_plain;f=src%2Fsrc%2Ftls-openssl.c;h=08b92bae56f9e3023ed88f804a71d4a97704b6a0;hp=64aa689fb74ab727a0cee93b0c1538d720afb645;hb=d4f09789499b5a665a0e79d6ed0086806fc7b648;hpb=ec4b68e5d820109e5954329013a911d4032bc4dc diff --git a/src/src/tls-openssl.c b/src/src/tls-openssl.c index 64aa689fb..08b92bae5 100644 --- a/src/src/tls-openssl.c +++ b/src/src/tls-openssl.c @@ -46,13 +46,31 @@ static BOOL client_verify_callback_called = FALSE; static BOOL server_verify_callback_called = FALSE; static const uschar *sid_ctx = US"exim"; +/* We have three different contexts to care about. + +Simple case: client, `client_ctx` + As a client, we can be doing a callout or cut-through delivery while receiving + a message. So we have a client context, which should have options initialised + from the SMTP Transport. + +Server: + There are two cases: with and without ServerNameIndication from the client. + Given TLS SNI, we can be using different keys, certs and various other + configuration settings, because they're re-expanded with $tls_sni set. This + allows vhosting with TLS. This SNI is sent in the handshake. + A client might not send SNI, so we need a fallback, and an initial setup too. + So as a server, we start out using `server_ctx`. + If SNI is sent by the client, then we as server, mid-negotiation, try to clone + `server_sni` from `server_ctx` and then initialise settings by re-expanding + configuration. +*/ + static SSL_CTX *client_ctx = NULL; static SSL_CTX *server_ctx = NULL; static SSL *client_ssl = NULL; static SSL *server_ssl = NULL; #ifdef EXIM_HAVE_OPENSSL_TLSEXT -static SSL_CTX *client_sni = NULL; static SSL_CTX *server_sni = NULL; #endif @@ -671,7 +689,7 @@ if (cbinfo->server_cipher_list) if (cbinfo->ocsp_file) { SSL_CTX_set_tlsext_status_cb(server_sni, tls_stapling_cb); - SSL_CTX_set_tlsext_status_arg(ctx, cbinfo); + SSL_CTX_set_tlsext_status_arg(server_ctx, cbinfo); } #endif @@ -726,7 +744,7 @@ response_der_len = i2d_OCSP_RESPONSE(cbinfo->ocsp_response, &response_der); if (response_der_len <= 0) return SSL_TLSEXT_ERR_NOACK; -SSL_set_tlsext_status_ocsp_resp(ssl, response_der, response_der_len); +SSL_set_tlsext_status_ocsp_resp(server_ssl, response_der, response_der_len); return SSL_TLSEXT_ERR_OK; } @@ -870,8 +888,8 @@ if (host == NULL) callback is invoked. */ if (cbinfo->ocsp_file) { - SSL_CTX_set_tlsext_status_cb(ctx, tls_stapling_cb); - SSL_CTX_set_tlsext_status_arg(ctx, cbinfo); + SSL_CTX_set_tlsext_status_cb(server_ctx, tls_stapling_cb); + SSL_CTX_set_tlsext_status_arg(server_ctx, cbinfo); } #endif /* We always do this, so that $tls_sni is available even if not used in