• M
    Fix SSL_VERIFY_CLIENT_ONCE · a03a9dbe
    Matt Caswell 提交于
    The flag SSL_VERIFY_CLIENT_ONCE is documented as follows:
    
      B<Server mode:> only request a client certificate on the initial TLS/SSL
      handshake. Do not ask for a client certificate again in case of a
      renegotiation. This flag must be used together with SSL_VERIFY_PEER.
    
      B<Client mode:> ignored
    
    But the implementation actually did nothing. After the server sends its
    ServerKeyExchange message, the code was checking s->session->peer to see if
    it is NULL. If it was set then it did not ask for another client
    certificate. However s->session->peer will only be set in the event of a
    resumption, but a ServerKeyExchange message is only sent in the event of a
    full handshake (i.e. no resumption).
    
    The documentation suggests that the original intention was for this to
    have an effect on renegotiation, and resumption doesn't come into it.
    
    The fix is to properly check for renegotiation, not whether there is already
    a client certificate in the session.
    
    As far as I can tell this has been broken for a *long* time.
    Reviewed-by: NRichard Levitte <levitte@openssl.org>
    (Merged from https://github.com/openssl/openssl/pull/1982)
    a03a9dbe
statem_srvr.c 114.2 KB