【发布时间】:2015-03-04 11:27:09
【问题描述】:
Python 2.7.9 现在对 SSL 证书验证更加严格。太棒了!
对于以前运行的程序现在出现 CERTIFICATE_VERIFY_FAILED 错误,我并不感到惊讶。但我似乎无法让它们工作(不完全禁用证书验证)。
一个程序使用 urllib2 通过 https 连接到 Amazon S3。
我将根 CA 证书下载到名为“verisign.pem”的文件中并尝试以下操作:
import urllib2, ssl
context = ssl.create_default_context()
context.load_verify_locations(cafile = "./verisign.pem")
print context.get_ca_certs()
urllib2.urlopen("https://bucket.s3.amazonaws.com/", context=context)
我仍然收到 CERTIFICATE_VERIFY_FAILED 错误,即使根 CA 在第 4 行中正确打印出来。
openssl 可以正常连接到这个服务器。其实这里是我用来获取CA证书的命令:
openssl s_client -showcerts -connect bucket.s3.amazonaws.com:443 < /dev/null
我将链中的最后一个证书放入一个 PEM 文件中,openssl 可以正常读取。这是带有以下内容的 Verisign 证书:
Serial number: 35:97:31:87:f3:87:3a:07:32:7e:ce:58:0c:9b:7e:da
Subject key identifier: 7F:D3:65:A7:C2:DD:EC:BB:F0:30:09:F3:43:39:FA:02:AF:33:31:33
SHA1 fingerprint: F4:A8:0A:0C:D1:E6:CF:19:0B:8C:BC:6F:BC:99:17:11:D4:82:C9:D0
任何想法如何在启用验证的情况下使其工作?
【问题讨论】:
-
verisign.pem 中有哪个证书?确保它是 SHA1 指纹为
A1:DB:63:93:91:6F:17:E4:18:55:09:40:04:15:C7:02:40:B0:AE:6B(3 类公共主要证书颁发机构)的证书,而不是带有4E:B6:D5:78:49:9B:1C:CF:5F:58:1E:AD:56:BE:3D:9B:67:44:A5:E5(威瑞信 3 类公共主要证书颁发机构 - G5)的证书 -
我终于找到了,它可以工作,谢谢!如何判断正在使用哪个根证书?我正在使用 openssl x509 命令转储链中的每个证书。他们中的大多数人说他们是用哪个证书签名的,但我看不到最后一个说它是用哪个根证书签名的。