| Index: net/socket/ssl_client_socket_openssl.cc
|
| diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc
|
| index 3f01db21b342cfdcb0181e56391a195ffe3bbeed..62f3dbbb646fee8b14e2f054a7887a5b0f95b675 100644
|
| --- a/net/socket/ssl_client_socket_openssl.cc
|
| +++ b/net/socket/ssl_client_socket_openssl.cc
|
| @@ -10,10 +10,10 @@
|
| #include <openssl/ssl.h>
|
| #include <openssl/err.h>
|
|
|
| -#include "net/base/cert_verifier.h"
|
| #include "base/metrics/histogram.h"
|
| +#include "base/openssl_util.h"
|
| +#include "net/base/cert_verifier.h"
|
| #include "net/base/net_errors.h"
|
| -#include "net/base/openssl_util.h"
|
| #include "net/base/ssl_connection_status_flags.h"
|
| #include "net/base/ssl_info.h"
|
|
|
| @@ -58,6 +58,29 @@ int MapOpenSSLError(int err) {
|
| }
|
| }
|
|
|
| +// We do certificate verification after handshake, so we disable the default
|
| +// by registering a no-op verify function.
|
| +int NoOpVerifyCallback(X509_STORE_CTX*, void *) {
|
| + DVLOG(3) << "skipping cert verify";
|
| + return 1;
|
| +}
|
| +
|
| +struct SSLContextSingletonTraits : public DefaultSingletonTraits<SSL_CTX> {
|
| + static SSL_CTX* New() {
|
| + base::EnsureOpenSSLInit();
|
| + SSL_CTX* self = SSL_CTX_new(SSLv23_client_method());
|
| + SSL_CTX_set_cert_verify_callback(self, NoOpVerifyCallback, NULL);
|
| + return self;
|
| + }
|
| + static void Delete(SSL_CTX* self) {
|
| + SSL_CTX_free(self);
|
| + }
|
| +};
|
| +
|
| +SSL_CTX* GetSSLContext() {
|
| + return Singleton<SSL_CTX, SSLContextSingletonTraits>::get();
|
| +}
|
| +
|
| } // namespace
|
|
|
| SSLClientSocketOpenSSL::SSLClientSocketOpenSSL(
|
| @@ -93,7 +116,7 @@ bool SSLClientSocketOpenSSL::Init() {
|
| DCHECK(!ssl_);
|
| DCHECK(!transport_bio_);
|
|
|
| - ssl_ = SSL_new(GetOpenSSLInitSingleton()->ssl_ctx());
|
| + ssl_ = SSL_new(GetSSLContext());
|
| if (!ssl_) {
|
| MaybeLogSSLError();
|
| return false;
|
| @@ -394,8 +417,7 @@ void SSLClientSocketOpenSSL::InvalidateSessionIfBadCertificate() {
|
| // see SSL_CTX_set_session_cache_mode(SSL_SESS_CACHE_CLIENT).
|
| SSL_SESSION* session = SSL_get_session(ssl_);
|
| LOG_IF(ERROR, session) << "Connection has a session?? " << session;
|
| - int rv = SSL_CTX_remove_session(GetOpenSSLInitSingleton()->ssl_ctx(),
|
| - session);
|
| + int rv = SSL_CTX_remove_session(GetSSLContext(), session);
|
| LOG_IF(ERROR, rv) << "Session was cached?? " << rv;
|
| }
|
| }
|
| @@ -404,7 +426,7 @@ X509Certificate* SSLClientSocketOpenSSL::UpdateServerCert() {
|
| if (server_cert_)
|
| return server_cert_;
|
|
|
| - ScopedSSL<X509, X509_free> cert(SSL_get_peer_certificate(ssl_));
|
| + base::ScopedOpenSSL<X509, X509_free> cert(SSL_get_peer_certificate(ssl_));
|
| if (!cert.get()) {
|
| LOG(WARNING) << "SSL_get_peer_certificate returned NULL";
|
| return NULL;
|
|
|