您的位置:

urllib3报错ssl.SSLError("No root certificates specified")怎么办

  发布时间:2025-01-20 09:26:57
urllib3出现ssl.SSLError("No root certificates specified")的原因是因为Python在使用ssl模块进行安全连接的时候,默认情况下需要加载一组信任的根证书来验证远程服务器的SSL证书。解决方案包括确保系统中安装最新的根证书、手动指定根证书或使用certifi库来管理根证书。在代码中指定根证书的路径或使用certifi库来解决问题。

问题原因

urllib3出现ssl.SSLError("No root certificates specified")的原因是因为Python在使用ssl模块进行安全连接的时候,默认情况下需要加载一组信任的根证书来验证远程服务器的SSL证书。如果没有正确配置根证书,就会导致SSL连接时出现"No root certificates specified"的错误提示。这通常发生在缺少根证书、根证书配置错误或未更新的证书库等情况下。

解决方案

urllib3出现ssl.SSLError("No root certificates specified")错误时,通常是由于缺少根证书导致的。根证书用于验证SSL证书的真实性,缺少根证书会导致SSL验证失败,进而引发这个错误。 要解决这个问题,可以按照以下步骤操作: 1. 确保系统中安装了最新的根证书。 2. 可以手动指定根证书,可以通过设置REQUESTS_CA_BUNDLE环境变量指向合适的根证书文件,或者在代码中指定根证书的路径。 3. 可以使用certifi库来自动管理根证书。certifi是一个Python库,它提供了一组根证书,可以让urllib3自动使用这些根证书进行SSL验证。 以下是一个示例代码,演示了如何使用certifi来解决这个问题:


import certifi
import urllib3

http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
response = http.request('GET', 'https://www.example.com')
print(response.data)

通过以上步骤和示例代码,可以解决urllib3出现ssl.SSLError("No root certificates specified")错误的问题。

具体例子

当出现ssl.SSLError("No root certificates specified")错误时,通常是由于在使用urllib3发送HTTPS请求时,没有正确配置根证书的原因导致无法验证服务器的SSL证书。为了解决这个问题,可以通过以下步骤来正确使用urllib3: 1. 确保已安装certifi包:certifi是一个提供证书的Python包。 2. 在代码中导入urllib3库和certifi库:


   import urllib3
   import certifi
  1. 创建一个urllib3.PoolManager对象时,指定cert_reqs='CERT_REQUIRED'ca_certs=certifi.where()参数,以确保SSL证书验证正常进行。这里的ca_certs=certifi.where()将使用certifi提供的根证书列表。

   http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())
  1. 使用上述创建的http对象发送HTTPS请求:

   response = http.request('GET', 'https://www.example.com')

通过以上方式,可以正确配置根证书,避免出现ssl.SSLError("No root certificates specified")错误。 下面是一个具体的例子,演示如何使用urllib3发送HTTPS请求并正确处理根证书的配置:


import urllib3
import certifi

# 创建一个PoolManager对象,配置根证书
http = urllib3.PoolManager(cert_reqs='CERT_REQUIRED', ca_certs=certifi.where())

# 发送HTTPS GET请求
response = http.request('GET', 'https://www.example.com')

# 打印响应内容
print(response.data.decode('utf-8'))

在这个例子中,我们首先导入了urllib3certifi库,然后创建了一个PoolManager对象时指定了必要的参数来配置根证书。最后使用该PoolManager对象发送了一个HTTPS GET请求,并打印了响应内容。