📅  最后修改于: 2023-12-03 15:35:09.003000             🧑  作者: Mango
在使用 Python3 进行 HTTPS 请求时,可能会遇到 CERTIFICATE_VERIFY_FAILED 的错误,这是由于网络请求的 SSL/TLS 证书不能通过 Python 的验证所导致的。本文将介绍如何解决这个问题。
忽略证书验证并不是一个安全的做法,因为这会让你的 HTTPS 请求变成不安全的HTTP请求。但是,如果你只是在测试环境下使用 Python 进行 HTTPS 请求,那么这是一个比较快捷的做法。
import ssl
import urllib.request
#关闭SSL验证
ssl._create_default_https_context = ssl._create_unverified_context
#进行HTTPS请求
response = urllib.request.urlopen("https://www.example.com")
更可靠的解决方案是添加你所需要的根证书到 Python 的证书存储中。根据操作系统的不同,Python 的证书存储文件可能会位于不同的位置。你可以使用以下代码来查找证书文件的位置:
import ssl
print(ssl.get_default_verify_paths())
根据 get_default_verify_paths() 函数的输出,你可以找到证书文件的所在位置。然后,将根证书添加到该文件中即可。在ubuntu中,该证书通常位于和以下相同的文件夹 /etc/ssl/certs/ca-certificates.crt 中。
在部分系统中,Python可能会将SSL证书的验证委托给第三方库,而不是使用系统的证书存储。这种情况下,你需要手动告诉Python使用哪个证书作为默认验证证书。
以下代码将演示如何修改默认证书存储:
import ssl
import certifi
#设置 SSL 验证证书位置
ssl_context = ssl.create_default_context(cafile=certifi.where())
#进行 HTTPS 请求
response = urllib.request.urlopen("https://www.example.com", context=ssl_context)
在使用 Python 进行 HTTPS 请求时,遇到 CERTIFICATE_VERIFY_FAILED 错误可能会让你感到困惑,但是采用以上三种方法之一都可以解决这个问题。在实际情况下,选择哪种方法取决于你的应用程序需求和安全性要求。