我是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库来尝试建立连接(如下所示):
使用请求的代码段
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帖子都没用。
谢谢