[英]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_file
和key_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.