问题描述
我正在尝试更新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版本? 我的密码? 任何机构都可以帮忙吗? 谢谢
1楼
SSL握手已读取7个字节并写入249个字节
这些不是证书验证的问题。 客户端开始SSL握手,但服务器仅向后发送7个字节,这可能是SSL警报,提示发生了问题。 服务器从不发回证书,因此不会成为客户端验证的问题。
这意味着您最好检查服务器端而不是客户端的问题。
而且,由于您说完全相同的代码适用于旧证书,因此这不是协议版本或密码问题,而是必须与证书相关。
因此,我的猜测是您使用的私钥与您使用的证书不匹配,当您执行openssl verify
时,证书不会被openssl verify
。
2楼
我找到了解决方案。 以前,我的证书链仅包含不完整的中级和根证书。
解决方案是还将服务器证书包含在怪异的链中,因为已经定义了context.use_certificate_file
。
无论如何,握手现在工作正常。 谢谢!