| Index: net/socket/ssl_client_socket_nss.cc
|
| diff --git a/net/socket/ssl_client_socket_nss.cc b/net/socket/ssl_client_socket_nss.cc
|
| index b24a708fb364deb317633bf24eca874d923100ec..a40b56450700032a4f6cffbb88d504d9908f4325 100644
|
| --- a/net/socket/ssl_client_socket_nss.cc
|
| +++ b/net/socket/ssl_client_socket_nss.cc
|
| @@ -421,6 +421,8 @@ SSLClientSocketNSS::SSLClientSocketNSS(ClientSocketHandle* transport_socket,
|
| handshake_callback_called_(false),
|
| completed_handshake_(false),
|
| pseudo_connected_(false),
|
| + eset_mitm_detected_(false),
|
| + netnanny_mitm_detected_(false),
|
| dnssec_provider_(NULL),
|
| next_handshake_state_(STATE_NONE),
|
| nss_fd_(NULL),
|
| @@ -995,6 +997,8 @@ void SSLClientSocketNSS::Disconnect() {
|
| server_cert_verify_result_.Reset();
|
| completed_handshake_ = false;
|
| pseudo_connected_ = false;
|
| + eset_mitm_detected_ = false;
|
| + netnanny_mitm_detected_= false;
|
| nss_bufs_ = NULL;
|
| client_certs_.clear();
|
| client_auth_cert_needed_ = false;
|
| @@ -1739,6 +1743,24 @@ SECStatus SSLClientSocketNSS::OwnAuthCertHandler(void* arg,
|
| base::TimeDelta::FromMilliseconds(kCorkTimeoutMs),
|
| that, &SSLClientSocketNSS::UncorkAfterTimeout);
|
| }
|
| +
|
| + // ESET anti-virus is capable of intercepting HTTPS connections on Windows.
|
| + // However, it is False Start intolerant and causes the connections to hang
|
| + // forever. We detect ESET by the issuer of the leaf certificate and set a
|
| + // flag to return a specific error, giving the user instructions for
|
| + // reconfiguring ESET.
|
| + CERTCertificate* cert = SSL_PeerCertificate(that->nss_fd_);
|
| + if (cert) {
|
| + char* common_name = CERT_GetCommonName(&cert->issuer);
|
| + if (common_name) {
|
| + if (strcmp(common_name, "ESET_RootSslCert") == 0)
|
| + that->eset_mitm_detected_ = true;
|
| + if (strcmp(common_name, "ContentWatch Root Certificate Authority") == 0)
|
| + that->netnanny_mitm_detected_ = true;
|
| + PORT_Free(common_name);
|
| + }
|
| + CERT_DestroyCertificate(cert);
|
| + }
|
| }
|
| #endif
|
|
|
| @@ -2024,18 +2046,24 @@ int SSLClientSocketNSS::DoHandshake() {
|
| }
|
| } else if (rv == SECSuccess) {
|
| if (handshake_callback_called_) {
|
| - SaveSnapStartInfo();
|
| - // SSL handshake is completed. It's possible that we mispredicted the NPN
|
| - // agreed protocol. In this case, we've just sent a request in the wrong
|
| - // protocol! The higher levels of this network stack aren't prepared for
|
| - // switching the protocol like that so we make up an error and rely on
|
| - // the fact that the request will be retried.
|
| - if (IsNPNProtocolMispredicted()) {
|
| - LOG(WARNING) << "Mispredicted NPN protocol for " << hostname_;
|
| - net_error = ERR_SSL_SNAP_START_NPN_MISPREDICTION;
|
| + if (eset_mitm_detected_) {
|
| + net_error = ERR_ESET_ANTI_VIRUS_SSL_INTERCEPTION;
|
| + } else if (netnanny_mitm_detected_) {
|
| + net_error = ERR_NETNANNY_SSL_INTERCEPTION;
|
| } else {
|
| - // Let's verify the certificate.
|
| - GotoState(STATE_VERIFY_DNSSEC);
|
| + SaveSnapStartInfo();
|
| + // SSL handshake is completed. It's possible that we mispredicted the NPN
|
| + // agreed protocol. In this case, we've just sent a request in the wrong
|
| + // protocol! The higher levels of this network stack aren't prepared for
|
| + // switching the protocol like that so we make up an error and rely on
|
| + // the fact that the request will be retried.
|
| + if (IsNPNProtocolMispredicted()) {
|
| + LOG(WARNING) << "Mispredicted NPN protocol for " << hostname_;
|
| + net_error = ERR_SSL_SNAP_START_NPN_MISPREDICTION;
|
| + } else {
|
| + // Let's verify the certificate.
|
| + GotoState(STATE_VERIFY_DNSSEC);
|
| + }
|
| }
|
| // Done!
|
| } else {
|
|
|