Mar*_*ppi 5 python urllib3 python-3.x
我正在使用urllib3来对付具有自签名证书的私有服务.有没有办法让urllib3忽略证书错误并提出请求呢?
import urllib3
c = urllib3.HTTPSConnectionPool('10.0.3.168', port=9001)
c.request('GET', '/')
Run Code Online (Sandbox Code Playgroud)
使用以下内容时:
import urllib3
c = urllib3.HTTPSConnectionPool('10.0.3.168', port=9001, cert_reqs='CERT_NONE')
c.request('GET', '/')
Run Code Online (Sandbox Code Playgroud)
引发以下错误:
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
File "/usr/lib/python3/dist-packages/urllib3/request.py", line 67, in request
**urlopen_kw)
File "/usr/lib/python3/dist-packages/urllib3/request.py", line 80, in request_encode_url
return self.urlopen(method, url, **urlopen_kw)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 415, in urlopen
body=body, headers=headers)
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 267, in _make_request
conn.request(method, url, **httplib_request_kw)
File "/usr/lib/python3.3/http/client.py", line 1061, in request
self._send_request(method, url, body, headers)
File "/usr/lib/python3.3/http/client.py", line 1099, in _send_request
self.endheaders(body)
File "/usr/lib/python3.3/http/client.py", line 1057, in endheaders
self._send_output(message_body)
File "/usr/lib/python3.3/http/client.py", line 902, in _send_output
self.send(msg)
File "/usr/lib/python3.3/http/client.py", line 840, in send
self.connect()
File "/usr/lib/python3/dist-packages/urllib3/connectionpool.py", line 103, in connect
match_hostname(self.sock.getpeercert(), self.host)
File "/usr/lib/python3/dist-packages/urllib3/packages/ssl_match_hostname/__init__.py", line 32, in match_hostname
raise ValueError("empty or no certificate")
ValueError: empty or no certificate
Run Code Online (Sandbox Code Playgroud)
使用cURL我能够从服务中获得预期的响应
$ curl -k https://10.0.3.168:9001/
Please read the documentation for API endpoints
Run Code Online (Sandbox Code Playgroud)
fre*_*dev 15
在这个问题中,我看到了很多答案,但是,恕我直言,太多不必要的信息可能会导致混乱。
只需添加cert_reqs='CERT_NONE'参数即可
import urllib3
http = urllib3.PoolManager(cert_reqs='CERT_NONE')
Run Code Online (Sandbox Code Playgroud)
请尝试以下代码:
import urllib3
c = urllib3.HTTPSConnectionPool('10.0.3.168', port=9001, cert_reqs='CERT_NONE',
assert_hostname=False)
c.request('GET', '/')
Run Code Online (Sandbox Code Playgroud)
请参阅将assert_hostname设置为False将禁用SSL主机名验证
小智 5
我找到了问题的答案。事实上,urllib3 文档并没有完全解释如何抑制 SSL 证书验证。缺少的是对 ssl.CERT_NONE 的引用。
我的代码有一个布尔值 ssl_verify,用于指示我是否需要 SSL 验证。代码现在看起来像这样:
import ssl
import urllib3
#
#
#
if (ssl_verify):
cert_reqs = ssl.CERT_REQUIRED
else:
cert_reqs = ssl.CERT_NONE
urllib3.disable_warnings()
http = urllib3.PoolManager(cert_reqs = cert_reqs)
auth_url = f'https://{fmc_ip}/api/fmc_platform/v1/auth/generatetoken'
type = {'Content-Type': 'application/json'}
auth = urllib3.make_headers(basic_auth=f'{username}:{password}')
headers = { **type, **auth }
resp = http.request('POST',
auth_url,
headers=headers,
timeout=10.0)
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
13874 次 |
| 最近记录: |