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

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

Issue 4408001: net: Make Snap Start check cert verification and add metrics (Closed) Base URL: svn://svn.chromium.org/chrome/trunk/src
Patch Set: Created 10 years, 1 month 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
OLDNEW
1 // Copyright (c) 2010 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2010 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 462 matching lines...) Expand 10 before | Expand all | Expand 10 after
473 if (!ssl_host_info_.get()) 473 if (!ssl_host_info_.get())
474 return; 474 return;
475 475
476 SECStatus rv; 476 SECStatus rv;
477 SSLSnapStartResult snap_start_type; 477 SSLSnapStartResult snap_start_type;
478 rv = SSL_GetSnapStartResult(nss_fd_, &snap_start_type); 478 rv = SSL_GetSnapStartResult(nss_fd_, &snap_start_type);
479 if (rv != SECSuccess) { 479 if (rv != SECSuccess) {
480 NOTREACHED(); 480 NOTREACHED();
481 return; 481 return;
482 } 482 }
483 net_log_.AddEvent(NetLog::TYPE_SSL_SNAP_START,
484 new NetLogIntegerParameter("type", snap_start_type));
483 LOG(ERROR) << "Snap Start: " << snap_start_type << " " << hostname_; 485 LOG(ERROR) << "Snap Start: " << snap_start_type << " " << hostname_;
484 if (snap_start_type == SSL_SNAP_START_FULL || 486 if (snap_start_type == SSL_SNAP_START_FULL ||
485 snap_start_type == SSL_SNAP_START_RESUME) { 487 snap_start_type == SSL_SNAP_START_RESUME) {
486 // If we did a successful Snap Start then our information was correct and 488 // If we did a successful Snap Start then our information was correct and
487 // there's no point saving it again. 489 // there's no point saving it again.
488 return; 490 return;
489 } 491 }
490 492
491 const unsigned char* hello_data; 493 const unsigned char* hello_data;
492 unsigned hello_data_len; 494 unsigned hello_data_len;
(...skipping 243 matching lines...) Expand 10 before | Expand all | Expand 10 after
736 ssl_config_.false_start_enabled && 738 ssl_config_.false_start_enabled &&
737 !SSLConfigService::IsKnownFalseStartIncompatibleServer(hostname_)); 739 !SSLConfigService::IsKnownFalseStartIncompatibleServer(hostname_));
738 if (rv != SECSuccess) 740 if (rv != SECSuccess)
739 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START"); 741 LogFailedNSSFunction(net_log_, "SSL_OptionSet", "SSL_ENABLE_FALSE_START");
740 #endif 742 #endif
741 743
742 #ifdef SSL_ENABLE_SNAP_START 744 #ifdef SSL_ENABLE_SNAP_START
743 // TODO(agl): check that SSL_ENABLE_SNAP_START actually does something in the 745 // TODO(agl): check that SSL_ENABLE_SNAP_START actually does something in the
744 // current NSS code. 746 // current NSS code.
745 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SNAP_START, 747 rv = SSL_OptionSet(nss_fd_, SSL_ENABLE_SNAP_START,
746 SSLConfigService::snap_start_enabled()); 748 ssl_config_.snap_start_enabled);
747 if (rv != SECSuccess) 749 if (rv != SECSuccess)
748 VLOG(1) << "SSL_ENABLE_SNAP_START failed. Old system nss?"; 750 VLOG(1) << "SSL_ENABLE_SNAP_START failed. Old system nss?";
749 #endif 751 #endif
750 752
751 #ifdef SSL_ENABLE_RENEGOTIATION 753 #ifdef SSL_ENABLE_RENEGOTIATION
752 // Deliberately disable this check for now: http://crbug.com/55410 754 // Deliberately disable this check for now: http://crbug.com/55410
753 if (false && 755 if (false &&
754 SSLConfigService::IsKnownStrictTLSServer(hostname_) && 756 SSLConfigService::IsKnownStrictTLSServer(hostname_) &&
755 !ssl_config_.mitm_proxies_allowed) { 757 !ssl_config_.mitm_proxies_allowed) {
756 rv = SSL_OptionSet(nss_fd_, SSL_REQUIRE_SAFE_NEGOTIATION, PR_TRUE); 758 rv = SSL_OptionSet(nss_fd_, SSL_REQUIRE_SAFE_NEGOTIATION, PR_TRUE);
(...skipping 1085 matching lines...) Expand 10 before | Expand all | Expand 10 after
1842 1844
1843 that->handshake_callback_called_ = true; 1845 that->handshake_callback_called_ = true;
1844 1846
1845 that->UpdateServerCert(); 1847 that->UpdateServerCert();
1846 that->UpdateConnectionStatus(); 1848 that->UpdateConnectionStatus();
1847 } 1849 }
1848 1850
1849 int SSLClientSocketNSS::DoSnapStartLoadInfo() { 1851 int SSLClientSocketNSS::DoSnapStartLoadInfo() {
1850 EnterFunction(""); 1852 EnterFunction("");
1851 int rv = ssl_host_info_->WaitForDataReady(&handshake_io_callback_); 1853 int rv = ssl_host_info_->WaitForDataReady(&handshake_io_callback_);
1854 GotoState(STATE_HANDSHAKE);
1852 1855
1853 if (rv == OK) { 1856 if (rv == OK) {
1854 if (LoadSnapStartInfo()) { 1857 if (ssl_host_info_->WaitForCertVerification(NULL) == OK) {
1855 pseudo_connected_ = true; 1858 if (LoadSnapStartInfo()) {
1856 GotoState(STATE_SNAP_START_WAIT_FOR_WRITE); 1859 pseudo_connected_ = true;
1857 if (user_connect_callback_) 1860 GotoState(STATE_SNAP_START_WAIT_FOR_WRITE);
1858 DoConnectCallback(OK); 1861 if (user_connect_callback_)
1859 } else { 1862 DoConnectCallback(OK);
1860 GotoState(STATE_HANDSHAKE); 1863 }
1864 } else if (!ssl_host_info_->state().server_hello.empty()) {
1865 // A non-empty ServerHello suggests that we would have tried a Snap Start
1866 // connection.
1867 base::TimeTicks now = base::TimeTicks::Now();
1868 const base::TimeDelta duration =
1869 now - ssl_host_info_->verification_start_time();
1870 UMA_HISTOGRAM_TIMES("Net.SSLSnapStartNeededVerificationInMs", duration);
1871 VLOG(1) << "Cannot snap start because verification isn't ready. "
1872 << "Wanted verification after "
1873 << duration.InMilliseconds() << "ms";
1861 } 1874 }
1862 } else { 1875 } else {
1863 DCHECK_EQ(ERR_IO_PENDING, rv); 1876 DCHECK_EQ(ERR_IO_PENDING, rv);
1864 GotoState(STATE_SNAP_START_LOAD_INFO);
1865 } 1877 }
1866 1878
1867 LeaveFunction(""); 1879 LeaveFunction("");
1868 return rv; 1880 return rv;
1869 } 1881 }
1870 1882
1871 int SSLClientSocketNSS::DoSnapStartWaitForWrite() { 1883 int SSLClientSocketNSS::DoSnapStartWaitForWrite() {
1872 EnterFunction(""); 1884 EnterFunction("");
1873 // In this state, we're waiting for the first Write call so that we can merge 1885 // In this state, we're waiting for the first Write call so that we can merge
1874 // it into the Snap Start handshake. 1886 // it into the Snap Start handshake.
(...skipping 342 matching lines...) Expand 10 before | Expand all | Expand 10 after
2217 DCHECK(server_cert_); 2229 DCHECK(server_cert_);
2218 2230
2219 GotoState(STATE_VERIFY_CERT_COMPLETE); 2231 GotoState(STATE_VERIFY_CERT_COMPLETE);
2220 2232
2221 if (ssl_host_info_.get() && !ssl_host_info_->state().certs.empty() && 2233 if (ssl_host_info_.get() && !ssl_host_info_->state().certs.empty() &&
2222 predicted_cert_chain_correct_) { 2234 predicted_cert_chain_correct_) {
2223 // If the SSLHostInfo had a prediction for the certificate chain of this 2235 // If the SSLHostInfo had a prediction for the certificate chain of this
2224 // server then it will have optimistically started a verification of that 2236 // server then it will have optimistically started a verification of that
2225 // chain. So, if the prediction was correct, we should wait for that 2237 // chain. So, if the prediction was correct, we should wait for that
2226 // verification to finish rather than start our own. 2238 // verification to finish rather than start our own.
2239 net_log_.AddEvent(NetLog::TYPE_SSL_VERIFICATION_MERGED, NULL);
2240 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 1 /* true */, 2);
2241 base::TimeTicks now = base::TimeTicks::Now();
2242 UMA_HISTOGRAM_TIMES("Net.SSLVerificationMergedMsSaved",
2243 now - ssl_host_info_->verification_start_time());
2227 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result(); 2244 server_cert_verify_result_ = &ssl_host_info_->cert_verify_result();
2228 return ssl_host_info_->WaitForCertVerification(&handshake_io_callback_); 2245 return ssl_host_info_->WaitForCertVerification(&handshake_io_callback_);
2246 } else {
2247 UMA_HISTOGRAM_ENUMERATION("Net.SSLVerificationMerged", 0 /* false */, 2);
2229 } 2248 }
2230 2249
2231 int flags = 0; 2250 int flags = 0;
2232 if (ssl_config_.rev_checking_enabled) 2251 if (ssl_config_.rev_checking_enabled)
2233 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED; 2252 flags |= X509Certificate::VERIFY_REV_CHECKING_ENABLED;
2234 if (ssl_config_.verify_ev_cert) 2253 if (ssl_config_.verify_ev_cert)
2235 flags |= X509Certificate::VERIFY_EV_CERT; 2254 flags |= X509Certificate::VERIFY_EV_CERT;
2236 verifier_.reset(new CertVerifier); 2255 verifier_.reset(new CertVerifier);
2237 server_cert_verify_result_ = &local_server_cert_verify_result_; 2256 server_cert_verify_result_ = &local_server_cert_verify_result_;
2238 return verifier_->Verify(server_cert_, hostname_, flags, 2257 return verifier_->Verify(server_cert_, hostname_, flags,
2239 &local_server_cert_verify_result_, 2258 &local_server_cert_verify_result_,
2240 &handshake_io_callback_); 2259 &handshake_io_callback_);
2241 } 2260 }
2242 2261
2243 // Derived from AuthCertificateCallback() in 2262 // Derived from AuthCertificateCallback() in
2244 // mozilla/source/security/manager/ssl/src/nsNSSCallbacks.cpp. 2263 // mozilla/source/security/manager/ssl/src/nsNSSCallbacks.cpp.
2245 int SSLClientSocketNSS::DoVerifyCertComplete(int result) { 2264 int SSLClientSocketNSS::DoVerifyCertComplete(int result) {
2246 verifier_.reset(); 2265 verifier_.reset();
2247 2266
2248 // Using Snap Start disables certificate verification for now.
2249 if (SSLConfigService::snap_start_enabled())
2250 result = OK;
2251
2252 // We used to remember the intermediate CA certs in the NSS database 2267 // We used to remember the intermediate CA certs in the NSS database
2253 // persistently. However, NSS opens a connection to the SQLite database 2268 // persistently. However, NSS opens a connection to the SQLite database
2254 // during NSS initialization and doesn't close the connection until NSS 2269 // during NSS initialization and doesn't close the connection until NSS
2255 // shuts down. If the file system where the database resides is gone, 2270 // shuts down. If the file system where the database resides is gone,
2256 // the database connection goes bad. What's worse, the connection won't 2271 // the database connection goes bad. What's worse, the connection won't
2257 // recover when the file system comes back. Until this NSS or SQLite bug 2272 // recover when the file system comes back. Until this NSS or SQLite bug
2258 // is fixed, we need to avoid using the NSS database for non-essential 2273 // is fixed, we need to avoid using the NSS database for non-essential
2259 // purposes. See https://bugzilla.mozilla.org/show_bug.cgi?id=508081 and 2274 // purposes. See https://bugzilla.mozilla.org/show_bug.cgi?id=508081 and
2260 // http://crbug.com/15630 for more info. 2275 // http://crbug.com/15630 for more info.
2261 2276
(...skipping 127 matching lines...) Expand 10 before | Expand all | Expand 10 after
2389 case SSL_CONNECTION_VERSION_TLS1_1: 2404 case SSL_CONNECTION_VERSION_TLS1_1:
2390 UpdateConnectionTypeHistograms(CONNECTION_SSL_TLS1_1); 2405 UpdateConnectionTypeHistograms(CONNECTION_SSL_TLS1_1);
2391 break; 2406 break;
2392 case SSL_CONNECTION_VERSION_TLS1_2: 2407 case SSL_CONNECTION_VERSION_TLS1_2:
2393 UpdateConnectionTypeHistograms(CONNECTION_SSL_TLS1_2); 2408 UpdateConnectionTypeHistograms(CONNECTION_SSL_TLS1_2);
2394 break; 2409 break;
2395 }; 2410 };
2396 } 2411 }
2397 2412
2398 } // namespace net 2413 } // namespace net
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698