您的位置:

对于urllib3错误ValueError("SecureTransport does not support cert directories")的解决

  发布时间:2023-01-29 02:30:02
报错的原因在Python中使用urllib库时如果出现错误,通常是因为urllib在使用 macOS / OS X上的SecureTransport时遇到了问题。这是因为SecureTransport不支持证书目录,而urllib默认使用证书目录来验证SSL证书。如何解决解决这个问题的方法有几种:使用证书文件而不是证书目录,可以通过在urllib的请求中使用ca_certs参数来实现。使用例子是的,下面是使用证书文件和certifi库的示例:使用证书文件使用certifi库在第二种方式中不需要指定ca_certs参数,因为urllib会自动使用certifi库提供的证书。

报错的原因

在Python中使用urllib3库时如果出现“ValueError("SecureTransport does not support cert directories")”错误,通常是因为urllib3在使用 macOS / OS X上的SecureTransport时遇到了问题。这是因为SecureTransport不支持证书目录,而urllib3默认使用证书目录来验证SSL证书。解决方案是在使用urllib3时指定证书文件而不是目录。

如何解决

解决这个问题的方法有几种:

1. 使用证书文件而不是证书目录,可以通过在urllib3的请求中使用ca_certs参数来实现。

2. 在python中安装 certifi 库,这个库会提供一个带有证书文件的CA证书目录,这样urllib3库就可以通过调用certifi.where()来获取证书文件。

3. 如果你不想使用证书验证,可以通过在urllib3的请求中设置verify=False来实现。

如果你是要使用https网络请求,建议使用第一种或第二种方式。

使用例子

是的,下面是使用证书文件和certifi库的示例:

1. 使用证书文件:


import urllib3

http = urllib3.PoolManager()
r = http.request('GET', 'https://www.example.com', ca_certs='path/to/ca_certs.pem')
print(r.data)

2. 使用certifi库


import certifi
import urllib3

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

在第二种方式中不需要指定ca_certs参数,因为urllib3会自动使用certifi库提供的证书。