Python 3 urllib忽略SSL证书验证

nbewdwxp  于 2023-06-23  发布在  Python
关注(0)|答案(3)|浏览(231)

我有一个用于测试的服务器设置,带有自签名证书,并希望能够对其进行测试。

如何在urlopen的Python 3版本中忽略SSL验证?

我找到的关于这个的所有信息都是关于urllib2或Python 2的。
python 3中的urllib已经从urllib2改变:

Python 2,urllib2urllib2.urlopen(url[, data[, timeout[, cafile[, capath[, cadefault[, context]]]]])

https://docs.python.org/2/library/urllib2.html#urllib2.urlopen

Python 3:https://docs.python.org/3.0/library/urllib.request.html?highlight=urllib#urllib.request.urlopen

所以我知道这可以在Python 2中通过以下方式完成。Python 3 urlopen缺少context参数。

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的人,仍然有一个urllib 2/Python 2的解决方案。

6l7fqoea

6l7fqoea1#

接受的答案只是建议使用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)

答案来自这篇文章(感谢@falsetru):How do I disable the ssl check in python 3.x?
这两个问题应该合并。

vxqlmq5t

vxqlmq5t2#

Python 3.0到3.3没有context参数,它是在Python 3.4中添加的。因此,您可以将Python版本更新到3.5以使用上下文。

nszi6y05

nszi6y053#

您可以在创建PoolManagerProxyManager对象时指定cert_reqs='CERT_NONE'
例如:

proxy = urllib3.ProxyManager("https://localhost:8443", cert_reqs='CERT_NONE')

pool = urllib3.PoolManager(cert_reqs='CERT_NONE')

相关问题