Python +自签名证书+ HTTP无法正常工作,但可以在C#中运行

时间:2018-06-20 20:16:22

标签: python ssl

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

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

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

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

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

有人在这里指出了这篇文章: generating cert for use with python requests getting PEM lib error

但是这个问题的答案没有解释或帮助了Python为何与众不同。在C#和Java中,我不需要ca-certificates.crt,也不确定如何从.p12为Python创建它的过程或过程。而且我敢肯定,我仍然需要传递答案根本不使用的crt.pem和key.pem,据我所知,这是特定于Python的(因为C#和Java都可以在本质上使用.p12,而无需任何黑客行为

因此,我按照IBM的这些说明将.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和certs有效)

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

谢谢

0 个答案:

没有答案