返回

urllib CERTIFICATE_VERIFY_FAILED 错误:全面解析与解决方法

python

当 urllib 中出现“SSL: CERTIFICATE_VERIFY_FAILED”错误时该怎么办

简介

在使用 urllib 库访问 HTTPS 网站时,您可能会遇到令人头疼的“SSL: CERTIFICATE_VERIFY_FAILED”错误。别担心,并非世界末日。在本篇博文中,我们将深入探究这个错误,并为您提供多种有效的方法来解决它。

错误的本质

该错误通常表明客户端无法验证服务器的 SSL 证书,这会引发一系列潜在原因。可能的情况包括:

  • 客户端不信任颁发证书的证书颁发机构 (CA)。
  • 证书已过期或被吊销。
  • 服务器使用自签名证书,客户端尚未安装它。

解决方法

方法 1:禁用证书验证

如果您确信服务器是可信的,您可以使用 context 参数来禁用证书验证:

import ssl

context = ssl.SSLContext()
context.verify_mode = ssl.CERT_NONE

req = urllib2.Request(url, headers={ 'X-Mashape-Key': 'XXXXXXXXXXXXXXXXXXXX' })
req.context = context

info = urllib2.urlopen(req).read()

此方法通过设置 verify_modeCERT_NONE 来绕过证书验证。

方法 2:使用 --no-check-certificate 标志

如果您使用的是 requests 库,可以在命令行中添加 --no-check-certificate 标志:

python requests.py --no-check-certificate

这个标志也会禁用证书验证。

方法 3:安装受信任的证书

如果服务器使用自签名证书,您需要将其安装到受信任的证书存储中。对于 macOS,使用以下命令:

sudo security add-trusted-cert -d -r trustRoot -k /Library/Keychains/System.keychain /path/to/certificate.crt

注意事项

禁用证书验证可能会带来安全隐患,因为它允许客户端与不安全的服务器进行通信。因此,只在绝对必要的情况下才使用此方法。

常见问题解答

Q1:这个错误只出现在 urllib 中吗?
A1:不,它也可能发生在使用其他 Python HTTP 库(例如 requests)时。

Q2:总是禁用证书验证安全吗?
A2:不,禁用证书验证可能会使您的系统容易受到攻击。仅在您确信服务器可信时才使用它。

Q3:我可以自己生成自签名证书吗?
A3:是的,您可以使用 openssl 工具生成自签名证书。但是,大多数浏览器和应用程序不会信任它们。

Q4:为什么我的自签名证书会过期?
A4:自签名证书通常设置为在有限的时间内有效。您可以使用 openssl 延长它们的有效期。

Q5:我可以修复证书颁发机构 (CA) 问题吗?
A5:如果您不信任颁发证书的 CA,您需要联系该 CA 并解决问题。

总结

“SSL: CERTIFICATE_VERIFY_FAILED”错误可能很烦人,但现在您拥有多种方法来解决它。根据您的特定情况,禁用证书验证、使用 --no-check-certificate 标志或安装受信任的证书可能会解决问题。