我对网站证书验证感到困惑。请参阅以下详细信息:
使用python urllib2连接到网站(www.bitstamp.net):
urllib2.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:661)>
curl给出了类似的错误:
$ curl https://www.bitstamp.net
curl: (60) SSL certificate problem: self signed certificate in certificate chain
但是,openssl会显示每个证书已经过验证(假设&#34; 1&#34;表示已经过验证):
$ openssl s_client -showcerts -connect www.bitstamp.net:443
CONNECTED(00000003)
depth=3 C = SE, O = AddTrust AB, OU = AddTrust External TTP Network, CN = AddTrust External CA Root
verify return:1
depth=2 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Certification Authority
verify return:1
depth=1 C = GB, ST = Greater Manchester, L = Salford, O = COMODO CA Limited, CN = COMODO RSA Domain Validation Secure Server CA
verify return:1
depth=0 OU = Domain Control Validated, OU = Hosted by Incapsula Inc, OU = PositiveSSL Multi-Domain, CN = incapsula.com
verify return:1
这里发生了什么?是否有自签名证书&#34;如卷曲声称?如果是这样,哪一个?
答案 0 :(得分:0)
此行为有几种症状。让我们从第一期开始。
链错误中的自签名证书:这是真的,也是一个有效的案例。因为每个根证书颁发机构都是自签名的。在您的情况下,AddTrust是自签名的。这可能表示curl / libssl或其他客户端无法识别证书颁发机构。正如你所说openssl s_client验证证书。在许多Linux发行版中,它位于/ etc / ssl / certs下。您的可能不同,或者您可能需要更新它们。您还应该将这些CA的位置定义到库中(即使在libssl中 - SSL_CTX_load_verify_locations)
基于SNI的问题表明目标服务器在同一主机/ IP上为多个基于TLS / SSL的站点提供服务。没有明确的SNI规范服务器正在响应任何一个(我不确定选择算法,可能是随机或第一个)。
由于这些原因,这两种情况似乎对我都有效。