我试图弄清楚如何用请求指定SSLContext。
我有两个函数,理论上应该做同样的事情,但其中一个与请求不工作。
def func_OK(token):
ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH,cafile='myCA.crt.pem')
ctx.load_cert_chain(certfile='myprivate.pem')
url = 'https://my_url.com'
hdr = {"Content-Type": "application/json","Authorization":"Bearer "+token}
data = '{"filterList":[{}]}'
bdata = data.encode('utf-8')
req = urllib.request.Request(url, headers=hdr)
resp = urllib.request.urlopen(req, data=bdata, context=ctx)
content = resp.read()
data = json.loads(content.decode('utf-8'))
个字符
这两个函数之间唯一的区别是sslContext。在func_NOK中,我尝试:
resp = requests.post(url,headers=hdr, data={"filterList":[{}]}, verify=False)
-它不工作resp = requests.post(url,headers=hdr, data={"filterList":[{}]}, cert=('myCA.crt.pem','myprivate.pem'))
-它不工作resp = requests.post(url,headers=hdr, data={"filterList":[{}]}, verify="concat_file.crt")
,“concat_file. crt”文件是“myCA.crt.pem”和“myprivate.pem”的串联
在任何情况下,我都有一个SSL错误。例如,在我的最后一个例子中,错误消息是:
requests.exceptions.ConnectionError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1131)
型
我只是想使用一个SSLContext与请求。
3条答案
按热度按时间vyswwuz21#
我使用以下方法解决了它:
字符串
vmpqdwk32#
字符串
load_cert_chain
加载证书和私钥以用作客户端证书-这将是requests
的cert
参数。cafile
描述了它应该用来验证服务器证书的CA-这将是请求的verify
参数。组合起来会导致:型
hyrbngr73#
我发现我的cacert.pem:/home/<soome_path>/pyEnv/myEnv/lib/python3.8/site-packages/certifici/cacert.pem
我连接了这些文件:myCA.crt.pem >> cacert.pem myprivate.pem>> cacert.pem
然后我使用verify指定路径:requests.post(...,verify ='/home/<soome_path>/pyEnv/myEnv/lib/python3.8/site-packages/certifici/cacert. pem')
我不再有ssl错误了。但是我检索到一个html msg而不是一个json。可能是我发送到端点的参数有问题。