Python OpenSSL给握手失败

时间:2015-10-22 02:37:01

标签: python ssl flask openssl

我正在尝试更新DigiCert在我的python烧瓶上提供的新的有效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版本?我的密码?任何人都可以帮忙吗?感谢

2 个答案:

答案 0 :(得分:0)

  

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

这些不是证书验证的问题。 客户端启动SSL握手,但服务器只返回7个字节,这可能是一个错误的SSL警报。服务器永远不会发回证书,因此它不会成为客户端验证的问题。

这意味着您应该更好地检查服务器端是否存在问题,而不是客户端。并且由于您说完全相同的代码与旧证书一起使用,因此它不能成为协议版本或密码的问题,但必须与证书相关。因此,我的猜测是您使用的私钥与您使用的证书不匹配,当您执行openssl verify时,不会检查该证书。

答案 1 :(得分:0)

我得到了解决方案。以前我的证书链只包含不完整的中间证书和根证书。

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

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