2016-01-13 112 views
4

现状: 目标网站(一个PROD预网址,说https://my-pre-prod-site.com/login,例如)使用自签名证书。 从浏览器,该网站是没有任何问题的,在蟒蛇请求使用自签名证书

问题说明(自签名证书的警告是通过在浏览器中的证书信任存储抑制)通过HTTPS访问: 一个简单的Python脚本使得get调用使用请求目标站点失败,或者在不同的情况下,以下错误:

requests.exceptions.SSLError: [Errno 0] _ssl.c:344: error:00000000:lib(0):func(0):reason(0)

requests.exceptions.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590) The simple script used (on the python prompt) is :

import requests 
res = requests.get('https://my-pre-prod-site.com/login') 

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

  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 -in ~/Desktop/CertPath/private.key -check

openssl x509 -pubkey -noout -in ~/Desktop/CertPath/certificate.pem

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

  1. 我试过另一个test.pem文件,以及连接顺序颠倒的地方。它仍然会抛出同样的错误。
  2. 已尝试传递持有公钥的.pem文件和持有私钥的.key文件,分别(单独)以及与结果相同的错误。

环境的详细信息,如果有帮助

OS - ElCapitan苹果
要求 - 2.9.0
Python的 - 2.7.10
正在使用Python的 OpenSSL的 - “OpenSSL的0.9.8zg 7月14日2015'

注 - openssl版本似乎不成问题。因为即使使用OpenSSL的更新版本,这些错误都是一样的 - 与Python 2.6在Ubuntu 测试了使用OpenSSL 1.x的

+0

作为一种变通方法,也许你可以使用我们的加密?你的开发配置将更接近你的产品。 – Tom

回答

2

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

您正在将私钥和公钥放入test.pem。这是错误的。验证param要求的是它可以信任的证书。

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

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

试试这个:

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