Author: gsim
Date: Tue Jun 24 16:15:34 2014
New Revision: 1605127

URL: http://svn.apache.org/r1605127
Log:
QPID-5841: allow SSL hostname verification failure to be ignored (with NSS)

Modified:
    qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h
    qpid/trunk/qpid/cpp/src/qpid/client/SslConnector.cpp
    qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/ConnectionOptions.cpp
    qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SslTransport.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.cpp
    qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.h

Modified: qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.cpp Tue Jun 24 
16:15:34 2014
@@ -41,7 +41,8 @@ ConnectionSettings::ConnectionSettings()
     service(qpid::saslName),
     minSsf(0),
     maxSsf(256),
-    sslCertName("")
+    sslCertName(""),
+    sslIgnoreHostnameVerificationFailure(false)
 {}
 
 ConnectionSettings::~ConnectionSettings() {}

Modified: qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/ConnectionSettings.h Tue Jun 24 
16:15:34 2014
@@ -133,6 +133,11 @@ struct QPID_CLIENT_CLASS_EXTERN Connecti
      * Passed as client-propreties on opening the connecction.
      */
     framing::FieldTable clientProperties;
+
+    /**
+     * If using SSL, connect regardless of hostname verification failure.
+     */
+    bool sslIgnoreHostnameVerificationFailure;
 };
 
 }} // namespace qpid::client

Modified: qpid/trunk/qpid/cpp/src/qpid/client/SslConnector.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/SslConnector.cpp?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/SslConnector.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/SslConnector.cpp Tue Jun 24 16:15:34 
2014
@@ -183,6 +183,9 @@ SslConnector::SslConnector(Poller::share
         QPID_LOG(debug, "ssl-cert-name = " << settings.sslCertName);
         socket.setCertName(settings.sslCertName);
     }
