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