Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(31)

Side by Side Diff: net/socket/ssl_client_socket_nss.cc

Issue 8865006: net: move pinning checks into the SSL socket. (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: ... Created 9 years ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « net/socket/ssl_client_socket_nss.h ('k') | net/url_request/url_request_http_job.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright (c) 2011 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2011 The Chromium Authors. All rights reserved.
2 // Use of this source code is governed by a BSD-style license that can be 2 // Use of this source code is governed by a BSD-style license that can be
3 // found in the LICENSE file. 3 // found in the LICENSE file.
4 4
5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived 5 // This file includes code SSLClientSocketNSS::DoVerifyCertComplete() derived
6 // from AuthCertificateCallback() in 6 // from AuthCertificateCallback() in
7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp. 7 // mozilla/security/manager/ssl/src/nsNSSCallbacks.cpp.
8 8
9 /* ***** BEGIN LICENSE BLOCK ***** 9 /* ***** BEGIN LICENSE BLOCK *****
10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1 10 * Version: MPL 1.1/GPL 2.0/LGPL 2.1
(...skipping 48 matching lines...) Expand 10 before | Expand all | Expand 10 after
59 #include <ssl.h> 59 #include <ssl.h>
60 #include <sslerr.h> 60 #include <sslerr.h>
61 #include <sslproto.h> 61 #include <sslproto.h>
62 62
63 #include <algorithm> 63 #include <algorithm>
64 #include <limits> 64 #include <limits>
65 #include <map> 65 #include <map>
66 66
67 #include "base/bind.h" 67 #include "base/bind.h"
68 #include "base/bind_helpers.h" 68 #include "base/bind_helpers.h"
69 #include "base/build_time.h"
69 #include "base/compiler_specific.h" 70 #include "base/compiler_specific.h"
70 #include "base/logging.h" 71 #include "base/logging.h"
71 #include "base/memory/singleton.h" 72 #include "base/memory/singleton.h"
72 #include "base/metrics/histogram.h" 73 #include "base/metrics/histogram.h"
73 #include "base/string_number_conversions.h" 74 #include "base/string_number_conversions.h"
74 #include "base/string_util.h" 75 #include "base/string_util.h"
75 #include "base/stringprintf.h" 76 #include "base/stringprintf.h"
76 #include "base/threading/thread_restrictions.h" 77 #include "base/threading/thread_restrictions.h"
77 #include "base/values.h" 78 #include "base/values.h"
78 #include "crypto/ec_private_key.h" 79 #include "crypto/ec_private_key.h"
(...skipping 10 matching lines...) Expand all
89 #include "net/base/io_buffer.h" 90 #include "net/base/io_buffer.h"
90 #include "net/base/net_errors.h" 91 #include "net/base/net_errors.h"
91 #include "net/base/net_log.h" 92 #include "net/base/net_log.h"
92 #include "net/base/ssl_cert_request_info.h" 93 #include "net/base/ssl_cert_request_info.h"
93 #include "net/base/ssl_connection_status_flags.h" 94 #include "net/base/ssl_connection_status_flags.h"
94 #include "net/base/ssl_info.h" 95 #include "net/base/ssl_info.h"
95 #include "net/base/sys_addrinfo.h" 96 #include "net/base/sys_addrinfo.h"
96 #include "net/base/x509_certificate_net_log_param.h" 97 #include "net/base/x509_certificate_net_log_param.h"
97 #include "net/ocsp/nss_ocsp.h" 98 #include "net/ocsp/nss_ocsp.h"
98 #include "net/socket/client_socket_handle.h" 99 #include "net/socket/client_socket_handle.h"
99 #include "net/socket/dns_cert_provenance_checker.h"
100 #include "net/socket/nss_ssl_util.h" 100 #include "net/socket/nss_ssl_util.h"
101 #include "net/socket/ssl_error_params.h" 101 #include "net/socket/ssl_error_params.h"
102 #include "net/socket/ssl_host_info.h" 102 #include "net/socket/ssl_host_info.h"
103 103
104 #if defined(OS_WIN) 104 #if defined(OS_WIN)
105 #include <windows.h> 105 #include <windows.h>
106 #include <wincrypt.h> 106 #include <wincrypt.h>
107 #elif defined(OS_MACOSX) 107 #elif defined(OS_MACOSX)
108 #include <Security/SecBase.h> 108 #include <Security/SecBase.h>
109 #include <Security/SecCertificate.h> 109 #include <Security/SecCertificate.h>
(...skipping 351 matching lines...) Expand 10 before | Expand all | Expand 10 after
461 handshake_callback_called_(false), 461 handshake_callback_called_(false),
462 completed_handshake_(false), 462 completed_handshake_(false),
463 eset_mitm_detected_(false), 463 eset_mitm_detected_(false),
464 kaspersky_mitm_detected_(false), 464 kaspersky_mitm_detected_(false),
465 predicted_cert_chain_correct_(false), 465 predicted_cert_chain_correct_(false),
466 next_handshake_state_(STATE_NONE), 466 next_handshake_state_(STATE_NONE),
467 nss_fd_(NULL), 467 nss_fd_(NULL),
468 nss_bufs_(NULL), 468 nss_bufs_(NULL),
469 net_log_(transport_socket->socket()->NetLog()), 469 net_log_(transport_socket->socket()->NetLog()),
470 ssl_host_info_(ssl_host_info), 470 ssl_host_info_(ssl_host_info),
471 dns_cert_checker_(context.dns_cert_checker), 471 transport_security_state_(context.transport_security_state),
472 next_proto_status_(kNextProtoUnsupported), 472 next_proto_status_(kNextProtoUnsupported),
473 valid_thread_id_(base::kInvalidThreadId) { 473 valid_thread_id_(base::kInvalidThreadId) {
474 EnterFunction(""); 474 EnterFunction("");
475 } 475 }
476 476
477 SSLClientSocketNSS::~SSLClientSocketNSS() { 477 SSLClientSocketNSS::~SSLClientSocketNSS() {
478 EnterFunction(""); 478 EnterFunction("");
479 Disconnect(); 479 Disconnect();
480 LeaveFunction(""); 480 LeaveFunction("");
481 } 481 }
(...skipping 1232 matching lines...) Expand 10 before | Expand all | Expand 10 after
1714 SECStatus rv; 1714 SECStatus rv;
1715 rv = SSL_RestartHandshakeAfterCertReq(nss_fd_, cert, key, cert_chain); 1715 rv = SSL_RestartHandshakeAfterCertReq(nss_fd_, cert, key, cert_chain);
1716 if (rv != SECSuccess) 1716 if (rv != SECSuccess)
1717 return MapNSSError(PORT_GetError()); 1717 return MapNSSError(PORT_GetError());
1718 1718
1719 GotoState(STATE_HANDSHAKE); 1719 GotoState(STATE_HANDSHAKE);
1720 return OK; 1720 return OK;
1721 } 1721 }
1722 1722
1723 int SSLClientSocketNSS::DoVerifyDNSSEC(int result) { 1723 int SSLClientSocketNSS::DoVerifyDNSSEC(int result) {
1724 if (ssl_config_.dns_cert_provenance_checking_enabled &&
1725 dns_cert_checker_) {
1726 PeerCertificateChain certs(nss_fd_);
1727 dns_cert_checker_->DoAsyncVerification(
1728 host_and_port_.host(), certs.AsStringPieceVector());
1729 }
1730
1731 DNSValidationResult r = CheckDNSSECChain(host_and_port_.host(), 1724 DNSValidationResult r = CheckDNSSECChain(host_and_port_.host(),
1732 server_cert_nss_, 1725 server_cert_nss_,
1733 host_and_port_.port()); 1726 host_and_port_.port());
1734 if (r == DNSVR_SUCCESS) { 1727 if (r == DNSVR_SUCCESS) {
1735 local_server_cert_verify_result_.cert_status |= CERT_STATUS_IS_DNSSEC; 1728 local_server_cert_verify_result_.cert_status |= CERT_STATUS_IS_DNSSEC;
1736 local_server_cert_verify_result_.verified_cert = server_cert_; 1729 local_server_cert_verify_result_.verified_cert = server_cert_;
1737 server_cert_verify_result_ = &local_server_cert_verify_result_; 1730 server_cert_verify_result_ = &local_server_cert_verify_result_;
1738 GotoState(STATE_VERIFY_CERT_COMPLETE); 1731 GotoState(STATE_VERIFY_CERT_COMPLETE);
1739 return OK; 1732 return OK;
1740 } 1733 }
(...skipping 141 matching lines...) Expand 10 before | Expand all | Expand 10 after
1882 // persistently. However, NSS opens a connection to the SQLite database 1875 // persistently. However, NSS opens a connection to the SQLite database
1883 // during NSS initialization and doesn't close the connection until NSS 1876 // during NSS initialization and doesn't close the connection until NSS
1884 // shuts down. If the file system where the database resides is gone, 1877 // shuts down. If the file system where the database resides is gone,
1885 // the database connection goes bad. What's worse, the connection won't 1878 // the database connection goes bad. What's worse, the connection won't
1886 // recover when the file system comes back. Until this NSS or SQLite bug 1879 // recover when the file system comes back. Until this NSS or SQLite bug
1887 // is fixed, we need to avoid using the NSS database for non-essential 1880 // is fixed, we need to avoid using the NSS database for non-essential
1888 // purposes. See https://bugzilla.mozilla.org/show_bug.cgi?id=508081 and 1881 // purposes. See https://bugzilla.mozilla.org/show_bug.cgi?id=508081 and
1889 // http://crbug.com/15630 for more info. 1882 // http://crbug.com/15630 for more info.
1890 1883
1891 // TODO(hclam): Skip logging if server cert was expected to be bad because 1884 // TODO(hclam): Skip logging if server cert was expected to be bad because
1892 // |server_cert_verify_results_| doesn't contain all the information about 1885 // |server_cert_verify_result_| doesn't contain all the information about
1893 // the cert. 1886 // the cert.
1894 if (result == OK) 1887 if (result == OK)
1895 LogConnectionTypeMetrics(); 1888 LogConnectionTypeMetrics();
1896 1889
1897 completed_handshake_ = true; 1890 completed_handshake_ = true;
1898 1891
1899 if (old_user_read_callback_ || !user_read_callback_.is_null()) { 1892 if (old_user_read_callback_ || !user_read_callback_.is_null()) {
1900 int rv = DoReadLoop(OK); 1893 int rv = DoReadLoop(OK);
1901 if (rv != ERR_IO_PENDING) 1894 if (rv != ERR_IO_PENDING)
1902 DoReadCallback(rv); 1895 DoReadCallback(rv);
1903 } 1896 }
1904 1897
1898 //#if defined(OFFICIAL_BUILD) && !defined(OS_ANDROID)
1899 // Take care of any mandates for public key pinning.
1900 //
1901 // Pinning is only enabled for official builds to make sure that others don't
1902 // end up with pins that cannot be easily updated.
1903 //
1904 // TODO(agl): we might have an issue here where a request for foo.example.com
1905 // merges into a SPDY connection to www.example.com, and gets a different
1906 // certificate.
1907
1908 const CertStatus cert_status = server_cert_verify_result_->cert_status;
1909 if ((result == OK || (IsCertificateError(result) &&
1910 IsCertStatusMinorError(cert_status))) &&
1911 server_cert_verify_result_->is_issued_by_known_root &&
1912 transport_security_state_) {
1913 bool sni_available = ssl_config_.tls1_enabled || ssl_config_.ssl3_fallback;
1914 const std::string& host = host_and_port_.host();
1915
1916 TransportSecurityState::DomainState domain_state;
1917 if (transport_security_state_->HasPinsForHost(
1918 &domain_state, host, sni_available)) {
1919 if (!domain_state.IsChainOfPublicKeysPermitted(
1920 server_cert_verify_result_->public_key_hashes)) {
1921 const base::Time build_time = base::GetBuildTime();
1922 // Pins are not enforced if the build is sufficiently old. Chrome
1923 // users should get updates every six weeks or so, but it's possible
1924 // that some users will stop getting updates for some reason. We
1925 // don't want those users building up as a pool of people with bad
1926 // pins.
1927 if ((base::Time::Now() - build_time).InDays() < 70 /* 10 weeks */) {
1928 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1929 UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", false);
1930 TransportSecurityState::ReportUMAOnPinFailure(host);
1931 }
1932 } else {
1933 UMA_HISTOGRAM_BOOLEAN("Net.PublicKeyPinSuccess", true);
1934 }
1935 }
1936 }
1937 //#endif
1938
1905 // Exit DoHandshakeLoop and return the result to the caller to Connect. 1939 // Exit DoHandshakeLoop and return the result to the caller to Connect.
1906 DCHECK(next_handshake_state_ == STATE_NONE); 1940 DCHECK(next_handshake_state_ == STATE_NONE);
1907 return result; 1941 return result;
1908 } 1942 }
1909 1943
1910 int SSLClientSocketNSS::DoPayloadRead() { 1944 int SSLClientSocketNSS::DoPayloadRead() {
1911 EnterFunction(user_read_buf_len_); 1945 EnterFunction(user_read_buf_len_);
1912 DCHECK(user_read_buf_); 1946 DCHECK(user_read_buf_);
1913 DCHECK_GT(user_read_buf_len_, 0); 1947 DCHECK_GT(user_read_buf_len_, 0);
1914 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_); 1948 int rv = PR_Read(nss_fd_, user_read_buf_->data(), user_read_buf_len_);
(...skipping 839 matching lines...) Expand 10 before | Expand all | Expand 10 after
2754 valid_thread_id_ = base::PlatformThread::CurrentId(); 2788 valid_thread_id_ = base::PlatformThread::CurrentId();
2755 } 2789 }
2756 2790
2757 bool SSLClientSocketNSS::CalledOnValidThread() const { 2791 bool SSLClientSocketNSS::CalledOnValidThread() const {
2758 EnsureThreadIdAssigned(); 2792 EnsureThreadIdAssigned();
2759 base::AutoLock auto_lock(lock_); 2793 base::AutoLock auto_lock(lock_);
2760 return valid_thread_id_ == base::PlatformThread::CurrentId(); 2794 return valid_thread_id_ == base::PlatformThread::CurrentId();
2761 } 2795 }
2762 2796
2763 } // namespace net 2797 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket_nss.h ('k') | net/url_request/url_request_http_job.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698