当前位置: 代码迷 >> python >> Python OpenSSL握手失败
  详细解决方案

Python OpenSSL握手失败

热度:104   发布时间:2023-06-13 15:17:01.0

我正在尝试更新python flask上DigiCert提供的新有效SSL证书。 与旧的过期证书相同的代码可以正常工作。 但是对于更新的证书,它无法识别我的证书链并给出错误:

[root@test~]# openssl s_client -connect somedomain.com:9443
CONNECTED(00000003)
140340901406536:error:14077410:SSL routines:SSL23_GET_SERVER_HELLO:sslv3 alert handshake failure:s23_clnt.c:744:
---
no peer certificate available
---
No client certificate CA names sent
---
SSL handshake has read 7 bytes and written 249 bytes
---
New, (NONE), Cipher is (NONE)
Secure Renegotiation IS NOT supported
Compression: NONE
Expansion: NONE
---

奇怪的是,当我使用openssl命令验证我的证书链时,一切工作正常,如下所示:

[root@test ~]$ openssl verify -verbose -CAfile CertChain.crt Server.crt
Server.crt: OK

这是我的python代码

from OpenSSL import SSL
from flask import Flask, send_file, make_response, request, jsonify, Response
from flask.ext import restful
from flask.ext.restful import reqparse, abort, Api, Resource

#------------#
context = SSL.Context(SSL.SSLv23_METHOD)
context.use_certificate_file("Server.crt")
context.use_privatekey_file("Server.key")
context.use_certificate_chain_file("CertChain.crt") 
context.set_options(SSL.OP_NO_SSLv3)
context.set_options(SSL.OP_NO_SSLv2)
context.set_cipher_list('ECDH+AESGCM:DH+AESGCM:ECDH+AES256:DH+AES256:ECDH+AES128:DH+AES:ECDH+3DES:DH+3DES:RSA+AESGCM:RSA+AES:RSA+3DES:!aNULL:!MD5:!DSS')

app = Flask(__name__)

@app.route("/")
def hello():
    return "Hello World!"

if __name__ == "__main__":
    app.run(host='0.0.0.0', port=9443, debug=True, use_reloader=False, ssl_context=context)

并且对于您的信息密钥和证书匹配没有问题

[root@test]# openssl x509 -noout -modulus -in Server.crt | openssl md5
(stdin)= adc3de807ec6a02c5ba9da89f3fe5dd5
[root@test]# openssl rsa -noout -modulus -in Server.key | openssl md5
(stdin)= adc3de807ec6a02c5ba9da89f3fe5dd5

有什么影响吗? Python版本? OpenSSL版本? 我的密码? 任何机构都可以帮忙吗? 谢谢

SSL握手已读取7个字节并写入249个字节

这些不是证书验证的问题。 客户端开始SSL握手,但服务器仅向后发送7个字节,这可能是SSL警报,提示发生了问题。 服务器从不发回证书,因此不会成为客户端验证的问题。

这意味着您最好检查服务器端而不是客户端的问题。 而且,由于您说完全相同的代码适用于旧证书,因此这不是协议版本或密码问题,而是必须与证书相关。 因此,我的猜测是您使用的私钥与您使用的证书不匹配,当您执行openssl verify时,证书不会被openssl verify

我找到了解决方案。 以前,我的证书链仅包含不完整的中级和根证书。

解决方案是还将服务器证书包含在怪异的链中,因为已经定义了context.use_certificate_file

无论如何,握手现在工作正常。 谢谢!