+    if (settings.sslIgnoreHostnameVerificationFailure) {
+        socket.ignoreHostnameVerificationFailure();
+    }
 }
 
 SslConnector::~SslConnector() {

Modified: qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/client/amqp0_10/ConnectionImpl.cpp Tue Jun 24 
16:15:34 2014
@@ -155,6 +155,8 @@ void ConnectionImpl::setOption(const std
         settings.protocol = value.asString();
     } else if (name == "ssl-cert-name" || name == "ssl_cert_name") {
         settings.sslCertName = value.asString();
+    } else if (name == "ssl-ignore-hostname-verification-failure" || name == 
"ssl_ignore_hostname_verification_failure") {
+        settings.sslIgnoreHostnameVerificationFailure = value;
     } else if (name == "x-reconnect-on-limit-exceeded" || name == 
"x_reconnect_on_limit_exceeded") {
         reconnectOnLimitExceeded = value;
     } else if (name == "client-properties" || name == "client_properties") {

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/ConnectionOptions.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/ConnectionOptions.cpp?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/ConnectionOptions.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/ConnectionOptions.cpp Tue Jun 24 
16:15:34 2014
@@ -111,6 +111,8 @@ void ConnectionOptions::set(const std::s
         protocol = value.asString();
     } else if (name == "ssl-cert-name" || name == "ssl_cert_name") {
         sslCertName = value.asString();
+    } else if (name == "ssl-ignore-hostname-verification-failure" || name == 
"ssl_ignore_hostname_verification_failure") {
+        sslIgnoreHostnameVerificationFailure = value;
     } else if (name == "x-reconnect-on-limit-exceeded" || name == 
"x_reconnect_on_limit_exceeded") {
         reconnectOnLimitExceeded = value;
     } else if (name == "container-id" || name == "container_id") {

Modified: qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SslTransport.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SslTransport.cpp?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SslTransport.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/messaging/amqp/SslTransport.cpp Tue Jun 24 
16:15:34 2014
@@ -60,6 +60,9 @@ SslTransport::SslTransport(TransportCont
         QPID_LOG(debug, "ssl-cert-name = " << options->sslCertName);
         socket.setCertName(options->sslCertName);
     }
+    if (options->sslIgnoreHostnameVerificationFailure) {
+        socket.ignoreHostnameVerificationFailure();
+    }
 }
 
 void SslTransport::connect(const std::string& host, const std::string& port)

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.cpp
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.cpp?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.cpp (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.cpp Tue Jun 24 16:15:34 2014
@@ -45,6 +45,7 @@
 #include <pk11pub.h>
 #include <ssl.h>
 #include <key.h>
+#include <sslerr.h>
 
 #include <boost/format.hpp>
 
@@ -83,7 +84,7 @@ std::string getDomainFromSubject(std::st
 }
 
 SslSocket::SslSocket(const std::string& certName, bool clientAuth) :
-    nssSocket(0), certname(certName), prototype(0)
+    nssSocket(0), certname(certName), prototype(0), hostnameVerification(true)
 {
     //configure prototype socket:
     prototype = SSL_ImportFD(0, PR_NewTCPSocket());
@@ -105,6 +106,11 @@ SslSocket::SslSocket(int fd, PRFileDesc*
     NSS_CHECK(SSL_ResetHandshake(nssSocket, PR_TRUE));
 }
 
+void SslSocket::ignoreHostnameVerificationFailure()
+{
+    hostnameVerification = false;
+}
+
 void SslSocket::setNonblocking() const
 {
     if (!nssSocket) {
@@ -134,6 +140,18 @@ void SslSocket::connect(const SocketAddr
     BSDSocket::connect(addr);
 }
 
+namespace {
+SECStatus bad_certificate(void* arg, PRFileDesc* /*fd*/) {
+    switch (PR_GetError()) {
+      case SSL_ERROR_BAD_CERT_DOMAIN:
+        QPID_LOG(info, "Ignoring hostname verification failure for " << (const 
char*) arg);
+        return SECSuccess;
+      default:
+        return SECFailure;
+    }
+}
+}
+
 void SslSocket::finishConnect(const SocketAddress& addr) const
 {
     nssSocket = SSL_ImportFD(0, PR_ImportTCPSocket(fd));
@@ -150,6 +168,9 @@ void SslSocket::finishConnect(const Sock
     NSS_CHECK(SSL_GetClientAuthDataHook(nssSocket, NSS_GetClientAuthData, 
arg));
 
     url = addr.getHost();
+    if (!hostnameVerification) {
+        NSS_CHECK(SSL_BadCertHook(nssSocket, bad_certificate, 
const_cast<char*>(url.data())));
+    }
     NSS_CHECK(SSL_SetURL(nssSocket, url.data()));
 
     NSS_CHECK(SSL_ResetHandshake(nssSocket, PR_FALSE));

Modified: qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.h
URL: 
http://svn.apache.org/viewvc/qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.h?rev=1605127&r1=1605126&r2=1605127&view=diff
==============================================================================
--- qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.h (original)
+++ qpid/trunk/qpid/cpp/src/qpid/sys/ssl/SslSocket.h Tue Jun 24 16:15:34 2014
@@ -45,6 +45,9 @@ public:
      */
     SslSocket(const std::string& certName = "", bool clientAuth = false);
 
+    /** Proceed with connect inspite of hostname verifcation failures*/
+    void ignoreHostnameVerificationFailure();
+
     /** Set socket non blocking */
     void setNonblocking() const;
 
@@ -92,6 +95,7 @@ protected:
      * in accept to pass through to newly created socket instances.
      */
     mutable PRFileDesc* prototype;
+    bool hostnameVerification;
 
     SslSocket(int fd, PRFileDesc* model);
     friend class SslMuxSocket; // Needed for this constructor



---------------------------------------------------------------------
To unsubscribe, e-mail: [email protected]
For additional commands, e-mail: [email protected]

Reply via email to