我正在尝试使用Python3的urllib.request
模块中的urlopen
方法打开https URL。它似乎工作得很好,但是文档警告说“如果没有指定cafile
和capath
,HTTPS请求将不会对服务器的证书进行任何验证”。
我猜,如果我不希望我的程序容易受到中间人攻击、被吊销的证书问题和其他漏洞的攻击,我需要指定其中一个参数。
cafile
和capath
应该指向证书列表。我该从哪里得到这份清单呢?是否有什么简单且跨平台的方法可以使用与我的操作系统或浏览器相同的证书列表?
发布于 2016-01-29 03:02:11
我找到了一个能做我想做的事情的库:Certifi。它可以通过从命令行运行pip install certifi
来安装。
现在很容易发出请求并验证它们:
import certifi
import urllib.request
urllib.request.urlopen("https://example.com/", cafile=certifi.where())
正如我所料,这将为具有有效证书的站点返回一个HTTPResponse
对象,并为具有无效证书的站点引发ssl.CertificateError
异常。
发布于 2019-05-16 03:23:32
适用于python 2.7及更高版本
context = ssl.create_default_context(cafile=certifi.where())
req = urllib2.urlopen(urllib2.Request(url, body, headers), context=context)
发布于 2014-06-24 13:09:33
您可以在http://curl.haxx.se/docs/caextract.html下载适用于urllib的格式(例如,PEM格式)的证书Mozilla
https://stackoverflow.com/questions/24374400
复制相似问题