Python +自签名证书+ HTTP不起作用,但可以在C#,Java中使用

时间:2018-06-20 15:42:01

标签: python ssl

我是Python的新手,并且已经为此苦苦挣扎了几个小时,所以我认为社区中的某个人可以提供帮助。

我有来自第三方企业的自签名证书,该证书不是有效的CA。

我已经创建了.p12,并且 SUCCESSFULLY 能够使用C#和.net(出色)连接到所述第三方的HTTP服务器。

使用相同的.p12,我可以创建一个密钥库,导入密钥,并使用Java HttpsURLConnection成功连接到第三方的HTTP服务器(也很棒)。

不幸的是,用Python做到这一点并不简单!

我已按照以下说明将.p12拆分为key.pem和cert.pem https://www.ibm.com/support/knowledgecenter/en/SSZRJV_10.1.0/admin_guide/pac_x509_web_services_python_convert.html

我尝试了以下Python http库来尝试建立连接(如下所示):

  • 导入请求
  • 导入http.client.HTTPSConnection
  • 导入httplib2

使用请求的代码段

import requests 
r = requests.get(url, cert=('crt.pem', 'key_nopass.pem'))
print(r.text)

使用httplib2的代码段(来自IBM示例) https://www.ibm.com/support/knowledgecenter/SSZRJV_10.1.0/admin_guide/pac_x509_web_services_test.html

import httplib2
http = httplib2.Http()
http.add_certificate('key_nopass.pem', 'crt.pem', '')
response, content = http.request(url, 'GET')
print(content)

使用这些库中的任何一个,都会出现以下错误:

OpenSSL.SSL.Error:[('SSL例程','ssl3_get_server_certificate',  '证书验证失败')]

如果有人能指出我正确的方向或告诉我我做错了什么,我将不胜感激。相当令人沮丧,因为正如我提到的那样,相同的简单HTTP调用可以在C#和Java中正常工作(所以我知道p12和证书是有效的)

我尝试过+使用许多不同的stackoverflow帖子都没用。

谢谢

PS @Steffen Ulrich,一点都不重复。您链接到的帖子说要使用CA文件。不需要将CA文件用于Java或C#。因此,如果您能解释一下创建CA文件的过程(显然是python需要的),那就太好了。

另外,您链接的帖子也没有提及crt.pem和key.pem,很难相信它不是必需的。

1 个答案:

答案 0 :(得分:0)

尝试使用“获取证书”。

yourcode.py:

import requests 
r = requests.get(url)
print(r.text)

现在安装get-cert软件包并运行代码:

pip3 install get-cert
python3 -m get_cert https://your.example.net > cert.pem
REQUESTS_BUNDLE_CA=./cert.pem python3 yourcode.py