Java 客户机 SSL 重新协商



我有一个Dropwizard应用程序,其中资源需要在另一个Dropwizard应用程序上调用资源。我们注意到,在SSL重新协商上花费了大量时间。经过仔细检查,仅当其他应用程序在同一台计算机上时,才会发生这种情况。即:

client.target("https://mymachine.com/test").request().post(null);
client.target("https://mymachine.com/test").request().post(null);
// renegotiation

如果使用命令行选项-Djavax.net.debug=ssl:handshake:verbose日志显示

%% Client cached [Session-13, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256]
%% Try resuming [Session-13, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256] from port 55043
...
%% Invalidated:  [Session-13, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256]
%% Initialized:  [Session-15, TLS_ECDHE_RSA_WITH_AES_128_CBC_SHA256]

但是当我在本地机器上调用相同的服务时:

client.target("https://othermachine.com/test").request().post(null);
client.target("https://othermachine.com/test").request().post(null);
// SSL session re-use (=wanted)

日志说:

%% Client cached [Session-15, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]
%% Try resuming [Session-15, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256] from port 55051
...
%% Server resumed [Session-15, TLS_ECDHE_RSA_WITH_AES_128_GCM_SHA256]

这是怎么回事?

事实证明,java版本不同。我的本地主机使用的是旧版本:-$。

Java™ SE 开发工具包 8,更新 161 (JDK 8u161( 2018 年 1 月 16 日

新功能

security-libs/javax.net.ssl 添加了 TLS 会话哈希和扩展主控 机密扩展支持 已添加对 TLS 会话的支持 JDK JSSE 中的哈希和扩展主密钥扩展 (RFC 7627( 供应商。请注意,通常,服务器证书更改是 如果未启用终结点标识,则受限,并且先前 握手是会话恢复的缩写初始握手, 除非两个证书所代表的身份都可以被视为 一样。但是,如果启用或协商扩展,则 服务器证书更改限制不是必需的,并且将是 相应地丢弃。如果出现兼容性问题,应用程序 可以通过设置系统来禁用此扩展的协商 属性 jdk.tls.useExtendedMasterSecret 在 JDK 中为 false。由 将系统属性 jdk.tls.allowLegacyRecovery 设置为 false,则 当会话哈希时,应用程序可以拒绝简短的握手 并且未协商扩展主密钥扩展。通过设置 System Property jdk.tls.allowLegacyMasterSecret to false, an 应用程序可以拒绝不支持会话的连接 哈希和扩展主密钥扩展。

请参阅 JDK-8148421

最新更新