【发布时间】:2021-12-28 16:44:04
【问题描述】:
我已获得一个 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:%2012345%7D,%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 错误。
【问题讨论】:
-
我认为你不需要对 TLS 做任何事情,这通常会在连接建立时被拾取。相反,它似乎位于证书中的某个位置(不正确或自签名且未验证),或者您缺少链中的中间证书。或者,您的 CA(证书颁发机构)列表可能不完整。我从未在 python 中使用过它,但显然有办法更新它(参见:stackoverflow.com/questions/51925384/…)
-
另外,不使用 SSL 验证会有很大的风险。如果这确实是“解决方案”,那么您只需在帖子中声明“verify=False”即可。
-
请您显示两个证书的主题和颁发者哈希:
openssl x509 -in <filename> -noout -subject_hash和-issuer_hash类似。这将有助于显示它们之间的关系。
标签: python rest python-requests