Python 证书验证失败:无法获取本地颁发者证书

Python 证书验证失败:无法获取本地颁发者证书

在本文中,我们将介绍在使用 Python 进行网络请求时可能遇到的一个问题:Python 证书验证失败,无法获取本地颁发者证书。我们将探讨导致此问题的原因,并提供解决方案和示例代码。

阅读更多:Python 教程

问题描述

Python 是一门强大的编程语言,广泛应用于网络请求、数据处理和网站开发等领域。在进行网络请求时,常常需要与 HTTPS 网站进行通信,并验证服务器证书的有效性。

然而,有时会遇到以下错误消息:certificate verify failed: unable to get local issuer certificate。这意味着 Python 无法获取本地颁发者证书并验证服务器的证书链。这可能导致网络请求失败或安全风险。

问题原因

该问题通常是因为 Python 未能正确配置证书验证所导致的。Python 使用 certifi 库来管理证书,而 certifi 库默认提供了一组根证书。然而,某些情况下,Python 无法找到或加载这些根证书,从而导致证书验证失败的错误出现。

此外,当使用自定义证书(如自签名证书)时,Python 默认不信任这些自定义证书,因为它们不在预配置的根证书列表中。

解决方案

解决 Python 证书验证失败的问题,可以采取以下几种方案:

方案一:更新或重新配置根证书

首先,我们可以尝试更新或重新配置 Python 的根证书。可以使用以下命令来更新 certifi 库中的根证书:

$ pip install --upgrade certifi
Bash

如果更新 certifi 库无效,可以手动配置根证书。可以从互联网上找到根证书的文件,然后通过以下方式告诉 Python 使用该证书:

import requests
requests.get('https://example.com', verify='/path/to/cert.pem')
Python

方案二:禁用证书验证

如果无法获取有效的根证书,我们可以暂时禁用证书验证。这在开发环境中是一种常见的解决方案,但安全性较低,不建议在生产环境中使用。可以通过以下方式禁用证书验证:

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

禁用证书验证会导致请求忽略服务器证书的有效性,这可能会安全风险,因此谨慎使用。

方案三:使用自定义证书

如果使用的是自定义证书,如自签名证书,通常需要将其添加到 Python 的信任列表中。可以创建自定义证书的本地副本,并将其添加到 certifi 库的根证书中。示例代码如下:

import certifi
import ssl

custom_ca = '/path/to/custom_ca.pem'

context = ssl.create_default_context(cafile=certifi.where())
context.load_cert_chain(certfile=custom_ca)

response = requests.get('https://example.com', verify=custom_ca, cert=context)
Python

在以上示例中,我们使用 ssl.create_default_context() 创建了一个默认的 SSL 上下文,并通过 context.load_cert_chain() 加载自定义证书的本地副本。然后,我们可以将自定义证书的路径传递给 requests.get() 方法的 verify 参数,以验证服务器证书。

示例说明

以下是一个示例,展示了如何使用自定义证书与 HTTPS 网站进行通信并执行基本的 GET 请求:

import requests

custom_ca = '/path/to/custom_ca.pem'

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

if response.status_code == 200:
    print('请求成功!')
    print(response.text)
else:
    print('请求失败!')
    print('错误代码:', response.status_code)
Python

在该示例中,我们假设自定义证书位于 /path/to/custom_ca.pem。我们使用 requests.get() 方法向 https://example.com 发送一个 GET 请求,并将自定义证书的路径传递给 verify 参数以实现证书验证。

总结

Python 的证书验证失败问题常常是由于未正确配置根证书或信任自定义证书所导致的。我们可以通过更新或重新配置根证书、禁用证书验证或使用自定义证书等方案解决该问题。根据实际需求和安全性要求,选择适合的解决方案。

同时,了解证书验证失败的原因和解决方案,有助于我们更好地理解 Python 的网络请求机制,提高代码的稳定性和安全性。

Python教程

Java教程

Web教程

数据库教程

图形图像教程

大数据教程

开发工具教程

计算机教程

登录

注册