Skip to content

Commit

Permalink
openssl: do public key pinning check independently
Browse files Browse the repository at this point in the history
... of the other cert verification checks so that you can set verifyhost
and verifypeer to FALSE and still check the public key.

Bug: http://curl.haxx.se/bug/view.cgi?id=1471
Reported-by: Kyle J. McKay
  • Loading branch information
bagder committed Jan 19, 2015
1 parent fca58f6 commit be57f68
Showing 1 changed file with 7 additions and 5 deletions.
12 changes: 7 additions & 5 deletions lib/vtls/openssl.c
Expand Up @@ -5,7 +5,7 @@
* | (__| |_| | _ <| |___
* \___|\___/|_| \_\_____|
*
* Copyright (C) 1998 - 2014, Daniel Stenberg, <daniel@haxx.se>, et al.
* Copyright (C) 1998 - 2015, Daniel Stenberg, <daniel@haxx.se>, et al.
*
* This software is licensed as described in the file COPYING, which
* you should have received as part of this distribution. The terms
Expand Down Expand Up @@ -2592,6 +2592,10 @@ static CURLcode servercert(struct connectdata *conn,
infof(data, "\t SSL certificate verify ok.\n");
}

if(!strict)
/* when not strict, we don't bother about the verify cert problems */
result = CURLE_OK;

ptr = data->set.str[STRING_SSL_PINNEDPUBLICKEY];
if(!result && ptr) {
result = pkp_pin_peer_pubkey(connssl->server_cert, ptr);
Expand Down Expand Up @@ -2671,10 +2675,8 @@ static CURLcode ossl_connect_step3(struct connectdata *conn, int sockindex)
* operations.
*/

if(!data->set.ssl.verifypeer && !data->set.ssl.verifyhost)
(void)servercert(conn, connssl, FALSE);
else
result = servercert(conn, connssl, TRUE);
result = servercert(conn, connssl,
(data->set.ssl.verifypeer || data->set.ssl.verifyhost));

if(!result)
connssl->connecting_state = ssl_connect_done;
Expand Down

0 comments on commit be57f68

Please sign in to comment.