首页 > 解决方案 > Java 客户端 SSL 重新协商

问题描述

我有一个 Dropwizard 应用程序,其中一个资源需要调用另一个 Dropwizard 应用程序上的资源。我们注意到很多时间都花在了 SSL 重新协商上。经过仔细检查,只有当其他应用程序在同一台机器上时才会发生这种情况。IE:

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]

这里发生了什么?

标签: javassljerseydropwizardjersey-client

解决方案


原来java版本不同。我的本地主机使用的是旧版本 :-$ 。

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

新的功能

security-libs/javax.net.ssl 添加了 TLS 会话哈希和扩展的主密钥扩展支持 JDK JSSE 提供程序中添加了对 TLS 会话哈希和扩展的主密钥扩展 (RFC 7627) 的支持。请注意,一般情况下,如果未启用端点标识并且之前的握手是会话恢复缩写的初始握手,则服务器证书更改受到限制,除非两个证书所代表的身份可以视为相同。但是,如果启用或协商扩展,则不需要服务器证书更改限制,并将相应地丢弃。如果出现兼容性问题,应用程序可以通过在 JDK 中将系统属性 jdk.tls.useExtendedMasterSecret 设置为 false 来禁用此扩展的协商。通过将系统属性 jdk.tls.allowLegacyResumption 设置为 false,应用程序可以在会话散列和扩展主密钥扩展未协商时拒绝简短握手。通过将系统属性 jdk.tls.allowLegacyMasterSecret 设置为 false,应用程序可以拒绝不支持会话哈希和扩展主密钥扩展的连接。

请参阅 JDK-8148421


推荐阅读