情况 :目标站点(预产品 URL,例如https://my-pre-prod-site.com/login https://my-pre-prod-site.com/login,例如)正在使用自签名证书。
从浏览器中,可以通过 https 访问该站点,不会出现任何问题(通过将证书添加到浏览器中的信任存储区可以抑制自签名证书警告)
问题陈述 :使用请求对目标站点进行 get 调用的简单 python 脚本失败,并在不同情况下出现以下错误之一:
requests.exceptions.SSLError:[Errno 0] _ssl.c:344:错误:00000000:lib(0):func(0):reason(0)
or
requests.exceptions.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:590)
使用的简单脚本(在 python 提示符下)是:
import requests
res = requests.get('https://my-pre-prod-site.com/login')
**已经尝试过的事情**
- I do NOT想要跳过 ssl 验证。因此, verify = false 对我来说不是一个选择。
- 我已经使用了下面的内容,但出现了同样的错误
res = requests.get('https://my-pre-prod-site.com/login', verify = os.path.join(os.getcwd(),'test.pem')
其中 test.pem 是通过按顺序连接以下命令的输出创建的 pem 文件:
openssl rsa -in ~/Desktop/CertPath/private.key -check
and
openssl x509 -pubkey -noout -in ~/Desktop/CertPath/certificate.pem
该脚本从 ~/Desktop/CertPath 运行,因此 getcwd() 给出了证书的正确路径。
- 我还尝试了另一个 test.pem 文件,其中连接顺序相反。它仍然抛出相同的错误。
- 已尝试分别(单独)传递保存公钥的 .pem 文件和保存私钥的 .key 文件,结果与结果相同。
环境详细信息(如果有帮助)
操作系统 - El Capitan Mac
请求 - 2.9.0
Python - 2.7.10
Python 使用 OpenSSL -“OpenSSL 0.9.8zg 2015 年 7 月 14 日”
注意 - openssl 版本似乎不是问题。因为即使使用 openssl 的更新版本,错误也是相同的 - 在 Ubuntu 上测试
与使用 Openssl 1.x 的 Python 2.6