📌  相关文章
📜  确认 ssl 证书时出现问题:HTTPSConnectionPool(host='pypi.org', port=443): (1)

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

确认 SSL 证书时出现问题:

当我们在 Python 程序中使用 requests 库访问 HTTPS 站点时,有时会遇到以下错误消息:

HTTPSConnectionPool(host='pypi.org', port=443): Max retries exceeded with url: /simple/requests/ (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: self signed certificate in certificate chain (_ssl.c:1056)')))

这个错误消息是由于 SSL 证书验证失败导致的。通常,当我们使用 HTTPS 连接时,服务器会发送一个 SSL 证书到客户端,用于验证服务器的身份和数据的加密性。如果证书验证失败,则表示服务器不能被信任,我们的请求将被拒绝。

原因

主要有以下几种原因导致该问题:

  • 证书过期或无法验证
  • 错误的证书链或证书链中的某个证书无效
  • Python 环境中缺少所需的根证书颁发机构
解决方案

解决该问题的方法是让 Python 程序安全地验证 SSL 证书。有以下几种解决方案:

方案一:升级 requests

如果您使用的是旧版本的 requests 库,可以尝试升级到最新版本。新版本的 requests 库默认使用系统证书库验证 SSL 证书,可能会解决该问题。

pip install --upgrade requests
方案二:禁用 SSL 验证

可以在请求中设置参数 verify=False,以便发出 SSL 验证失败的未验证请求。不过这种方法不安全,将 HTTP 请求发送到未验证的 HTTPS 网站通常不是一种好的实践。

import requests

response = requests.get('https://pypi.org/simple/requests/', verify=False)
print(response.text)
方案三:添加根证书颁发机构

可以下载并将所需的根证书颁发机构添加到 Python 环境中以验证 SSL 证书。可以在操作系统或浏览器中找到根证书,然后添加到 Python 环境中。具体实现可以参考 ssl 模块文档中的 “Python Certificates”。

import ssl
import requests

ssl_context = ssl.create_default_context()
ssl_context.load_verify_locations('/path/to/ca-cert-file.crt')
response = requests.get('https://pypi.org/simple/requests/', verify=ssl_context)
print(response.text)

如果您使用的是操作系统的默认证书存储,应该使用 certifi 模块安装证书。

import certifi
import requests

ca_path = certifi.where()
response = requests.get('https://pypi.org/simple/requests/', verify=ca_path)
print(response.text)
总结

SSL 证书验证失败通常发生在 Python 程序中使用 requests 库访问 HTTPS 站点时。该问题的解决方法包括升级 requests 库,禁用 SSL 验证以及添加缺少的根证书颁发机构。建议使用安全的方法解决该问题,以免威胁到您的数据安全。