大佬教程收集整理的这篇文章主要介绍了Python Urllib2 SSL错误,大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。
总结关于问题原因的评论并更详细地解释实际问题:
如果检查OpenSSL客户端的信任链,则会得到以下信息:
[0] 54:7D:B3:AC:BF:... /CN=*.s3.amazonaws.com
[1] 5D:EB:8F:33:9E:... /CN=VeriSign Class 3 Secure Server CA - G3
[2] F4:A8:0A:0C:D1:... /CN=VeriSign Class 3 Public PriMary Certification Authority - G5
[OT] A1:DB:63:93:91:... /C=US/O=VeriSign, Inc./OU=Class 3 Public PriMary Certification Authority
第一个证书[0]是服务器发送的叶证书。以下证书[1]和[2]是服务器发送的链式证书。最后一个证书[OT]是受信任的根证书,该证书不是由服务器发送的,而是位于受信任CA的本地存储中。链中的每个证书都由下一个证书签名,最后一个证书[OT]受信任,因此信任链已完成。
如果您通过浏览器(例如,使用NSS库的Google Chrome)检查信任链,则会获得以下链:
[0] 54:7D:B3:AC:BF:... /CN=*.s3.amazonaws.com
[1] 5D:EB:8F:33:9E:... /CN=VeriSign Class 3 Secure Server CA - G3
[NT] 4E:B6:D5:78:49:... /CN=VeriSign Class 3 Public PriMary Certification Authority - G5
服务器再次发送[0]和[1],但是[NT]是受信任的根证书。从对象的角度看,这就像连锁证书[2]一样,指纹表示证书是不同的。如果您仔细查看证书[2]和[NT],您会发现,证书内的公钥是相同的,因此[2]和[NT]均可用于验证[ 1],因此可以用来建立信任链。
这意味着,尽管服务器在所有情况下都发送相同的证书链,但是有多种方法可以将链验证为受信任的根证书。如何完成此操作取决于SSL库和已知的受信任根证书:
[0] (*.s3.amazonaws.com)
|
[1] (Verisign G3) --------------------------\
| |
/------------------ [2] (Verisign G5 F4:A8:0A:0C:D1...) |
| |
| certificates sent by server |
.....|...............................................................|................
| locally trusted root certificates |
| |
[OT] Public PriMary Certification Authority [NT] Verisign G5 4E:B6:D5:78:49
OpenSSL library Google Chrome (NSS library)
但是问题仍然是,为什么您的验证不成功。您所做的就是获取浏览器使用的受信任的根证书(Verisign G5 4E:B6:D5:78:49)和OpenSSL。但是在浏览器(NSS)和OpenSSL中的验证工作略有不同:
由于存在这种细微的差异,OpenSSL无法针对根证书[NT]来验证链[0],[1],[2],因为该证书不会对链[2]中的最新元素进行签名,而是对[1]进行签名。如果服务器只发送了[0],[1]链,则验证将成功。
这是一个众所周知的错误,并且存在补丁,并且希望通过引入该X509_V_FLAG_TRUSTED_FirsT
选项最终在OpenSSL
1.0.2中最终解决该问题。
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)
即使根CA在第4行中正确打印,我仍然会收到CERTIFICATE_VERIFY_FAILED错误。
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
有什么想法如何使它与启用验证一起工作吗?
以上是大佬教程为你收集整理的Python Urllib2 SSL错误全部内容,希望文章能够帮你解决Python Urllib2 SSL错误所遇到的程序开发问题。
如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。
本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。