V2EX = way to explore
V2EX 是一个关于分享和探索的地方
现在注册
已注册用户请  登录
V2EX 提问指南
SharkIng
V2EX  ›  问与答

Python 上的 ssl 提示验证失败,有什么办法深究具体失败的原因么?

  •  
  •   SharkIng · 2017-04-01 04:28:47 +08:00 · 4351 次点击
    这是一个创建于 2795 天前的主题,其中的信息可能已经有所发展或是发生改变。

    错误提示是这样:

    Traceback (most recent call last):
      File "<stdin>", line 1, in <module>
      File "/usr/lib/python2.7/ssl.py", line 1007, in get_server_certificate
        with closing(context.wrap_socket(sock)) as sslsock:
      File "/usr/lib/python2.7/ssl.py", line 353, in wrap_socket
        _context=self)
      File "/usr/lib/python2.7/ssl.py", line 601, in __init__
        self.do_handshake()
      File "/usr/lib/python2.7/ssl.py", line 830, in do_handshake
        self._sslobj.do_handshake()
    ssl.SSLError: [SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed (_ssl.c:590)
    

    证书是自签的,代码没变过,以前的是用的自根证签一个服务器端和一个客户端的证书,代码完全没问题(代码是我们用来测试客户端和服务器端通讯,同时测试服务器端证书正确的)用了一年多了。最近更新服务器端,所以公司觉得用我们另外一个专门的自签根证书签了一个专门用这个项目的中级 CA 证书,然后签了服务器和客户端的证书。然后这个测试代码就提示前面的错误了

    感觉有可能是 ssl 的版本问题,也有可能是中级 CA 的问题,但是证书本身没有问题(客户端和服务器端可以正常链接)我现在想了解下如何纠错呢?有什么好办法修复这个问题?

    11 条回复    2019-07-30 01:36:15 +08:00
    fzleee
        1
    fzleee  
       2017-04-01 06:07:05 +08:00 via iPhone
    服务器证书链不全的问题?
    SharkIng
        2
    SharkIng  
    OP
       2017-04-01 06:09:37 +08:00
    @fzleee #1 也怀疑过这个问题,可是把两个 CA cat 到一起之后也不行
    vPlusSign1
        3
    vPlusSign1  
       2017-04-01 08:55:05 +08:00
    verify = False

    应该就可以了
    vPlusSign1
        4
    vPlusSign1  
       2017-04-01 08:56:12 +08:00
    之前查这个问题好像是因为 linux 里面的一些证书缺了 ,所以会这样子验证不到。
    lovedebug
        5
    lovedebug  
       2017-04-01 09:06:52 +08:00
    等等 服务器和客户端证书? 双向认证吗?
    fzleee
        6
    fzleee  
       2017-04-01 09:23:44 +08:00   ❤️ 1
    我看到你的报错信息里面显示 get_server_certificate 的时候显示 certificate verify failed ,我还是怀疑和证书链相关。如果你不介意,可不可以执行下这个命令?将 baidu.com 替换为你的服务器

    ===============
    openssl s_client -connect www.baidu.com:443 -showcerts
    ===============
    SharkIng
        7
    SharkIng  
    OP
       2017-04-01 13:02:35 +08:00
    @vPlusSign1 #3 测试代码主要的目的就是确定客户端和服务器端证书的可用性,这个了之后不就完全没用了?

    @lovedebug #5 算是吧

    @fzleee #6 好的我试试,您的意思是可能是服务器端部分证书不完整么?我前面说的 CA 放一起主要是客户端的了。
    fzleee
        8
    fzleee  
       2017-04-01 13:41:41 +08:00   ❤️ 1
    @SharkIng 或者中间证书以及服务圈证书的顺序弄反了呢?

    至少从异常日志里面能够看到最直观的问题就是`certificate verify failed`。
    因此我能够猜想可能的原因无非就是
    1. 服务器端的问题, 比如服务器个返回的证书链不全 /错误。
    2. 客户端问题, 客户端不信任这个自签的根证书。
    3. SNI 的问题?(这个可能性比较小)
    SharkIng
        9
    SharkIng  
    OP
       2017-04-02 05:40:43 +08:00 via iPhone
    @fzleee 非常感谢 我都试试
    liamzz
        10
    liamzz  
       2019-07-29 11:01:04 +08:00
    你好,你解决了 self._sslobj.do_handshake()这个问题了吗
    SharkIng
        11
    SharkIng  
    OP
       2019-07-30 01:36:15 +08:00
    @liamzz 都三年了 忘记具体的了,好像这个和 PythonSSL 那个 Library 有关,换一个 Python OpenSSL 版本就可以修复了
    关于   ·   帮助文档   ·   博客   ·   API   ·   FAQ   ·   实用小工具   ·   877 人在线   最高记录 6679   ·     Select Language
    创意工作者们的社区
    World is powered by solitude
    VERSION: 3.9.8.5 · 26ms · UTC 20:53 · PVG 04:53 · LAX 12:53 · JFK 15:53
    Developed with CodeLauncher
    ♥ Do have faith in what you're doing.