将自签名证书与python中的请求一起使用

qre*_*0ct 4 https openssl python-2.7 python-requests

情况: 目标站点(例如pre-prod URL,例如https://my-pre-prod-site.com/login)正在使用自签名证书。从浏览器可以通过https访问该站点,而不会出现任何问题(通过将证书添加到浏览器的信任库中来抑制自签名证书警告)

问题陈述: 一个简单的python脚本使用请求对目标站点进行get调用会失败,并在不同情况下出现以下任一错误:

requests.exceptions.SSLError:[Errno 0] _ssl.c:344:错误:00000000:lib(0):func(0):原因(0)

要么

request.exceptions.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:590)(在python提示符下)使用的简单脚本为:

import requests
res = requests.get('https://my-pre-prod-site.com/login')
Run Code Online (Sandbox Code Playgroud)

**已经尝试过的东西**

  1. 不是想跳过SSL验证。因此,对我来说,verify = false不是一个选择。
  2. 我已经使用了以下错误

res = requests.get('https://my-pre-prod-site.com/login', verify = os.path.join(os.getcwd(),'test.pem') 其中,test.pem是通过按以下顺序连接以下命令的输出而创建的pem文件:

openssl rsa-在〜/ Desktop / CertPath / private.key -check中

openssl x509 -pubkey -noout -in〜/桌面/CertPath/certificate.pem

该脚本是从〜/ Desktop / CertPath运行的,因此getcwd()提供了证书的正确路径。

  1. 我还尝试了另一个test.pem文件,其中的连接顺序相反。它仍然引发相同的错误。
  2. 尝试分别(单独地)传递包含公钥的.pem文件和包含私钥的.key文件,并且错误与结果相同。

环境详细信息是否有帮助

操作系统-ElCapitan Mac
请求-2.9.0
Python-
Python使用的2.7.10 OpenSSL -'OpenSSL 0.9.8zg 2015年7月14日'

注意-openssl版本似乎不是问题。因为即使使用了opensl的​​更新版本,错误也是相同的-在Ubuntu上使用Openssl 1.x的Python 2.6进行了测试

小智 5

这个问题很旧,但是如果有人在这里想知道的话。

您正在将私钥和公钥放入test.pem。错了 验证参数所需的是它可以信任的证书。

res = requests.get('https://my-pre-prod-site.com/login', verify = os.path.join(os.getcwd(),'test.pem')
Run Code Online (Sandbox Code Playgroud)

test.pem应该包含所有受信任证书的列表。但是,您在test.pem中提供的是您的公钥和私钥。您在〜/ Desktop / CertPath / certificate.pem文件本身应该放入其中。

尝试这个:

res = requests.get('https://my-pre-prod-site.com/login', verify = '~/Desktop/CertPath/certificate.pem')
Run Code Online (Sandbox Code Playgroud)


mpr*_*net -1

为了指定 SSL 验证的证书,您可以使用:

requests.get('https://my-pre-prod-site.com/login', cert=os.path.join(os.getcwd(),'test.pem'))
Run Code Online (Sandbox Code Playgroud)

  • 已经尝试过了。不起作用。同样的错误仍然存​​在。 (2认同)