错误提示是这样:
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 的问题,但是证书本身没有问题(客户端和服务器端可以正常链接)我现在想了解下如何纠错呢?有什么好办法修复这个问题?
![]() | 1 fzleee 2017-04-01 06:07:05 +08:00 via iPhone 服务器证书链不全的问题? |
3 vPlusSign1 2017-04-01 08:55:05 +08:00 verify = False 应该就可以了 |
4 vPlusSign1 2017-04-01 08:56:12 +08:00 之前查这个问题好像是因为 linux 里面的一些证书缺了 ,所以会这样子验证不到。 |
![]() | 5 lovedebug 2017-04-01 09:06:52 +08:00 等等 服务器和客户端证书? 双向认证吗? |
![]() | 6 fzleee 2017-04-01 09:23:44 +08:00 ![]() 我看到你的报错信息里面显示 get_server_certificate 的时候显示 certificate verify failed ,我还是怀疑和证书链相关。如果你不介意,可不可以执行下这个命令?将 baidu.com 替换为你的服务器 =============== openssl s_client -connect www.baidu.com:443 -showcerts =============== |
7 SharkIng OP @vPlusSign1 #3 测试代码主要的目的就是确定客户端和服务器端证书的可用性,这个了之后不就完全没用了? @lovedebug #5 算是吧 @fzleee #6 好的我试试,您的意思是可能是服务器端部分证书不完整么?我前面说的 CA 放一起主要是客户端的了。 |
![]() | 8 fzleee 2017-04-01 13:41:41 +08:00 ![]() @SharkIng 或者中间证书以及服务圈证书的顺序弄反了呢? 至少从异常日志里面能够看到最直观的问题就是`certificate verify failed`。 因此我能够猜想可能的原因无非就是 1. 服务器端的问题, 比如服务器个返回的证书链不全 /错误。 2. 客户端问题, 客户端不信任这个自签的根证书。 3. SNI 的问题?(这个可能性比较小) |
![]() | 10 liamzz 2019-07-29 11:01:04 +08:00 你好,你解决了 self._sslobj.do_handshake()这个问题了吗 |