我有一个 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 会话参数。