我获得了一个pem证书,可以通过第三方进行身份验证。使用证书进行身份验证对我来说是一个新概念。
里面有两个证书和一个私钥。
发卡机构建议他们不支持SSL验证,但使用TLS(1.1/1.2(。
我运行了如下脚本:
import requests as req
import json
url = 'https://url.com/call'
certificate_file = "C:/certs/cert.pem"
headers = {"Content-Type": "application/json"}
req_body ={
"network":{
"network_id": 12345
},
"branch":{
"branch_id": 12345,
},
"export_period":{
"start_date_time": "16-11-2021 00:00:00",
"end_date_time": "17-11-2021 00:00:00"
}
}
jsonObject = json.dumps(req_body)
response = req.post(url,headers=headers,params=jsonObject,verify=certificate_file)
我得到以下错误:
SSLError:HTTPSConnectionPool(host='url.com,port=443(:url:/call超过了最大重试次数?%7B%22network%22:%20%7B%22network_id%22:%2012345%7D,%20%22branch%22:%20%7B%22branch_id%22:%12345%7%D,%20%22export_period%22:%20%7B%22start_date_time%22:%20:2216-11-2021%2000:00:00%22,%20%22end_date_time%22:%20%2217-11-2021%2000:00:00%22%7D%7D(由SSLError(SSLCertVerificationError(1,'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地颁发者证书(_SSL.c:1123('(引起(
非常感谢指导,我的直觉说我应该为TLS做一些特定的事情,因此出现了SSL错误。
颁发者使用的是最新版本的HTTPS-SSL是常用术语,但TLS是更正确的术语。听起来他们的设置是正确的——这意味着你需要使用可信的客户端证书来调用它,作为HTTPS请求的一部分。
我建议您首先使用curl工具来完成这项工作,这样您就可以验证API是否按预期工作。
curl -s -X GET "https://api.example.com/test"
--cert ./certs/example.client.pem
--key ./certs/example.client.key
--cacert ./certs/ca.pem
-H "Content-Type: application/json"
如上所述,将证书拆分为单独的文件。听起来其中一个是根证书颁发机构,您需要告诉客户端技术堆栈要信任它——对于curl,这是使用如上所述的cacert
参数完成的。
一旦这起作用,您就可以在Python请求库中使用相同的方法。我相信这使用了像这样的cert
和verify
参数。所以看起来你的代码不远了。
result = requests.get(
'https://api.example.com',
cert=('example.pem', 'example.key'),
verify='ca.pem')
有关MUTUAL TLS的更多信息
出于兴趣,如果你想揭开Mutual TLS的神秘面纱并了解更多信息,请查看这些高级Curity资源:
- 双向TLS安全API
- 代码示例
其中包括一个可以运行的OpenSSL脚本,以查看分离的证书文件应该是什么样子。
发行人已建议他们不支持SSL验证
对我来说,这听起来很危险,但如果真的是这样的话,一个简单的
verify=False
应该做到这一点。注意:这将完全禁用此调用的SSL证书验证。
此外,如果你仍然想要SSL证书(从我的评论中粘贴的副本(:
我认为你不需要对TLS做任何事情,这通常是在建立连接时进行的。相反,它似乎在证书中的某个位置(不正确或自签名且未验证(,或者您在链中缺少一个中间证书。或者,您的CA(证书颁发机构(列表可能不完整。我从未在python中使用过这个,但显然有一些方法可以使用certifi
更新它。相关SO问题中提供了相关文档。
我发现了一个有答案的类似问题。看起来系统安全库可能在链中找不到证书,因为";只有存储在cacert.pem中的证书链才被认为是有效的">