• B
    Normalize SNI hostname handling for SSL and SSL_SESSION · 1c4aa31d
    Benjamin Kaduk 提交于
    In particular, adhere to the rule that we must not modify any
    property of an SSL_SESSION object once it is (or might be) in
    a session cache.  Such modifications are thread-unsafe and have
    been observed to cause crashes at runtime.
    
    To effect this change, standardize on the property that
    SSL_SESSION->ext.hostname is set only when that SNI value
    has been negotiated by both parties for use with that session.
    For session resumption this is trivially the case, so only new
    handshakes are affected.
    
    On the client, the new semantics are that the SSL->ext.hostname is
    for storing the value configured by the caller, and this value is
    used when constructing the ClientHello.  On the server, SSL->ext.hostname
    is used to hold the value received from the client.  Only if the
    SNI negotiation is successful will the hostname be stored into the
    session object; the server can do this after it sends the ServerHello,
    and the client after it has received and processed the ServerHello.
    
    This obviates the need to remove the hostname from the session object
    in case of failed negotiation (a change that was introduced in commit
    9fb6cb81 in order to allow TLS 1.3
    early data when SNI was present in the ClientHello but not the session
    being resumed), which was modifying cached sessions in certain cases.
    (In TLS 1.3 we always produce a new SSL_SESSION object for new
    connections, even in the case of resumption, so no TLS 1.3 handshakes
    were affected.)
    Reviewed-by: NMatt Caswell <matt@openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/6378)
    1c4aa31d
extensions.c 59.2 KB