vaF*_*art 3 python ssl urllib self-signed python-3.x
我正在尝试使用Python从内部服务器下载一些数据.由于它是内部的,因此它使用自签名证书.(我们不想向Verisign支付那些永远不会出现的服务器.)Python 2.6版本的代码运行良好.
response = urllib2.urlopen(URL)
data = csv.reader(response)
Run Code Online (Sandbox Code Playgroud)
我现在正在尝试更新到Python 3.4(长话,不要问.)但是,使用Python 3的urllib失败:
response = urllib.request.urlopen(URL)
Run Code Online (Sandbox Code Playgroud)
它会抛出CERTIFICATE_VERIFY_FAILED错误.
urllib.error.URLError: <urlopen error [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:600)>
Run Code Online (Sandbox Code Playgroud)
在网上阅读时,显然Python 2.6 urllib2并不打算验证证书.某些版本的urllib允许将"verify = False"传递给方法签名,但这似乎不适用于Python 3.4.
有谁知道我怎么能解决这个问题?由于公司安全准则,我想避免使用Requests包.
使用以下命令禁用URL的SSL证书验证
import ssl
myssl = ssl.create_default_context();
myssl.check_hostname=False
myssl.verify_mode=ssl.CERT_NONE
urlopen("URL",context=myssl)
Run Code Online (Sandbox Code Playgroud)
使用以下命令禁用所有URL的SSL证书验证
ssl._create_default_https_context = ssl._create_unverified_context
urlopen("URL");
Run Code Online (Sandbox Code Playgroud)
urllib.request.urlopen有一个接受SSLContext对象的 context 关键字参数。因此,传递.verify_mode设置为ssl.CERT_NONE 的SSLContext对象,即应该等于SSLContext.verify_mode = ssl.CERT_NONEverify=False
由于当我在谷歌上搜索“CERTIFICATE_VERIFY_FAILED error”时,这个答案仍然首先弹出,我想提供一个更新:完全关闭 SSL 验证通常不是一个好的做法(我将在下面给出一个原因)。最好将自签名证书添加到本地受信任的证书中,而不是完全停用验证:
import ssl
# add self_signed cert
myssl = ssl.create_default_context()
myssl.load_verify_locations('my_server_cert.pem')
# send request
response = urllib.request.urlopen("URL",context=myssl)
Run Code Online (Sandbox Code Playgroud)
NIST 和其他网络安全组织推荐零信任模型。简而言之,这意味着:仅仅因为您的服务器仅在本地网络中,它就不受保护。您应该采取最小的努力来保护本地网络中的所有内容。
因此,如果您有一个带有 SSL 的 Web 服务器,并且安全证书未经过客户端验证,则任何攻击者仍然可以冒充此 Web 服务器或通过发起中间人攻击来窃取信息。
您已经拥有私有 SSL 证书,为什么不在客户端添加它并享受 SSL 的全面保护呢?
| 归档时间: |
|
| 查看次数: |
6851 次 |
| 最近记录: |