我試圖弄清楚如何使用 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 中,我嘗試:
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 與請求一起使用。
uj5u.com熱心網友回復:
ctx = ssl.create_default_context(ssl.Purpose.CLIENT_AUTH,cafile='myCA.crt.pem') ctx.load_cert_chain(certfile='myprivate.pem')
load_cert_chain加載證書和私鑰以用作客戶端證書 - 這將cert是requests. cafile描述了它應該用來驗證服務器證書的 CA——這將是verify請求的引數。結合起來,這將導致:
requests.post(..., cert='myprivate.pem', verify='myCA.crt.pem')
uj5u.com熱心網友回復:
我在哪里找到我的 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。也許是我發送到端點的引數的問題。
uj5u.com熱心網友回復:
我使用以下方法解決了它:requests.post(url,headers=hdr,json={"filterList":[{}]}, cert='myprivate.pem')
轉載請註明出處,本文鏈接:https://www.uj5u.com/caozuo/427970.html
