Apache 升级导致与 Java 客户端的 SSL 握手失败

Apache 升级导致与 Java 客户端的 SSL 握手失败

我有一个 apache 2.4.10 要升级到 2.4.12,底层 openssl 0.9.8,具有以下 SSL 配置:

SSLCipherSuite DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!EXPORT
SSLProtocol all -SSLv2 -SSLv3
SSLHonorCipherOrder on

随着升级,我想将密码套件更改为

SSLCipherSuite DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA:AES128-SHA:AES256-SHA:DES-CBC3-SHA:DHE-RSA-AES256-CBC-SHA:TLS_DHE_RSA_WITH_AES_256_CBC_SHA:!EXPORT 

OpenSSL 和 Java 的版本如下:

OpenSSL 0.9.8j-fips 07 Jan 2009

java version "1.7.0_03"
Java(TM) SE Runtime Environment (build 1.7.0_03-b04)
Java HotSpot(TM) 64-Bit Server VM (build 22.1-b02, mixed mode)

显然,所有客户端的一切都应保持不变。但是,有一个 Java 7 SE 客户端拒绝连接新的 Apache 2.4.12 和新配置,但可以使用旧配置(Server hello 完成后客户端出现内部错误)。

有人有什么想法吗?

答案1

尚无完整的答案,但有一些想法/方向:

该密码列表更改是无意义的。您添加的术语TLS_DHE_RSA_WITH_AES_256_CBC_SHA是标准 RFC 格式,Java 和 Wireshark 等其他一些工具也使用这种格式,但不是 OpenSSL 使用的格式;OpenSSL 格式是DHE-RSA-AES256-SHA您的列表中已有的格式。此外,!EXPORT在这里毫无用处;它会删除任何已添加但尚未添加的导出套件,并且会阻止任何其他规范将它们添加回来,但没有其他规范。

Java 7 SSL(JSSE)的一些早期版本(我不记得具体是哪个,但可能包括 7.03)的默认密码列表的顺序确实有误,这可能导致选择比必要的密码套件更差的密码套件,但是您SSLHonorCipherOrder on忽略了客户端顺序,所以不可能是这样的。

httpd 的最新版本已开始默认使用更大的 DH 组(对于您喜欢的 DHE),这确实会给 Java 7(及更早版本)造成问题,至少在使用其默认加密提供程序时会如此。但是http://httpd.apache.org/docs/2.4/mod/mod_ssl.html#sslcertificatefile说这些变化是 2.4.7 和 .10,所以 .10 到 .12 不应该做出我所知道的任何进一步的变化。询问:您是否确实将 DH 1024bit 配置为http://httpd.apache.org/docs/2.4/ssl/ssl_faq.html#javadh建议?

如果不是这样,我需要更多数据。问题发生时,httpd 日志中是否有任何内容?您能否从出现问题的 Java 客户端获取更多详细信息,例如确切的异常消息?(这是您可以自己运行的客户端,还是属于其他人或多个人?)您能否使用 Wireshark 或 tcpdump 或类似程序获取失败尝试的网络捕获?如果其他所有方法都失败了,有人可以使用-Djavax.net.debug=ssl或等效程序运行 Java 客户端,并获得(相当多的)结果输出吗?

答案2

该段指出

Java 7 SSL 的一些早期版本

@dave_thompson_085 的帮助让我找到了最终的解决方案。问题和解决方案都在Apache 网站

有一个块需要附加到 PEM 文件,以强制 Java SE 7 所需的某些 TLS v1.0 会话参数。

相关内容