【问题标题】:mod_ssl alert handshake failuremod_ssl 警报握手失败
【发布时间】:2016-02-20 00:45:43
【问题描述】:

失败是故意的,因为 SSLv3 被禁用。 .NET 客户端默认使用 SSLv3,它不会在失败前收到警报的情况下使用受支持的 SSL 版本重试。

我已按照http://httpd.apache.org/docs/2.2/mod/mod_ssl.html#ssloptions 设置了 OptRenegotiate,但我的服务器仍然返回 SSL 握手失败,而不是警告握手失败(然后发送握手失败)。

作品:

$ openssl s_client -connect my.working.server:443 -ssl3
CONNECTED(00000003)
2414208:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1472:SSL alert number 40
2414208:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:

失败:

$ openssl s_client -connect my.failing.server:443 -ssl3
CONNECTED(00000003)
2414208:error:1409E0E5:SSL routines:ssl3_write_bytes:ssl handshake failure:s3_pkt.c:656:

唯一的区别:

2414208:error:14094410:SSL routines:ssl3_read_bytes:sslv3 alert handshake failure:s3_pkt.c:1472:SSL alert number 40

发送此警报是问题所在:我似乎在 Apache 文档的任何地方都找不到对它的引用。

【问题讨论】:

    标签: apache ssl


    【解决方案1】:

    .NET 客户端默认使用 SSLv3,它不会在失败前收到警报的情况下使用受支持的 SSL 版本重试。

    这不是 SSL 协议协商的工作方式。客户端宣布它愿意支持的最佳版本,然后服务器以与客户端版本相同或更低的最佳版本进行响应。如果此操作失败,则某些客户端(主要是浏览器)会使用较低的 SSL 版本重试,因为它们假定服务器已损坏。但是他们为此使用了新的 TCP 连接,即在现有连接中没有重新协商。

    没有协议升级之类的东西,正如您在此处描述的那样。

    【讨论】:

    • 我已经更新了我的答案,使其更加清晰。它正在发送警报,这就是问题所在。发送警报后,.NET 重新协商并连接
    • @user3668514:此行为是 SSL 堆栈的一项功能。我不认为你可以配置任何不同于 Apache 的东西来直接改变这种行为。至少 OptRenegotiate 仅适用于已经建立的 SSL 连接,而您没有。如果您使用不同的底层 OpenSSL 版本,配置可能会有所不同,或者可能会受到密码选择或其他因素的影响,因此我建议您简单地比较两种服务器配置,找出可能导致行为差异的原因。
    • 我认为问题出在 OpenSSL 中。它看起来很简单,唯一的区别就是发送警报。但是如何/在哪里完成这是一个谜(到目前为止)。
    • @user3668514:我认为主要问题是 .NET 应用程序对 SSL 的工作方式有不合理的期望。
    • 我同意,但最终客户拒绝更改。我认为错误在于 mod_ssl 如何关闭连接(警报>失败,而不是失败)。
    【解决方案2】:

    需要在服务器上启用 TLS 1.0 才能在发生故障之前发送警报。 .NET 客户端收到警报,并使用安全协议(即不是 SSLv3)再次尝试。

    【讨论】:

      猜你喜欢
      • 2016-05-26
      • 1970-01-01
      • 1970-01-01
      • 2020-05-15
      • 2015-08-29
      • 1970-01-01
      • 2020-09-14
      • 2016-10-10
      • 2016-07-01
      相关资源
      最近更新 更多