Python 请求自签名证书

0 投票
1 回答
49 浏览
提问于 2025-04-14 18:19

我知道之前有很多关于这个问题的讨论,但里面提到的解决方案对我都没用。
我想使用一个自签名的证书。在我的测试机器上,我添加了一个私有的CA(证书颁发机构),把它的 ca.pem 文件放到了 /usr/local/share/ca-certificates/ca.crt,然后当我运行 curl https://example.com:80000/health 时,得到了有效的输出。

我希望用Python做到同样的事情。我使用的是Python 3.10.12。
certifi.where() 返回的是 /home/normal/.local/lib/python3.10/site-packages/certifi/cacert.pem

我遇到的错误是:

requests.exceptions.SSLError: HTTPSConnectionPool(host='example.com', port=8000): Max retries exceeded with url: /health (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self-signed certificate in certificate chain (_ssl.c:1007)')))

我尝试了很多方法,比如:

设置 REQUESTS_CA_BUNDLE 的路径

ca_path = os.path.join(
    '/usr/local/share/ca-certificates/',
    'ca.crt')
print(ca_path)
os.environ['REQUESTS_CA_BUNDLE'] = ca_path

把验证设置为私有CA的路径

response = requests.post(url, verify=ca_path)

把验证设置为证书的路径

response = requests.post(url, verify=certifi.where())

创建一个 fullchain.pem 文件,并把验证设置为这个路径

cat cert.pem > fullchain.pem
cat ca.pem >> fullchain.pem
response = requests.post(url, verify='./fullchain.pem')

certifi.where() 显示的路径,添加 ca.pemcert.pem 文件

cd /home/<usr>/.local/lib/python3.10/site-packages/certifi

cp cacert.pem cacert.pem.bak
cat cacert.pem.bak <(echo) ca.pem <(echo) cert.pem > cacert.pem

理想情况下,我希望能以这种方式进行操作,这样我就可以使用Azure函数来运行我的Python代码。

1 个回答

0

我意识到我犯了个错误。在创建捆绑包的时候,两个证书之间需要有一个换行符。所以

echo "" >> cacert.pem cat ca.pem >> cacert.pem echo "" >> cacert.pem cat cert.pem >> cacert.pem response = requests.post(url, verify=certifi.where())

也可以使用

requests.post(url, verify='./certificate_bundle.pem')

这个也可以像上面那样创建。

撰写回答