[PATCH] SSL: shutdown cleanly when other endpoint starts shutdown
Maxim Dounin
mdounin at mdounin.ru
Mon Dec 7 18:31:18 UTC 2015
Hello!
On Sat, Dec 05, 2015 at 07:17:54AM +0000, Judson Wilson wrote:
> # HG changeset patch
> # User Judson Wilson <wilson.judson at gmail.com>
> # Date 1449296759 0
> # Sat Dec 05 06:25:59 2015 +0000
> # Node ID f41799d322f02c8998a800953d81e7274a9d3376
> # Parent cb31017e961b4a54e83c4fc1be46c18842696207
> SSL: shutdown cleanly when other endpoint starts shutdown
>
> Before this change, if the other endpoint sends an SSL close_notify, nginx
> will kill the SSL connection without sending a close_notify in response.
> This behavior does not follow RFC 5246 section 7.2.1:
>
> Unless some other fatal alert has been transmitted, each party is
> required to send a close_notify alert before closing the write side
> of the connection.
>
> This change fixes this behavior in this specific situation, causing
> nginx to reply with a close_notify before shutting down the conneciton.
>
> diff -r cb31017e961b -r f41799d322f0 src/event/ngx_event_openssl.c
> --- a/src/event/ngx_event_openssl.c Wed Dec 02 19:17:19 2015 -0800
> +++ b/src/event/ngx_event_openssl.c Sat Dec 05 06:25:59 2015 +0000
> @@ -1472,7 +1472,6 @@
> }
>
> c->ssl->no_wait_shutdown = 1;
> - c->ssl->no_send_shutdown = 1;
>
> if (sslerr == SSL_ERROR_ZERO_RETURN || ERR_peek_error() == 0) {
> ngx_log_debug0(NGX_LOG_DEBUG_EVENT, c->log, 0,
> @@ -1480,6 +1479,8 @@
> return NGX_DONE;
> }
>
> + c->ssl->no_send_shutdown = 1;
> +
> ngx_ssl_connection_error(c, sslerr, err, "SSL_read() failed");
>
> return NGX_ERROR;
There is a problem with this change: in most cases in practice
close from a client means that the socket is no longer open, and
trying to send a close_notify alert won't do anything good but
will result in RST instead. Common practice seems to be don't
send close_notify alerts in such a case (e.g., I see Chrome doing
the same), and section 7.2.1 mentions this as well.
Note well that section 7.2.1 you refer to is about avoiding
truncation attacks. On the other hand, the code path you are
editing doesn't ensure that a close_notify notify alert was
received from the other side. That is, sending a close_notify
alert will make truncation attacks easier, not stop them.
If you still think that changes in this area are needed - please
provide some more details on what you are trying to fix.
--
Maxim Dounin
http://nginx.org/
More information about the nginx-devel
mailing list