我正试图弄清楚如何使用Request指定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'))
def func_NOK(token):
import requests
url = 'https://my_url.com'
hdr = {"Content-Type": "application/json","Authorization":"Bearer "+token}
data = '{"filterList":[{}]}'
bdata = data.encode('utf-8')
resp = requests.post(url,headers=hdr, data={"filterList":[{}]})
这两个函数之间唯一的区别是sslContext。在函数_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'))
-不起作用- CCD_ 3;concat_file.crt";文件"myCA.crt.pem"one_answers"myprivate.pem"的串联
在任何情况下,我都会出现SSL错误。例如,在我的最后一个例子中,错误消息是:
requests.exceptions.ConnectionError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1131)
我只是想在请求中使用SSLContext。
我使用以下方法解决了它:requests.post(url,headers=hdr,json={quot;filterList":[{}]},cert='myprivate.pem'(
ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH,cafile='myCA.crt.pem') ctx.load_cert_chain(certfile='myprivate.pem')
load_cert_chain
加载证书和私钥以用作客户端证书-这将是requests
的cert
参数。cafile
描述了它应该用来验证服务器证书的CA,这将是请求的verify
参数。这将导致:
requests.post(..., cert='myprivate.pem', verify='myCA.crt.pem')
我找到我的cacert.pem:/home/<soome_path>pyEnv/myEnv/lib/python3.8/site-packages/certific/cacert.pem
我连接了这些文件:myCA.crt.pem>gt;cacert.pemmyprivate.pem>gt;cacert.pem
然后我使用verify指定了路径:requests.post(…,verify='/home/<soome_path>/pyEnv/myEnv/lib/python3.8/site packages/certific/cacert.pem'(
我再也没有ssl错误了。然而,我检索的是一个html消息,而不是json。可能是我发送到端点的参数有问题。