discord.py上的Python SSL错误:ssl.SSLCertVerificationError:证书验证失败:无法获取本地发行者证书(_ssl.c:1056)

时间:2019-11-11 02:28:06

标签: python python-3.x ssl certificate raspbian

错误

  

ssl.SSLCertVerificationError:[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地发行者证书(_ssl.c:1056)   SSL握手无法验证证书

     

aiohttp.client_exceptions.ClientConnectorCertificateError:无法连接到主机discordapp.com:443 ssl:True [SSLCertVerificationError:(1,'[SSL:CERTIFICATE_VERIFY_FAILED]证书验证失败:无法获取本地发行者证书(_ssl.c:1056) ')]

完整追溯(156行):https://pastebin.com/xmy4aYcM

调试信息

我正在Raspberry Pi 3上使用Python 3.7.3在完全更新的Raspbian Buster上运行。

uname -a的输出:

Linux hostname 4.19.75-v7+ #1270 SMP Tue Sep 24 18:45:11 BST 2019 armv7l GNU/Linux

lsb_release -a的输出:

Distributor ID: Raspbian
Description:    Raspbian GNU/Linux 10 (buster)
Release:        10
Codename:       buster

pip freeze的输出:

aiohttp==3.5.4
async-timeout==3.0.1
attrs==19.3.0
certifi==2019.9.11
chardet==3.0.4
discord.py==1.2.4
idna==2.8
multidict==4.5.2
pkg-resources==0.0.0
websockets==6.0
yarl==1.3.0
>>> import os
>>> import ssl                                        
>>> openssl_dir, openssl_cafile = os.path.split(      
...     ssl.get_default_verify_paths().openssl_cafile)
>>> os.listdir(openssl_dir)
['openssl.cnf', 'private', 'misc', 'certs']
>>> print(os.path.exists(openssl_cafile))
False

我尝试过的事情

我所有的在线搜索都给出以下两个建议之一:

  1. 使用pip安装certifi
    • 我已经安装了它,它没有任何改变。
  2. Install Certificates.command文件夹中运行/Applications/Python 3.X/
    • 这是Mac专用的。通常,此错误的所有提及仅在Mac上进行。

最小复制示例

创建venv,然后安装软件包

sudo apt-get update
sudo apt-get dist-upgrade
sudo apt-get install ca-certificates python3-venv python3-pip

python3 -m venv env
source env/bin/activate
python3 -m pip install -U pip
python3 -m pip install -U setuptools wheel
python3 -m pip install -U discord.py certifi

打开python3提示符,然后运行:

import discord

client = discord.Client()
client.run("token") # error happens here

在运行Linux,相同Python版本和软件包的PC上,我没有遇到相同的错误。

有没有一种方法

  • 忽略ssl证书验证检查(例如curl上的--insecure标志),或
  • 正确安装丢失的证书吗?

1 个答案:

答案 0 :(得分:0)

尝试这样做:

import ssl
ctx = ssl.create_default_context()
ctx.check_hostname = False
ctx.verify_mode = ssl.CERT_NONE

html = urllib.request.urlopen('https://blahblah.com/something', context=ctx).read()

这将阻止验证证书。否则,您将需要安装它。