【问题标题】:Discord.py unable to get certificateDiscord.py 无法获得证书
【发布时间】:2019-07-27 12:08:30
【问题描述】:

我是否必须在我的系统中安装/生成/下载新证书,或者我是否有可能以某种方式禁用 python 中的证书? (ubuntu 18, python 3.7, discord.py latest)

[INFO]  [2019.03.05 - 22:58:02]   Initializing Discord...

SSL handshake failed on verifying the certificate
protocol: <asyncio.sslproto.SSLProtocol object at 0xf4a9f8ec>
transport: <_SelectorSocketTransport fd=12 read=polling write=<idle, bufsize=0>>
Traceback (most recent call last):
  File "./build/Lib/asyncio/sslproto.py", line 625, in _on_handshake_complete
  File "./build/Lib/asyncio/sslproto.py", line 189, in feed_ssldata
  File "./build/Lib/ssl.py", line 763, in do_handshake
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)

SSL error in data received
protocol: <asyncio.sslproto.SSLProtocol object at 0xf4a9f8ec>
transport: <_SelectorSocketTransport closing fd=12 read=idle write=<idle, bufsize=0>>
Traceback (most recent call last):
  File "./build/Lib/asyncio/sslproto.py", line 526, in data_received
  File "./build/Lib/asyncio/sslproto.py", line 189, in feed_ssldata
  File "./build/Lib/ssl.py", line 763, in do_handshake
ssl.SSLCertVerificationError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)

[ERROR] [2019.03.05 - 22:58:02]   
2019.03.05 - 22:58:02:
  Top:  file: [sv_custom.py], method: init()
  Root: file: [connector.py], line 974, cause: in _create_direct_connection [File "./../source/aiohttp.whl/aiohttp/connector.py", line 927, in _wrap_create_connection]
  aiohttp.client_exceptions.ClientConnectorCertificateError:
  Cannot connect to host discordapp.com:443 ssl:True [SSLCertVerificationError: (1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1051)')]

这是通过游戏客户端内部的 python 完成的。如果我从系统的 python (3.6) 中做同样的事情 - 没有错误,连接很好。 “他们说”这可能是因为游戏客户端没有看到“根证书”或类似的东西。

更新: 了解如何检查证书。

(with ssl error)
Initializing Discord...
DefaultVerifyPaths(cafile=None, capath=None, openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/local/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/local/ssl/certs')


(this works fine)
igor@Linbox:~/Downloads$ python3.6 -c "import ssl; print(ssl.get_default_verify_paths())"
DefaultVerifyPaths(cafile=None, capath='/usr/lib/ssl/certs', openssl_cafile_env='SSL_CERT_FILE', openssl_cafile='/usr/lib/ssl/cert.pem', openssl_capath_env='SSL_CERT_DIR', openssl_capath='/usr/lib/ssl/certs')

猜我的问题是capath 是空的。

【问题讨论】:

  • SSL 错误有点棘手。通常在您和站点之间有一个代理,例如网络管理员安装的 VPN 或透明代理。此外,如果您的系统时间很混乱,它可能会影响证书验证过程。您可以在浏览器中访问 discordapp.com:443 吗?这不是一个直接的答案,我很抱歉,但我缺乏发表评论的声誉。
  • 我理解你的意思,但这与代理无关(我的网络是透明的,443 端口有效)。正如我在最后提到的:python3.6 直接来自系统 + 不和谐 = 没有错误。游戏客户端 + 自己的 python 客户端(来自 libpython3.7m.so.1.0 - 使用 ssl 支持构建)+ discord = 这个 ssl 连接错误。

标签: python ssl-certificate discord.py


【解决方案1】:

出乎意料,解决方案看起来很简单:

ssl.get_default_verify_paths() 用于带有 ssl 错误的 python 指向:openssl_capath='/usr/local/ssl/certs',而系统中的“本机”python 显示 openssl_capath='/usr/lib/ssl/certs'

DefaultVerifyPaths(
  cafile=None,
  capath=None,
  openssl_cafile_env='SSL_CERT_FILE',
  openssl_cafile='/usr/local/ssl/cert.pem',
  openssl_capath_env='SSL_CERT_DIR',
  openssl_capath='/usr/local/ssl/certs'
)

我已经检查了两个位置: '/usr/local/' - 为空(没有 ssl/certs 文件夹) '/usr/lib/ssl/certs' 有一个指向 '/etc/ssl/certs' 的符号链接 所以我做了同样的符号链接: 在'/usr/local/' 里面添加了'/ssl/' + ln -s '/etc/ssl/certs' certs

然后我再次检查ssl.get_default_verify_paths()

DefaultVerifyPaths(
  cafile=None,
  capath='/usr/local/ssl/certs',  <-- not empty now
  openssl_cafile_env='SSL_CERT_FILE',
  openssl_cafile='/usr/local/ssl/cert.pem',
  openssl_capath_env='SSL_CERT_DIR',
  openssl_capath='/usr/local/ssl/certs'
)

问题消失了。它现在正在工作。

【讨论】:

    【解决方案2】:

    根据https://github.com/Rapptz/discord.py/issues/423,如果一个人进入python 文件夹并运行Install Certificates.command 它可以工作。

    我试过了,确实有效。 希望这对您和我在 StackOverflow 的声誉都有帮助 :-)

    【讨论】:

      【解决方案3】:

      除了@Igorz,我还打开了“/usr/local/ssl/cert.pem”文件并添加了我试图访问的网站的证书。您可以从here 获取有关如何获取这些证书的详细信息。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2020-02-21
        • 2022-06-21
        • 1970-01-01
        • 2018-01-23
        • 1970-01-01
        • 2015-01-17
        • 2021-07-17
        • 2018-07-12
        相关资源
        最近更新 更多