我是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库来尝试建立连接(如下所示):
使用请求的代码段
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,很难相信它不是必需的。
答案 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