📌  相关文章
📜  SSL:使用 Python3 的 CERTIFICATE_VERIFY_FAILED - Python (1)

📅  最后修改于: 2023-12-03 15:35:09.003000             🧑  作者: Mango

SSL:使用 Python3 的 CERTIFICATE_VERIFY_FAILED - Python

简介

在使用 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的默认ca证书

在部分系统中,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 错误可能会让你感到困惑,但是采用以上三种方法之一都可以解决这个问题。在实际情况下,选择哪种方法取决于你的应用程序需求和安全性要求。