【问题标题】:ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed Pythonssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] 证书验证失败 Python
【发布时间】:2017-06-04 16:58:05
【问题描述】:

我想使用 SSL 连接到 IRC。我写在Python 2.7。但是,对于下面的代码:

HOST = 'chat.freenode.net'
PORT = 7000
sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
code = sock.connect_ex((HOST, PORT))
context = ssl.SSLContext(ssl.PROTOCOL_TLSv1_2)
context.verify_mode = ssl.CERT_REQUIRED
context.load_verify_locations('COMODOECCCertificationAuthority.crt')
secure_sock = context.wrap_socket(sock)

PyCharm 在secure_sock = context.wrap_socket(sock) 行显示错误,这是怎么回事?

【问题讨论】:

    标签: python ssl


    【解决方案1】:

    context.load_verify_locations('COMODOECCCertificationAuthority.crt')

    我不知道文件 COMODOECCCertificationAuthority.crt 中的内容,但您似乎希望获得由 Comodo 签名的证书。但是,chat.freenode.net 证书的颁发者是 Let's Encrypt 而不是 Comodo。例如,您可以使用

    获取链
    $ openssl s_client -connect chat.freenode.net:7000
    ...
    Certificate chain
    0 s:/CN=cherryh.freenode.net
      i:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
    1 s:/C=US/O=Let's Encrypt/CN=Let's Encrypt Authority X3
      i:/O=Digital Signature Trust Co./CN=DST Root CA X3
    

    这意味着您需要信任的根 CA 是“DST Root CA X3”。您可以下载此 CA here 的证书。如果您在load_verify_locations 中将其添加为受信任的,则它可以工作。

    【讨论】:

    • 我打开了一个https://freenode.net/ 页面并使用我的浏览器(最新的 Firefox)导出了证书。为什么它没有工作呢?
    • 除了我上面的问题之外,当我将证书更改为您发布链接的证书时,现在我有一个新错误:ssl.SSLError: [SSL: TLSV1_ALERT_PROTOCOL_VERSION] tlsv1 alert protocol version (_ssl.c:1754)
    • @yak:一个站点可以为不同的服务使用不同的证书,freenode 正在这样做,即为 https 和 irc 使用不同的证书。至于第二个错误:这是一个不同的问题,因此不应在评论中提出。请提出一个新问题,在其中提供有关此问题的更多详细信息,包括您使用的完整版 python(即 2.7.x)和 openssl(ssl.OPENSSL_VERSION)。
    猜你喜欢
    • 2018-03-15
    • 2018-07-29
    • 2017-06-01
    • 2023-03-03
    • 1970-01-01
    • 2020-01-14
    • 2017-06-25
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多