certifi软件包在Python中提供了Mozilla的CA绑定。
Python certifi
Python Certifi提供了Mozilla彻底策划的根证书集合,用于验证SSL证书的可信度,同时验证TLS主机的身份。它是从Requests 项目中摘取的。Python Requests 库默认使用它自己的 CA 文件,如果安装了certifi包,则会使用certifi包的证书包。
安装 Python certifi
要安装 python certifi 包,你必须输入以下命令:
python3 -m pip install certifi
# OR
pip install certifi
如果你已经安装了request库,那么certifi库有100%的可能也被安装了,但你必须检查一下。所以,如果你输入了下面的命令,那么要么它将告诉我们已经满足了要求,要么它将安装在你的机器上。
虽然有可能将你自己的CA捆绑包传递给Requests以覆盖默认的CA,但有几个第三方软件包在引擎下使用Requests,你没有办法告诉它们使用自定义的验证位置。
在你的 Python 项目中使用 certifi
要引用已安装的证书授权(CA)捆绑包,你可以使用内置函数:
import certifi
print(certifi.where())
输出
/Users/krunal/Library/Python/3.8/lib/python/site-packages/certifi/cacert.pem
你也可以使用下面的命令从命令行中找到cacert.pem路径:
python -m certifi
/Users/krunal/Library/Python/3.8/lib/python/site-packages/certifi/cacert.pem
浏览器和证书颁发机构已经最终确定,1024位密钥对于证书,特别是根证书来说是不可接受的弱点。
出于同样的原因,Mozilla已经从其捆绑的证书中删除了任何弱(即1024位密钥)的证书,取而代之的是来自同一CA的同等强大(即2048位或更高密钥)证书。
注意:Certifi不支持对CA信任存储内容的任何添加/删除或其他修改。
如果你把额外的证书放在PEM捆绑文件中,你可以使用这两个环境变量来覆盖Python OpenSSL和Requests使用的默认证书存储:
SSL_CERT_FILE=/System/Library/OpenSSL/cert.pem
REQUESTS_CA_BUNDLE=/System/Library/OpenSSL/cert.pem
然而,我们可以在我们的脚本启动时快速检查,如果有必要,用给定的 CA 自动更新 CA 捆绑文件。
首先,捕获你的自定义 CA 并将其保存为 PEM f你可以使用 OpenSSL ife 来转换它。
如果你只有一个.cer、.crt、或.derenSSL:
openssl x509 -inform der -in certificate.cer -out certificate.pem
如果你有多个自定义的中间人或根,你可以在完成全部转换后,将它们全部加入到单一的.pem文件中。
把certificate.pem拖到你项目的根目录中。
现在,我们要尝试请求目标URL。 在我们的例子中,它是一个Github的API,如果我们遇到证书错误,就更新Certifi正在使用的CA捆绑:
import certifi
import requests
try:
print('Checking connection to Github...')
test = requests.get('https://api.github.com')
print('Connection to Github OK.')
except requests.exceptions.SSLError as err:
print('SSL Error. Adding custom certs to Certifi store...')
cafile = certifi.where()
with open('certicate.pem', 'rb') as infile:
customca = infile.read()
with open(cafile, 'ab') as outfile:
outfile.write(customca)
print('That might have worked.')
输出
Checking connection to Github...
Connection to Github OK.
这就是Python certifi的例子了。