0

我试图弄清楚如何使用 Request 指定 SSLContext。

我有两个功能理论上应该做同样的事情,但是带有 Requests 的那个不起作用。

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。在 func_NOK 中,我尝试:

  1. resp = requests.post(url,headers=hdr, data={"filterList":[{}]}, verify=False)- 它不起作用
  2. resp = requests.post(url,headers=hdr, data={"filterList":[{}]}, cert=('myCA.crt.pem','myprivate.pem'))- 它不起作用
  3. 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 与请求一起使用。

4

3 回答 3

0

我使用以下方法解决了它:requests.post(url,headers=hdr,json={"filterList":[{}]}, cert='myprivate.pem')

于 2022-02-08T22:18:05.780 回答
0

我在哪里找到我的 cacert.pem : /home/<soome_path>/pyEnv/myEnv/lib/python3.8/site-packages/certifi/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/certifi/cacert.pem')

而且我不再有 ssl 错误。但是,我检索的是 html 味精而不是 json。也许是我发送到端点的参数的问题。

于 2022-02-07T20:26:41.420 回答
0
ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH,cafile='myCA.crt.pem')
ctx.load_cert_chain(certfile='myprivate.pem')

load_cert_chain加载证书和私钥以用作客户端证书 - 这将certrequests. cafile描述了它应该用来验证服务器证书的 CA——这将是verify请求的参数。结合起来,这将导致:

requests.post(..., cert='myprivate.pem', verify='myCA.crt.pem')
于 2022-02-07T17:06:05.323 回答