Python 3 urllib忽略SSL证书验证
Python 3 urllib ignore SSL certificate verification
我有一个用于测试的服务器设置,带有自签名证书,并且希望能够对其进行测试。
Python3版本urlopen
如何忽略SSL验证?
我找到的所有关于此的信息一般都是关于 urllib2
或 Python 2。
urllib
in python 3 已从 urllib2
:
更改
Python 2、urllib2:urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
https://docs.python.org/2/library/urllib2.html#urllib2.urlopen
Python 3: urllib.request.urlopen(url[, data][, timeout])
https://docs.python.org/3.0/library/urllib.request.html?highlight=urllib#urllib.request.urlopen
所以我知道这可以通过以下方式在 Python 2 中完成。但是 Python 3 urlopen
缺少上下文参数。
import urllib2
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
urllib2.urlopen("https://your-test-server.local", context=ctx)
是的,我知道这是个坏主意。这仅用于在私人服务器上进行测试。
我无法在 Python 3 文档或任何其他问题中找到应该如何完成此操作。即使那些明确提到 Python 3 的人,仍然有 urllib2/Python 2.
的解决方案
Python 3.0 到 3.3 没有 context 参数,它是在 Python 3.4 中添加的。因此,您可以将 Python 版本更新为 3.5 以使用上下文。
接受的答案只是建议使用 python 3.5+,而不是直接回答。造成混乱。
对于寻找直接答案的人,这里是:
import ssl
import urllib.request
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
with urllib.request.urlopen(url_string, context=ctx) as f:
f.read(300)
或者,如果你使用 requests
库,它有更好的 API:
import requests
with open(file_name, 'wb') as f:
resp = requests.get(url_string, verify=False)
f.write(resp.content)
答案复制自此post(感谢@falsetru):
这两个问题应该合并。
我有一个用于测试的服务器设置,带有自签名证书,并且希望能够对其进行测试。
Python3版本urlopen
如何忽略SSL验证?
我找到的所有关于此的信息一般都是关于 urllib2
或 Python 2。
urllib
in python 3 已从 urllib2
:
Python 2、urllib2:urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])
https://docs.python.org/2/library/urllib2.html#urllib2.urlopen
Python 3: urllib.request.urlopen(url[, data][, timeout])
https://docs.python.org/3.0/library/urllib.request.html?highlight=urllib#urllib.request.urlopen
所以我知道这可以通过以下方式在 Python 2 中完成。但是 Python 3 urlopen
缺少上下文参数。
import urllib2
import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
urllib2.urlopen("https://your-test-server.local", context=ctx)
是的,我知道这是个坏主意。这仅用于在私人服务器上进行测试。
我无法在 Python 3 文档或任何其他问题中找到应该如何完成此操作。即使那些明确提到 Python 3 的人,仍然有 urllib2/Python 2.
的解决方案Python 3.0 到 3.3 没有 context 参数,它是在 Python 3.4 中添加的。因此,您可以将 Python 版本更新为 3.5 以使用上下文。
接受的答案只是建议使用 python 3.5+,而不是直接回答。造成混乱。
对于寻找直接答案的人,这里是:
import ssl
import urllib.request
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE
with urllib.request.urlopen(url_string, context=ctx) as f:
f.read(300)
或者,如果你使用 requests
库,它有更好的 API:
import requests
with open(file_name, 'wb') as f:
resp = requests.get(url_string, verify=False)
f.write(resp.content)
答案复制自此post(感谢@falsetru):
这两个问题应该合并。