【发布时间】:2016-04-18 11:22:56
【问题描述】:
情况: 目标站点(例如,预生产 URL,例如 https://my-pre-prod-site.com/login)正在使用自签名证书。 从浏览器中,可以通过 https 毫无问题地访问该站点(通过将证书添加到浏览器中的信任库来抑制自签名证书警告)
问题陈述: 使用请求对目标站点进行 get 调用的简单 python 脚本在不同情况下会失败,并出现以下错误:
requests.exceptions.SSLError: [Errno 0] _ssl.c:344: error:00000000:lib(0):func(0):reason(0)
或
requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 (_ssl.c:590) 使用的简单脚本(在 python 提示符下)是:
import requests
res = requests.get('https://my-pre-prod-site.com/login')
**已经尝试过的东西**
- 我确实不想跳过 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
和
openssl x509 -pubkey -noout -in ~/Desktop/CertPath/certificate.pem
脚本从 ~/Desktop/CertPath 运行,因此 getcwd() 提供了证书的正确路径。
- 我还尝试了另一个 test.pem 文件,其中串联顺序颠倒了。它仍然会引发相同的错误。
- 已尝试分别(单独)传递保存公钥的 .pem 文件和保存私钥的 .key 文件,但错误与结果相同。
环境详情(如果有帮助)
操作系统 - ElCapitan 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
【问题讨论】:
-
作为一种解决方法,也许您可以使用 Let's Encrypt?并且您的开发配置将更接近您的产品。
标签: python-2.7 https openssl python-requests