diff options
author | estark <estark@chromium.org> | 2016-02-25 12:41:20 -0800 |
---|---|---|
committer | Commit bot <commit-bot@chromium.org> | 2016-02-25 20:42:41 +0000 |
commit | 0fc8d0784ff725ffcab646769ec1f1765c2d4013 (patch) | |
tree | a9a3ffe9801f090241d684a95e931b18101076d7 /net/socket | |
parent | a25bf4f5f135fa548f7a2de0580059313c6730b9 (diff) | |
download | chromium_src-0fc8d0784ff725ffcab646769ec1f1765c2d4013.zip chromium_src-0fc8d0784ff725ffcab646769ec1f1765c2d4013.tar.gz chromium_src-0fc8d0784ff725ffcab646769ec1f1765c2d4013.tar.bz2 |
Add Expect CT policy that gets checked on all certs
This CL introduces an Expect CT policy in the form of a
CTPolicyEnforcer::DoesConformToCertPolicy() method. This policy is
checked on all certs, and the results are stored in SSLInfo. In a future CL,
this SSLInfo field will be used to determine whether or not to send a
report for a site that expected valid CT to info to be present on its
connections.
BUG=568806
Review URL: https://codereview.chromium.org/1578993003
Cr-Commit-Position: refs/heads/master@{#377662}
Diffstat (limited to 'net/socket')
-rw-r--r-- | net/socket/ssl_client_socket_nss.cc | 51 | ||||
-rw-r--r-- | net/socket/ssl_client_socket_openssl.cc | 51 | ||||
-rw-r--r-- | net/socket/ssl_client_socket_unittest.cc | 10 |
3 files changed, 66 insertions, 46 deletions
diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc index 38f2a78..1501c76 100644 --- a/net/socket/ssl_client_socket_nss.cc +++ b/net/socket/ssl_client_socket_nss.cc @@ -3134,30 +3134,35 @@ void SSLClientSocketNSS::VerifyCT() { ct_verify_result_.ct_policies_applied = (policy_enforcer_ != nullptr); ct_verify_result_.ev_policy_compliance = ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; - if (policy_enforcer_ && - (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) { - scoped_refptr<ct::EVCertsWhitelist> ev_whitelist = - SSLConfigService::GetEVCertsWhitelist(); - ct::EVPolicyCompliance ev_policy_compliance = - policy_enforcer_->DoesConformToCTEVPolicy( - server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(), - ct_verify_result_.verified_scts, net_log_); - ct_verify_result_.ev_policy_compliance = ev_policy_compliance; - if (ev_policy_compliance != - ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY && - ev_policy_compliance != - ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST && - ev_policy_compliance != - ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) { - // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766 - VLOG(1) << "EV certificate for " - << server_cert_verify_result_.verified_cert->subject() - .GetDisplayName() - << " does not conform to CT policy, removing EV status."; - server_cert_verify_result_.cert_status |= - CERT_STATUS_CT_COMPLIANCE_FAILED; - server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV; + if (policy_enforcer_) { + if ((server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) { + scoped_refptr<ct::EVCertsWhitelist> ev_whitelist = + SSLConfigService::GetEVCertsWhitelist(); + ct::EVPolicyCompliance ev_policy_compliance = + policy_enforcer_->DoesConformToCTEVPolicy( + server_cert_verify_result_.verified_cert.get(), + ev_whitelist.get(), ct_verify_result_.verified_scts, net_log_); + ct_verify_result_.ev_policy_compliance = ev_policy_compliance; + if (ev_policy_compliance != + ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY && + ev_policy_compliance != + ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST && + ev_policy_compliance != + ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) { + // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766 + VLOG(1) << "EV certificate for " + << server_cert_verify_result_.verified_cert->subject() + .GetDisplayName() + << " does not conform to CT policy, removing EV status."; + server_cert_verify_result_.cert_status |= + CERT_STATUS_CT_COMPLIANCE_FAILED; + server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV; + } } + ct_verify_result_.cert_policy_compliance = + policy_enforcer_->DoesConformToCertPolicy( + server_cert_verify_result_.verified_cert.get(), + ct_verify_result_.verified_scts, net_log_); } } diff --git a/net/socket/ssl_client_socket_openssl.cc b/net/socket/ssl_client_socket_openssl.cc index 9e23a4d..f6c9b01 100644 --- a/net/socket/ssl_client_socket_openssl.cc +++ b/net/socket/ssl_client_socket_openssl.cc @@ -1431,30 +1431,35 @@ void SSLClientSocketOpenSSL::VerifyCT() { ct_verify_result_.ct_policies_applied = (policy_enforcer_ != nullptr); ct_verify_result_.ev_policy_compliance = ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY; - if (policy_enforcer_ && - (server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) { - scoped_refptr<ct::EVCertsWhitelist> ev_whitelist = - SSLConfigService::GetEVCertsWhitelist(); - ct::EVPolicyCompliance ev_policy_compliance = - policy_enforcer_->DoesConformToCTEVPolicy( - server_cert_verify_result_.verified_cert.get(), ev_whitelist.get(), - ct_verify_result_.verified_scts, net_log_); - ct_verify_result_.ev_policy_compliance = ev_policy_compliance; - if (ev_policy_compliance != - ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY && - ev_policy_compliance != - ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST && - ev_policy_compliance != - ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) { - // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766 - VLOG(1) << "EV certificate for " - << server_cert_verify_result_.verified_cert->subject() - .GetDisplayName() - << " does not conform to CT policy, removing EV status."; - server_cert_verify_result_.cert_status |= - CERT_STATUS_CT_COMPLIANCE_FAILED; - server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV; + if (policy_enforcer_) { + if ((server_cert_verify_result_.cert_status & CERT_STATUS_IS_EV)) { + scoped_refptr<ct::EVCertsWhitelist> ev_whitelist = + SSLConfigService::GetEVCertsWhitelist(); + ct::EVPolicyCompliance ev_policy_compliance = + policy_enforcer_->DoesConformToCTEVPolicy( + server_cert_verify_result_.verified_cert.get(), + ev_whitelist.get(), ct_verify_result_.verified_scts, net_log_); + ct_verify_result_.ev_policy_compliance = ev_policy_compliance; + if (ev_policy_compliance != + ct::EVPolicyCompliance::EV_POLICY_DOES_NOT_APPLY && + ev_policy_compliance != + ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_WHITELIST && + ev_policy_compliance != + ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS) { + // TODO(eranm): Log via the BoundNetLog, see crbug.com/437766 + VLOG(1) << "EV certificate for " + << server_cert_verify_result_.verified_cert->subject() + .GetDisplayName() + << " does not conform to CT policy, removing EV status."; + server_cert_verify_result_.cert_status |= + CERT_STATUS_CT_COMPLIANCE_FAILED; + server_cert_verify_result_.cert_status &= ~CERT_STATUS_IS_EV; + } } + ct_verify_result_.cert_policy_compliance = + policy_enforcer_->DoesConformToCertPolicy( + server_cert_verify_result_.verified_cert.get(), + ct_verify_result_.verified_scts, net_log_); } } diff --git a/net/socket/ssl_client_socket_unittest.cc b/net/socket/ssl_client_socket_unittest.cc index d54f003..ba92459 100644 --- a/net/socket/ssl_client_socket_unittest.cc +++ b/net/socket/ssl_client_socket_unittest.cc @@ -699,6 +699,10 @@ class MockCTVerifier : public CTVerifier { // A mock CTPolicyEnforcer that returns a custom verification result. class MockCTPolicyEnforcer : public CTPolicyEnforcer { public: + MOCK_METHOD3(DoesConformToCertPolicy, + ct::CertPolicyCompliance(X509Certificate* cert, + const ct::SCTList&, + const BoundNetLog&)); MOCK_METHOD4(DoesConformToCTEVPolicy, ct::EVPolicyCompliance(X509Certificate* cert, const ct::EVCertsWhitelist*, @@ -2349,6 +2353,9 @@ TEST_F(SSLClientSocketTest, EVCertStatusMaintainedForCompliantCert) { // Emulate compliance of the certificate to the policy. MockCTPolicyEnforcer policy_enforcer; SetCTPolicyEnforcer(&policy_enforcer); + EXPECT_CALL(policy_enforcer, DoesConformToCertPolicy(_, _, _)) + .WillRepeatedly( + Return(ct::CertPolicyCompliance::CERT_POLICY_COMPLIES_VIA_SCTS)); EXPECT_CALL(policy_enforcer, DoesConformToCTEVPolicy(_, _, _, _)) .WillRepeatedly( Return(ct::EVPolicyCompliance::EV_POLICY_COMPLIES_VIA_SCTS)); @@ -2382,6 +2389,9 @@ TEST_F(SSLClientSocketTest, EVCertStatusRemovedForNonCompliantCert) { // Emulate non-compliance of the certificate to the policy. MockCTPolicyEnforcer policy_enforcer; SetCTPolicyEnforcer(&policy_enforcer); + EXPECT_CALL(policy_enforcer, DoesConformToCertPolicy(_, _, _)) + .WillRepeatedly( + Return(ct::CertPolicyCompliance::CERT_POLICY_NOT_ENOUGH_SCTS)); EXPECT_CALL(policy_enforcer, DoesConformToCTEVPolicy(_, _, _, _)) .WillRepeatedly( Return(ct::EVPolicyCompliance::EV_POLICY_NOT_ENOUGH_SCTS)); |