|
|
- From 5d769ca828fdb055052b3dbc232864bdf2853c9f Mon Sep 17 00:00:00 2001
- From: Remi Gacogne <rgacogne@aquaray.fr>
- Date: Thu, 28 May 2015 16:23:00 +0200
- Subject: [PATCH 12/14] BUG/MEDIUM: ssl: fix tune.ssl.default-dh-param value
- being overwritten
- MIME-Version: 1.0
- Content-Type: text/plain; charset=UTF-8
- Content-Transfer-Encoding: 8bit
-
- Hervé Commowick reported that the logic used to avoid complaining about
- ssl-default-dh-param not being set when static DH params are present
- in the certificate file was clearly wrong when more than one sni_ctx
- is used.
- This patch stores whether static DH params are being used for each
- SSL_CTX individually, and does not overwrite the value of
- tune.ssl.default-dh-param.
- (cherry picked from commit 4f902b88323927c9d25d391a809e3678ac31df41)
- ---
- src/ssl_sock.c | 28 +++++++++++++++++++++++-----
- 1 file changed, 23 insertions(+), 5 deletions(-)
-
- diff --git a/src/ssl_sock.c b/src/ssl_sock.c
- index a78fc6a..0f7819b 100644
- --- a/src/ssl_sock.c
- +++ b/src/ssl_sock.c
- @@ -47,6 +47,9 @@
- #ifdef SSL_CTRL_SET_TLSEXT_STATUS_REQ_CB
- #include <openssl/ocsp.h>
- #endif
- +#ifndef OPENSSL_NO_DH
- +#include <openssl/dh.h>
- +#endif
-
- #include <common/buffer.h>
- #include <common/compat.h>
- @@ -107,6 +110,7 @@ int sslconns = 0;
- int totalsslconns = 0;
-
- #ifndef OPENSSL_NO_DH
- +static int ssl_dh_ptr_index = -1;
- static DH *local_dh_1024 = NULL;
- static DH *local_dh_2048 = NULL;
- static DH *local_dh_4096 = NULL;
- @@ -1076,10 +1080,12 @@ int ssl_sock_load_dh_params(SSL_CTX *ctx, const char *file)
- if (dh) {
- ret = 1;
- SSL_CTX_set_tmp_dh(ctx, dh);
- - /* Setting ssl default dh param to the size of the static DH params
- - found in the file. This way we know that there is no use
- - complaining later about ssl-default-dh-param not being set. */
- - global.tune.ssl_default_dh_param = DH_size(dh) * 8;
- +
- + if (ssl_dh_ptr_index >= 0) {
- + /* store a pointer to the DH params to avoid complaining about
- + ssl-default-dh-param not being set for this SSL_CTX */
- + SSL_CTX_set_ex_data(ctx, ssl_dh_ptr_index, dh);
- + }
- }
- else {
- /* Clear openssl global errors stack */
- @@ -1274,6 +1280,12 @@ static int ssl_sock_load_cert_file(const char *path, struct bind_conf *bind_conf
- * the tree, so it will be discovered and cleaned in time.
- */
- #ifndef OPENSSL_NO_DH
- + /* store a NULL pointer to indicate we have not yet loaded
- + a custom DH param file */
- + if (ssl_dh_ptr_index >= 0) {
- + SSL_CTX_set_ex_data(ctx, ssl_dh_ptr_index, NULL);
- + }
- +
- ret = ssl_sock_load_dh_params(ctx, path);
- if (ret < 0) {
- if (err)
- @@ -1593,7 +1605,9 @@ int ssl_sock_prepare_ctx(struct bind_conf *bind_conf, SSL_CTX *ctx, struct proxy
-
- /* If tune.ssl.default-dh-param has not been set and
- no static DH params were in the certificate file. */
- - if (global.tune.ssl_default_dh_param == 0) {
- + if (global.tune.ssl_default_dh_param == 0 &&
- + (ssl_dh_ptr_index == -1 ||
- + SSL_CTX_get_ex_data(ctx, ssl_dh_ptr_index) == NULL)) {
- ciphers = ctx->cipher_list;
-
- if (ciphers) {
- @@ -4715,6 +4729,10 @@ static void __ssl_sock_init(void)
- bind_register_keywords(&bind_kws);
- srv_register_keywords(&srv_kws);
- cfg_register_keywords(&cfg_kws);
- +
- +#ifndef OPENSSL_NO_DH
- + ssl_dh_ptr_index = SSL_CTX_get_ex_new_index(0, NULL, NULL, NULL, NULL);
- +#endif
- }
-
- __attribute__((destructor))
- --
- 2.0.5
-
|