import requests
data = {'foo':'bar'}
url = 'https://foo.com/bar'
r = requests.post(url, data=data)
如果 URL 使用自签名证书,则会失败
requests.exceptions.SSLError: [Errno 1] _ssl.c:507: error:14090086:SSL routines:SSL3_GET_SERVER_CERTIFICATE:certificate verify failed
我知道我可以将
False
传递给
verify
参数,如下所示:
r = requests.post(url, data=data, verify=False)
但是,我想要做的是将请求指向磁盘上的公钥副本并告诉它信任该证书。
可以按照以下步骤在 Python Requests 中信任自签名证书:
1. 获取自签名证书:
可以通过多种方式获取证书,具体取决于的设置:
- 从浏览器下载: 导航到使用该证书的网站,单击地址栏中的锁图标,查看证书详细信息并将其导出为 PEM 格式。
-
使用 OpenSSL 命令:
如果有权访问服务器,可以使用以下命令获取证书:
bash openssl s_client -showcert -connect example.com:443 < /dev/null | openssl x509 -outform PEM > certificate.pem
将example.com:443
替换为的域名和端口。
2. 使用
verify
参数指定证书路径:
在的 Python 代码中,将证书文件的路径传递给
verify
参数:
import requests
url = 'https://foo.com/bar'
data = {'foo': 'bar'}
# 将 'path/to/certificate.pem' 替换为证书文件的实际路径
r = requests.post(url, data=data, verify='path/to/certificate.pem')
# 检查响应
print(r.text)
这将告诉 Requests 使用提供的证书来验证服务器的 SSL 证书。
重要提示:
- 安全风险: 禁用 SSL 验证或信任自签名证书会使的应用程序面临安全风险。仅当完全控制服务器并在测试环境中工作时才这样做。
- 证书路径: 确保提供证书文件的正确路径。
- 证书格式: Requests 库支持 PEM 格式的证书。如果的证书采用其他格式,请先将其转换为 PEM。
通过这些步骤,就可以在不完全禁用 SSL 验证的情况下,让的 Python Requests 代码信任自签名证书。但是,请记住相关的安全风险,并尽可能使用受信任的证书颁发机构签署的证书。
标签:python,ssl,python-requests From: 30405867