Python ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:748)

作者:编程家 分类: python 时间:2025-11-06

Python ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:748)

在使用Python进行网络请求时,有时会遇到ssl.SSLError异常,其中一种常见的情况是[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:748)。这个错误通常发生在使用HTTPS协议进行通信时,即在进行安全的加密通信时。

问题背景

当我们使用Python的requests库或urllib库进行HTTPS请求时,会自动对服务器返回的SSL证书进行验证。这个验证过程是为了确保通信的安全性,防止中间人攻击或数据篡改等安全问题。验证证书的过程包括检查证书的有效性、过期时间、颁发机构等信息。

然而,有些时候我们会遇到证书验证失败的情况。这可能是因为服务器返回的证书无法通过本地的证书验证机构进行验证,也可能是由于本地缺少必要的根证书。

解决方案

有几种方法可以解决这个问题。

方法一:忽略证书验证

在某些情况下,我们可以选择忽略证书验证,但这样会降低通信的安全性。可以通过设置verify参数为False来实现忽略证书验证,代码如下:

import requests

response = requests.get('https://example.com', verify=False)

尽管这样可以解决问题,但并不推荐在生产环境中使用这种方法,因为这样会使通信存在安全隐患。

方法二:导入根证书

如果服务器返回的证书无法通过本地的证书验证机构进行验证,我们可以手动导入服务器的根证书。根证书是由权威的证书颁发机构签发的,可以用于验证其他证书的有效性。

首先,我们需要获取服务器的证书。可以通过浏览器的开发者工具或命令行工具(如openssl)来获取。然后,将证书保存为.pem或.crt格式的文件。

接下来,可以通过设置verify参数为证书文件的路径来导入根证书,代码如下:

import requests

response = requests.get('https://example.com', verify='/path/to/certificate.crt')

这样,我们就可以使用服务器的根证书来验证证书的有效性了。

方法三:更新本地证书

有时,我们遇到的问题是由于本地缺少必要的根证书导致的。为了解决这个问题,我们可以尝试更新本地的根证书。

可以通过以下步骤来更新本地根证书:

1. 打开浏览器,访问一个使用HTTPS协议的网站(如https://www.baidu.com)。

2. 点击浏览器地址栏左侧的锁形状图标,选择“证书”或“安全”。

3. 在证书详情页面中,找到根证书的颁发机构(如“DigiCert Global Root CA”)。

4. 点击“导出证书”或“下载证书”按钮,将证书保存为.crt或.pem格式的文件。

5. 打开Python的安装目录,找到Lib目录下的site-packages目录。

6. 在site-packages目录下创建certifi目录,并将证书文件复制到该目录下。

之后,我们就可以使用更新后的根证书来进行证书验证了。

案例代码

下面是一个使用requests库进行HTTPS请求的案例代码,如果遇到证书验证失败的情况,可以尝试上述解决方案:

import requests

try:

response = requests.get('https://example.com')

print(response.text)

except requests.exceptions.SSLError as e:

print('SSL Error:', e)

通过合理选择上述方法,我们可以解决Python中ssl.SSLError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败(_ssl.c:748)的问题,确保网络请求的安全性和正常运行。