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

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

Issue 2067843003: Require a CTVerifier and CTPolicyEnforcer for TLS/QUIC sockets (Closed) Base URL: https://chromium.googlesource.com/chromium/src.git@master
Patch Set: Fixup Created 4 years, 6 months 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
« no previous file with comments | « net/socket/ssl_client_socket.h ('k') | net/socket/ssl_client_socket_pool_unittest.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) 2012 The Chromium Authors. All rights reserved. 1 // Copyright (c) 2012 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 #include "net/socket/ssl_client_socket_impl.h" 5 #include "net/socket/ssl_client_socket_impl.h"
6 6
7 #include <errno.h> 7 #include <errno.h>
8 #include <openssl/bio.h> 8 #include <openssl/bio.h>
9 #include <openssl/bytestring.h> 9 #include <openssl/bytestring.h>
10 #include <openssl/err.h> 10 #include <openssl/err.h>
(...skipping 501 matching lines...) Expand 10 before | Expand all | Expand 10 after
512 session_pending_(false), 512 session_pending_(false),
513 certificate_verified_(false), 513 certificate_verified_(false),
514 ssl_failure_state_(SSL_FAILURE_NONE), 514 ssl_failure_state_(SSL_FAILURE_NONE),
515 signature_result_(kNoPendingResult), 515 signature_result_(kNoPendingResult),
516 transport_security_state_(context.transport_security_state), 516 transport_security_state_(context.transport_security_state),
517 policy_enforcer_(context.ct_policy_enforcer), 517 policy_enforcer_(context.ct_policy_enforcer),
518 pkp_bypassed_(false), 518 pkp_bypassed_(false),
519 net_log_(transport_->socket()->NetLog()), 519 net_log_(transport_->socket()->NetLog()),
520 weak_factory_(this) { 520 weak_factory_(this) {
521 DCHECK(cert_verifier_); 521 DCHECK(cert_verifier_);
522 DCHECK(transport_security_state_);
523 DCHECK(policy_enforcer_);
522 } 524 }
523 525
524 SSLClientSocketImpl::~SSLClientSocketImpl() { 526 SSLClientSocketImpl::~SSLClientSocketImpl() {
525 Disconnect(); 527 Disconnect();
526 } 528 }
527 529
528 #if !defined(OS_NACL) 530 #if !defined(OS_NACL)
529 void SSLClientSocketImpl::SetSSLKeyLogFile( 531 void SSLClientSocketImpl::SetSSLKeyLogFile(
530 const base::FilePath& ssl_keylog_file, 532 const base::FilePath& ssl_keylog_file,
531 const scoped_refptr<base::SequencedTaskRunner>& task_runner) { 533 const scoped_refptr<base::SequencedTaskRunner>& task_runner) {
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
609 if (rv != 1) { 611 if (rv != 1) {
610 int ssl_error = SSL_get_error(ssl_, rv); 612 int ssl_error = SSL_get_error(ssl_, rv);
611 LOG(ERROR) << "Failed to export keying material;" 613 LOG(ERROR) << "Failed to export keying material;"
612 << " returned " << rv << ", SSL error code " << ssl_error; 614 << " returned " << rv << ", SSL error code " << ssl_error;
613 return MapOpenSSLError(ssl_error, err_tracer); 615 return MapOpenSSLError(ssl_error, err_tracer);
614 } 616 }
615 return OK; 617 return OK;
616 } 618 }
617 619
618 int SSLClientSocketImpl::Connect(const CompletionCallback& callback) { 620 int SSLClientSocketImpl::Connect(const CompletionCallback& callback) {
619 // It is an error to create an SSLClientSocket whose context has no
620 // TransportSecurityState.
621 DCHECK(transport_security_state_);
622
623 // Although StreamSocket does allow calling Connect() after Disconnect(), 621 // Although StreamSocket does allow calling Connect() after Disconnect(),
624 // this has never worked for layered sockets. CHECK to detect any consumers 622 // this has never worked for layered sockets. CHECK to detect any consumers
625 // reconnecting an SSL socket. 623 // reconnecting an SSL socket.
626 // 624 //
627 // TODO(davidben,mmenke): Remove this API feature. See 625 // TODO(davidben,mmenke): Remove this API feature. See
628 // https://crbug.com/499289. 626 // https://crbug.com/499289.
629 CHECK(!disconnected_); 627 CHECK(!disconnected_);
630 628
631 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT); 629 net_log_.BeginEvent(NetLog::TYPE_SSL_CONNECT);
632 630
(...skipping 690 matching lines...) Expand 10 before | Expand all | Expand 10 after
1323 base::TimeDelta verify_time = 1321 base::TimeDelta verify_time =
1324 base::TimeTicks::Now() - start_cert_verification_time_; 1322 base::TimeTicks::Now() - start_cert_verification_time_;
1325 if (result == OK) { 1323 if (result == OK) {
1326 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time); 1324 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTime", verify_time);
1327 } else { 1325 } else {
1328 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time); 1326 UMA_HISTOGRAM_TIMES("Net.SSLCertVerificationTimeError", verify_time);
1329 } 1327 }
1330 } 1328 }
1331 1329
1332 const CertStatus cert_status = server_cert_verify_result_.cert_status; 1330 const CertStatus cert_status = server_cert_verify_result_.cert_status;
1333 if (transport_security_state_ && 1331 if ((result == OK ||
1334 (result == OK ||
1335 (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) && 1332 (IsCertificateError(result) && IsCertStatusMinorError(cert_status))) &&
1336 !transport_security_state_->CheckPublicKeyPins( 1333 !transport_security_state_->CheckPublicKeyPins(
1337 host_and_port_, server_cert_verify_result_.is_issued_by_known_root, 1334 host_and_port_, server_cert_verify_result_.is_issued_by_known_root,
1338 server_cert_verify_result_.public_key_hashes, server_cert_.get(), 1335 server_cert_verify_result_.public_key_hashes, server_cert_.get(),
1339 server_cert_verify_result_.verified_cert.get(), 1336 server_cert_verify_result_.verified_cert.get(),
1340 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_)) { 1337 TransportSecurityState::ENABLE_PIN_REPORTS, &pinning_failure_log_)) {
1341 if (server_cert_verify_result_.is_issued_by_known_root) 1338 if (server_cert_verify_result_.is_issued_by_known_root)
1342 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN; 1339 result = ERR_SSL_PINNED_KEY_NOT_IN_CERT_CHAIN;
1343 else 1340 else
1344 pkp_bypassed_ = true; 1341 pkp_bypassed_ = true;
(...skipping 27 matching lines...) Expand all
1372 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_)); 1369 server_cert_chain_->Reset(SSL_get_peer_cert_chain(ssl_));
1373 server_cert_ = server_cert_chain_->AsOSChain(); 1370 server_cert_ = server_cert_chain_->AsOSChain();
1374 if (server_cert_.get()) { 1371 if (server_cert_.get()) {
1375 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED, 1372 net_log_.AddEvent(NetLog::TYPE_SSL_CERTIFICATES_RECEIVED,
1376 base::Bind(&NetLogX509CertificateCallback, 1373 base::Bind(&NetLogX509CertificateCallback,
1377 base::Unretained(server_cert_.get()))); 1374 base::Unretained(server_cert_.get())));
1378 } 1375 }
1379 } 1376 }
1380 1377
1381 void SSLClientSocketImpl::VerifyCT() { 1378 void SSLClientSocketImpl::VerifyCT() {
1382 if (!cert_transparency_verifier_)
1383 return;
1384
1385 const uint8_t* ocsp_response_raw; 1379 const uint8_t* ocsp_response_raw;
1386 size_t ocsp_response_len; 1380 size_t ocsp_response_len;
1387 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len); 1381 SSL_get0_ocsp_response(ssl_, &ocsp_response_raw, &ocsp_response_len);
1388 std::string ocsp_response; 1382 std::string ocsp_response;
1389 if (ocsp_response_len > 0) { 1383 if (ocsp_response_len > 0) {
1390 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw), 1384 ocsp_response.assign(reinterpret_cast<const char*>(ocsp_response_raw),
1391 ocsp_response_len); 1385 ocsp_response_len);
1392 } 1386 }
1393 1387
1394 const uint8_t* sct_list_raw; 1388 const uint8_t* sct_list_raw;
1395 size_t sct_list_len; 1389 size_t sct_list_len;
1396 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len); 1390 SSL_get0_signed_cert_timestamp_list(ssl_, &sct_list_raw, &sct_list_len);
1397 std::string sct_list; 1391 std::string sct_list;
1398 if (sct_list_len > 0) 1392 if (sct_list_len > 0)
1399 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len); 1393 sct_list.assign(reinterpret_cast<const char*>(sct_list_raw), sct_list_len);
1400 1394
1401 // Note that this is a completely synchronous operation: The CT Log Verifier 1395 // Note that this is a completely synchronous operation: The CT Log Verifier
1402 // gets all the data it needs for SCT verification and does not do any 1396 // gets all the data it needs for SCT verification and does not do any
1403 // external communication. 1397 // external communication.
1404 cert_transparency_verifier_->Verify( 1398 cert_transparency_verifier_->Verify(
1405 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list, 1399 server_cert_verify_result_.verified_cert.get(), ocsp_response, sct_list,
1406 &ct_verify_result_, net_log_); 1400 &ct_verify_result_, net_log_);
1407 1401
1408 ct_verify_result_.ct_policies_applied = (policy_enforcer_ != nullptr); 1402 ct_verify_result_.ct_policies_applied = true;
1409 ct_verify_result_.ev_policy_compliance = 1403 ct_verify_result_.ev_policy_compliance =
1410 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; 1404 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY;
1411 if (policy_enforcer_) { 1405 if (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV) {
1412 if ((server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) { 1406 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist =
1413 scoped_refptr<ct::EVCertsWhitelist> ev_whitelist = 1407 SSLConfigService::GetEVCertsWhitelist();
1414 SSLConfigService::GetEVCertsWhitelist(); 1408 ct::EVPolicyCompliance ev_policy_compliance =
1415 ct::EVPolicyCompliance ev_policy_compliance = 1409 policy_enforcer_->DoesConformToCTEVPolicy(
1416 policy_enforcer_->DoesConformToCTEVPolicy( 1410 server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(),
1417 server_cert_verify_result_.verified_cert.get(), 1411 ct_verify_result_.verified_scts, net_log_);
1418 ev_whitelist.get(), ct_verify_result_.verified_scts, net_log_); 1412 ct_verify_result_.ev_policy_compliance = ev_policy_compliance;
1419 ct_verify_result_.ev_policy_compliance = ev_policy_compliance; 1413 if (ev_policy_compliance !=
1420 if (ev_policy_compliance != 1414 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY &&
1421 ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY && 1415 ev_policy_compliance !=
1422 ev_policy_compliance != 1416 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST &&
1423 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST && 1417 ev_policy_compliance !=
1424 ev_policy_compliance != 1418 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) {
1425 ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) { 1419 server_cert_verify_result_.cert_status |=
1426 server_cert_verify_result_.cert_status |= 1420 CERT_STATUS_CT_COMPLIANCE_FAILED;
1427 CERT_STATUS_CT_COMPLIANCE_FAILED; 1421 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1428 server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV;
1429 }
1430 } 1422 }
1431 ct_verify_result_.cert_policy_compliance =
1432 policy_enforcer_->DoesConformToCertPolicy(
1433 server_cert_verify_result_.verified_cert.get(),
1434 ct_verify_result_.verified_scts, net_log_);
1435 } 1423 }
1424 ct_verify_result_.cert_policy_compliance =
1425 policy_enforcer_->DoesConformToCertPolicy(
1426 server_cert_verify_result_.verified_cert.get(),
1427 ct_verify_result_.verified_scts, net_log_);
1436 } 1428 }
1437 1429
1438 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) { 1430 void SSLClientSocketImpl::OnHandshakeIOComplete(int result) {
1439 int rv = DoHandshakeLoop(result); 1431 int rv = DoHandshakeLoop(result);
1440 if (rv != ERR_IO_PENDING) { 1432 if (rv != ERR_IO_PENDING) {
1441 LogConnectEndEvent(rv); 1433 LogConnectEndEvent(rv);
1442 DoConnectCallback(rv); 1434 DoConnectCallback(rv);
1443 } 1435 }
1444 } 1436 }
1445 1437
(...skipping 864 matching lines...) Expand 10 before | Expand all | Expand 10 after
2310 if (rv != OK) { 2302 if (rv != OK) {
2311 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv); 2303 net_log_.EndEventWithNetErrorCode(NetLog::TYPE_SSL_CONNECT, rv);
2312 return; 2304 return;
2313 } 2305 }
2314 2306
2315 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT, 2307 net_log_.EndEvent(NetLog::TYPE_SSL_CONNECT,
2316 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this))); 2308 base::Bind(&NetLogSSLInfoCallback, base::Unretained(this)));
2317 } 2309 }
2318 2310
2319 } // namespace net 2311 } // namespace net
OLDNEW
« no previous file with comments | « net/socket/ssl_client_socket.h ('k') | net/socket/ssl_client_socket_pool_unittest.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698