Changeset: 10dbea2f77bb for MonetDB
URL: https://dev.monetdb.org/hg/MonetDB/rev/10dbea2f77bb
Modified Files:
        clients/mapilib/connect_openssl.c
Branch: monetdburl
Log Message:

Verify the host name in the server certificate


diffs (101 lines):

diff --git a/clients/mapilib/connect_openssl.c 
b/clients/mapilib/connect_openssl.c
--- a/clients/mapilib/connect_openssl.c
+++ b/clients/mapilib/connect_openssl.c
@@ -24,6 +24,7 @@
 #include <stdarg.h>
 #include <openssl/ssl.h>
 #include <openssl/err.h>
+#include <openssl/x509v3.h>
 
 MapiMsg
 croak_openssl(Mapi mid, const char *action, const char *fmt, ...)
@@ -121,7 +122,7 @@ make_ssl_context(Mapi mid, SSL_CTX **ctx
 }
 
 static MapiMsg
-verify_server_certificate_hash(Mapi mid, SSL *ssl, const char *required_prefix)
+verify_server_certificate_hash(Mapi mid, X509 *x509, const char 
*required_prefix)
 {
        mapi_log_record(mid, "CONN", "verifying certificate hash against prefix 
'%s'", required_prefix);
 
@@ -129,10 +130,6 @@ verify_server_certificate_hash(Mapi mid,
        if (prefix_len > 2 * SHA256_DIGEST_LENGTH)
                return mapi_setError(mid, "value of certhash= is longer than a 
sha256 digest", __func__, MERROR);
 
-       X509 *x509 = SSL_get_peer_certificate(ssl);
-       if (x509 == NULL)
-               return mapi_printError(mid, __func__, MERROR, "Server did not 
send a TLS certificate");
-
        // Convert to DER
        unsigned char *buf = NULL;
        int buflen = i2d_X509(x509, &buf);
@@ -175,8 +172,6 @@ verify_server_certificate_hash(Mapi mid,
        mapi_log_record(mid, "CONN", "server certificate matches certhash");
        return MOK;
 }
-
-
 MapiMsg
 wrap_tls(Mapi mid, SOCKET sock)
 {
@@ -264,6 +259,17 @@ wrap_tls(Mapi mid, SOCKET sock)
                return croak_openssl(mid, __func__, "SSL_set_tlsext_host_name");
        }
 
+       X509_VERIFY_PARAM *param = SSL_get0_param(ssl);
+       if (param == NULL) {
+               BIO_free_all(bio);
+               return croak_openssl(mid, __func__, "SSL_get0_param");
+       }
+       X509_VERIFY_PARAM_set_hostflags(param, 
X509_CHECK_FLAG_NO_PARTIAL_WILDCARDS);
+       if (1 != X509_VERIFY_PARAM_set1_host(param, host, strlen(host))) {
+               BIO_free_all(bio);
+               return croak_openssl(mid, __func__, 
"X509_VERIFY_PARAM_set1_host");
+       }
+
        // Temporarily disable the ALPN header.
        // TODO re-enable it when test systemcertificates.py no longer relies
        // on connecting to an HTTPS server. (Which is an ugly hack in the 
first place!)
@@ -289,19 +295,32 @@ wrap_tls(Mapi mid, SOCKET sock)
                }
        }
 
-       // handshake
+       // Handshake.
        if (1 != SSL_connect(ssl)) {
                BIO_free_all(bio);
                return croak_openssl(mid, __func__, "SSL_connect handshake");
        }
 
+       // Verify the server certificate
+       X509 *server_cert = SSL_get_peer_certificate(ssl);
+       if (server_cert == NULL) {
+               BIO_free_all(bio);
+               return croak_openssl(mid, __func__, "Server did not send a 
certificate");
+       }
        if (verify_method == verify_hash) {
                const char *required_prefix = 
msettings_connect_certhash_digits(settings);
-               msg = verify_server_certificate_hash(mid, ssl, required_prefix);
+               msg = verify_server_certificate_hash(mid, server_cert, 
required_prefix);
                if (msg != MOK) {
                        BIO_free_all(bio);
                        return msg;
                }
+       } else {
+               long verify_result = SSL_get_verify_result(ssl);
+               if (verify_result != X509_V_OK) {
+                       BIO_free_all(bio);
+                       const char *error_message = 
X509_verify_cert_error_string(verify_result);
+                       return croak_openssl(mid, __func__, "Invalid server 
certificate: %s", error_message);
+               }
        }
 
        /////////////////////////////////////////////////////////////////////
@@ -341,6 +360,7 @@ wrap_tls(Mapi mid, SOCKET sock)
        }
        // 'rstream' and 'wstream' are part of 'mid' now.
 
+
        mapi_log_record(mid, "CONN", "TLS handshake succeeded");
        return MOK;
 }
_______________________________________________
checkin-list mailing list -- checkin-list@monetdb.org
To unsubscribe send an email to checkin-list-le...@monetdb.org

Reply via email to