我有一个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