Fix case where ssl cert does not match key
authorNeel Goyal <ngoyal@fb.com>
Tue, 12 Dec 2017 02:48:49 +0000 (18:48 -0800)
committerFacebook Github Bot <facebook-github-bot@users.noreply.github.com>
Tue, 12 Dec 2017 02:52:42 +0000 (18:52 -0800)
Summary: In some cases, SSLContextManager seg faults if a cert and key do not match.  This guards against that case when strictSSL = false, and throws a more useful error in the cases when SSL is required.

Reviewed By: xybu

Differential Revision: D6513964

fbshipit-source-id: 8e63a22b346fd3f2a30d558a3659ab6794c7a105

folly/io/async/SSLContext.cpp

index 7ce05f44a7a062c974ffe8a65dd17c1bc1293f40..4a95a5723c267e5f715567454416de25675061b8 100644 (file)
@@ -206,7 +206,7 @@ void SSLContext::loadCertificate(const char* path, const char* format) {
          "loadCertificateChain: either <path> or <format> is nullptr");
   }
   if (strcmp(format, "PEM") == 0) {
          "loadCertificateChain: either <path> or <format> is nullptr");
   }
   if (strcmp(format, "PEM") == 0) {
-    if (SSL_CTX_use_certificate_chain_file(ctx_, path) == 0) {
+    if (SSL_CTX_use_certificate_chain_file(ctx_, path) != 1) {
       int errnoCopy = errno;
       std::string reason("SSL_CTX_use_certificate_chain_file: ");
       reason.append(path);
       int errnoCopy = errno;
       std::string reason("SSL_CTX_use_certificate_chain_file: ");
       reason.append(path);
@@ -292,6 +292,9 @@ void SSLContext::loadCertKeyPairFromBufferPEM(
     folly::StringPiece pkey) {
   loadCertificateFromBufferPEM(cert);
   loadPrivateKeyFromBufferPEM(pkey);
     folly::StringPiece pkey) {
   loadCertificateFromBufferPEM(cert);
   loadPrivateKeyFromBufferPEM(pkey);
+  if (!isCertKeyPairValid()) {
+    throw std::runtime_error("SSL certificate and private key do not match");
+  }
 }
 
 void SSLContext::loadCertKeyPairFromFiles(
 }
 
 void SSLContext::loadCertKeyPairFromFiles(
@@ -301,6 +304,9 @@ void SSLContext::loadCertKeyPairFromFiles(
     const char* keyFormat) {
   loadCertificate(certPath, certFormat);
   loadPrivateKey(keyPath, keyFormat);
     const char* keyFormat) {
   loadCertificate(certPath, certFormat);
   loadPrivateKey(keyPath, keyFormat);
+  if (!isCertKeyPairValid()) {
+    throw std::runtime_error("SSL certificate and private key do not match");
+  }
 }
 
 bool SSLContext::isCertKeyPairValid() const {
 }
 
 bool SSLContext::isCertKeyPairValid() const {