簡體   English   中英

在 urllib3 中使用證書

[英]Using certificates in urllib3

我是 Python 新手。 我正在使用 urllib3 與 api 對話。 我使用它而不是請求的原因是我想在 GAE 上托管我的應用程序。 我的應用程序使用證書。 當我發布數據時,出現以下錯誤:

TypeError: __init__() got an unexpected keyword argument 'cert_reqs'

如何在我的 urlopen 調用中包含證書? 一段代碼如下

CA_CERTS = ('client-2048.crt', 'client-2048.key')

http = urllib3.PoolManager()
r = http.urlopen('POST', url, body=payload, headers={'X-Application': '???', 'Content-Type': 'application/x-www-form-urlencoded'}, cert_reqs='REQUIRED', ca_certs=CA_CERTS)
print r.status, r.data

您可以下拉到可以直接執行的HTTPSConnectionPool級別:

from urllib3.connectionpool import HTTPSConnectionPool
conn = HTTPSConnectionPool('httpbin.org', ca_certs='/etc/pki/tls/cert.pem', cert_reqs='REQUIRED')

或者,更簡單地或通過connection_from_url()輔助函數:

conn = urllib3.connection_from_url('https://httpbin.org', ca_certs='/etc/pki/tls/cert.pem', cert_reqs='REQUIRED')

請注意, ca_certs是用於驗證遠程服務器證書的證書包的文件名。 使用cert_filekey_file將您的客戶端證書提供給遠程服務器:

conn = urllib3.connection_from_url('https://httpbin.org', cert_file='client-2048.crt', key_file='client-2048.key', ca_certs='/etc/pki/tls/cert.pem', cert_reqs='REQUIRED')

然后發出您的請求:

response = conn.request('POST', 'https://httpbin.org/post', fields={'field1':1234, 'field2':'blah'})
>>> print response.data
{
  "args": {},
  "data": "",
  "files": {},
  "form": {
    "field1": "1234",
    "field2": "blah"
  },
  "headers": {
    "Accept-Encoding": "identity",
    "Connection": "close",
    "Content-Length": "220",
    "Content-Type": "multipart/form-data; boundary=048b02ad15274fc485c2cb2b6a280034",
    "Host": "httpbin.org",
    "X-Request-Id": "92fbc1da-d83e-439c-9468-65d27492664f"
  },
  "json": null,
  "origin": "220.233.14.203",
  "url": "http://httpbin.org/post"
}

您應該將cert_reqs='REQUIRED'ca_certs=CA_CERTS args 直接傳遞給PoolManager()實例化。

所以原來的例子可以改成這樣:

CA_CERTS = ('client-2048.crt', 'client-2048.key')

http = urllib3.PoolManager(cert_reqs='REQUIRED', ca_certs=CA_CERTS)

r = http.urlopen('POST', url, body=payload, headers={'X-Application': '???', 'Content-Type': 'application/x-www-form-urlencoded'})
print r.status, r.data

除了其他答案之外,傳遞User-Agent標頭似乎對我有幫助

不確定這是否是一種常見行為,但在使用自簽名證書且不User-Agent執行 HTTPS 請求時,我的服務器會返回403 - Access denied錯誤。

當忽略證書(即使用空的ssl.SSLContext )時,不需要User-Agent標頭,請求會成功。 只有在使用ca_certs參數傳遞自簽名證書時,我才需要包含User-Agent

http = urllib3.PoolManager(cert_reqs='REQUIRED', ca_certs='/path/to/cacert.pem')
r = http.urlopen('GET', url, headers={'User-Agent': 'myapp/v0.1.0'})
print(r.data)

我找不到任何說明為什么在使用自簽名證書時可能需要User-Agent來源。 對這一點的任何澄清都是最受歡迎的。

在此處閱讀有關User-Agent標頭的更多信息。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM