'session_tickets off' option for TLS 1.3

Maxim Dounin mdounin at mdounin.ru
Mon Apr 13 00:39:29 UTC 2020


Hello!

On Sun, Apr 12, 2020 at 10:12:48PM +0300, Alexander Smirnov wrote:

> I have found that in TLS 1.3 mode nginx doesn't fully disable session
> tickets even with
> 
> session_tickets off;
> 
> According to https://www.openssl.org/docs/man1.1.1/man3/SSL_get_options.html
> 
> 
> SSL_CTX_set_options(conf->ssl.ctx, SSL_OP_NO_TICKET);
> 
> is not enough to disable session tickets. It only disables stateless
> tickets but preserves stateful ones.
> 
> It can be easily verified with
> 
> openssl s_client -connect localhost:443
> 
> Nginx still returns session tickets.
> 
> To fully disable tickets
> 
> SSL_CTX_set_num_tickets(conf->ssl.ctx, 0);
> 
> should also be called.
> 
> I am not sure on changes. Not sure if I fully understand your intentions on
> this nginx behaviour. Could you please review the proposed patch ?

In TLS 1.3, a separate field for session identifiers was removed, 
and TLS session tickets are used instead.  "Stateful" tickets are 
essentially what is called "sessions" in TLS 1.2 and before.

Since most configuration with disabled tickets rely on session 
resumption to work via session identifiers, disabling session 
tickets completely in TLS 1.3 due to "ssl_session_tickets off;" in 
the configuration is not a good idea.  And this is essentially why 
SSL_OP_NO_TICKET does not disable tickets completely as well - 
instead, it only disables stateless tickets, which is what was 
used to be known as "tickets" in TLS 1.2 and before.

If for some reason you really want to disable session resumption 
in TLS 1.3 completely, you may do so in the same way it can be 
done for previous protocols: by using "ssl_session_cache off; 
ssl_session_tickets off;".  This results in

    SSL_CTX_set_session_cache_mode(ctx, SSL_SESS_CACHE_OFF);
    SSL_CTX_set_options(ctx, SSL_OP_NO_TICKET);

on the SSL context, so it should be enough for the OpenSSL library to 
understand that neither stateful nor stateless tickets should be 
used.  Currently it still sends meaningless stateless tickets, not 
sure why, but probably this is something to be addressed in 
OpenSSL, not nginx.

-- 
Maxim Dounin
http://mdounin.ru/


More information about the nginx-devel mailing list