diff options
Diffstat (limited to 'tcpd/libcouriertls.c')
| -rw-r--r-- | tcpd/libcouriertls.c | 43 | 
1 files changed, 39 insertions, 4 deletions
| diff --git a/tcpd/libcouriertls.c b/tcpd/libcouriertls.c index 3ab335e..81ef3e2 100644 --- a/tcpd/libcouriertls.c +++ b/tcpd/libcouriertls.c @@ -488,6 +488,9 @@ static int client_cert_cb(ssl_handle ssl, X509 **x509, EVP_PKEY **pkey)  	return rc;  } +static SSL_CTX *tls_create_int(int isserver, const struct tls_info *info, +			       int internal); +  static int server_cert_cb(ssl_handle ssl, int *ad, void *arg)  {  #ifdef HAVE_OPENSSL_SNI @@ -522,15 +525,42 @@ static int server_cert_cb(ssl_handle ssl, int *ad, void *arg)  	}  	if (access(buffer, R_OK) == 0) -		read_certfile(SSL_get_SSL_CTX(ssl), buffer, &cert_file_flags); +	{ +		SSL_CTX *orig_ctx=SSL_get_SSL_CTX(ssl); +		SSL_CTX *temp_ctx=tls_create_int(1, info, 1); +		int rc; +		if (!temp_ctx) +		{ +			(*info->tls_err_msg)("Cannot load certificate file", +					     info->app_data); +			exit(1); +		} +		SSL_set_SSL_CTX(ssl, temp_ctx); +		rc=read_certfile(orig_ctx, buffer, &cert_file_flags); +		SSL_set_SSL_CTX(ssl, orig_ctx); +		tls_destroy(temp_ctx); +		if (!rc) +		{ +			(*info->tls_err_msg)("Cannot load certificate file", +					     info->app_data); +			exit(1); +		} +	}  	free(buffer); +  #endif  	return SSL_TLSEXT_ERR_OK;  }  SSL_CTX *tls_create(int isserver, const struct tls_info *info)  { +	return tls_create_int(isserver, info, 0); +} + +SSL_CTX *tls_create_int(int isserver, const struct tls_info *info, +			int internal) +{  	SSL_CTX *ctx;  	const char *protocol=safe_getenv(info, "TLS_PROTOCOL");  	const char *ssl_cipher_list=safe_getenv(info, "TLS_CIPHER_LIST"); @@ -644,8 +674,15 @@ SSL_CTX *tls_create(int isserver, const struct tls_info *info)  #endif  #endif  	info_copy->tlscache=NULL; -	init_session_cache(info_copy, ctx); +	if (internal) +	{ +		SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF); +	} +	else +	{ +		init_session_cache(info_copy, ctx); +	}  	s = safe_getenv(info, "TCPLOCALIP"); @@ -662,8 +699,6 @@ SSL_CTX *tls_create(int isserver, const struct tls_info *info)  		return (NULL);  	} -	SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_BOTH); -  	n=atoi(safe_getenv(info, "TLS_INTCACHESIZE"));  	if (n > 0) | 
