Re: Возможность собрать современную версию nginx и openssl с поддержкой ssl renegotiation

Maxim Dounin mdounin at mdounin.ru
Mon Jul 6 14:05:14 UTC 2015


Hello!

On Tue, Jun 23, 2015 at 01:19:46PM -0400, AterCattus wrote:

> Всем привет.
> 
> Возникла необходимость взаимодействия с сервером, использующего ssl
> renegotiation. А в качестве промежуточного звена отлично подошел бы nginx с
> его proxy_pass и proxy_ssl_certificate* + proxy_ssl_trusted_certificate. Но
> соответствующий функционал убран еще в 0.8.23.
> Можно ли как-то достучаться до такого сервера из nginx?
> Правка event/ngx_event_openssl.c не помогает - nginx перестает ругаться на
> "SSL renegotiation disabled", но все-равно запрос не проходит.
> 
> Да, я понимаю, что не просто так это было убрано, но внешний сервер работает
> только так. Вопрос безопасности оставляю вне данного вопроса.

В принципе, с бекендами можно и разрешить, проблем быть не должно.

Правка src/event/ngx_event_openssl.c должна помогать, если не 
помогает - значит, недоправили.

Как-то так должно быть достаточно (untested):

# User Maxim Dounin <mdounin at mdounin.ru>
# Date 1436191454 -10800
#      Mon Jul 06 17:04:14 2015 +0300
# Node ID 33e62c32b9d602700a3cd48955067668fe9a86ab
# Parent  137a5031414793ce42e5b0741d2815372ef12a73
SSL: enabled renegotiation with upstream servers.

diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -704,7 +704,7 @@ ngx_ssl_info_callback(const ngx_ssl_conn
     if (where & SSL_CB_HANDSHAKE_START) {
         c = ngx_ssl_get_connection((ngx_ssl_conn_t *) ssl_conn);
 
-        if (c->ssl->handshaked) {
+        if (c->ssl->server && c->ssl->handshaked) {
             c->ssl->renegotiation = 1;
             ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0, "SSL renegotiation");
         }
@@ -1055,6 +1055,7 @@ ngx_ssl_create_connection(ngx_ssl_t *ssl
 
     } else {
         SSL_set_accept_state(sc->connection);
+        sc->server = 1;
     }
 
     if (SSL_set_ex_data(sc->connection, ngx_ssl_connection_index, c) == 0) {
@@ -1161,7 +1162,7 @@ ngx_ssl_handshake(ngx_connection_t *c)
 #ifdef SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS
 
         /* initial handshake done, disable renegotiation (CVE-2009-3555) */
-        if (c->ssl->connection->s3) {
+        if (c->ssl->server && c->ssl->connection->s3) {
             c->ssl->connection->s3->flags |= SSL3_FLAGS_NO_RENEGOTIATE_CIPHERS;
         }
 
diff --git a/src/event/ngx_event_openssl.h b/src/event/ngx_event_openssl.h
--- a/src/event/ngx_event_openssl.h
+++ b/src/event/ngx_event_openssl.h
@@ -58,6 +58,7 @@ typedef struct {
 
     unsigned                    handshaked:1;
     unsigned                    renegotiation:1;
+    unsigned                    server:1;
     unsigned                    buffer:1;
     unsigned                    no_wait_shutdown:1;
     unsigned                    no_send_shutdown:1;


-- 
Maxim Dounin
http://nginx.org/



Подробная информация о списке рассылки nginx-ru