【问题标题】:Python OpenSSL giving handshake failurePython OpenSSL 握手失败
【发布时间】:2015-10-22 02:37:01
【问题描述】:

我正在尝试更新 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 版本?我的密码?任何机构都可以提供帮助吗?谢谢

【问题讨论】:

    标签: python ssl flask openssl


    【解决方案1】:

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

    这些不是证书验证的问题。 客户端启动 SSL 握手,但服务器只发回 7 个字节,这可能是 SSL 警报,表明有问题。服务器从不发回证书,因此不会是客户端验证的问题。

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

    【讨论】:

    • 嗨,Steffen,密钥与证书匹配,我已经更新了我的问题。因此,我认为这不是私钥问题。
    • @litium:同样,您是否在服务器端查找过错误消息?如果除了证书什么都没有改变,它怎么可能是协议或密码?
    • 不,我的服务器端没有抛出错误。这就是让我困惑的地方
    【解决方案2】:

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

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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2014-10-11
      • 1970-01-01
      • 2020-08-23
      • 1970-01-01
      • 2018-07-28
      相关资源
      最近更新 更多