我有一个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]
这是怎么回事?
答案 0 :(得分:0)
结果显示不同的Java版本。我的本地主机正在使用旧版本:-$。
Java™SE开发工具包8,更新161(JDK 8u161),2018年1月16日
新功能
security-libs / javax.net.ssl添加了TLS会话哈希和扩展的master 秘密扩展支持已添加对TLS会话的支持 JDK JSSE中的哈希和扩展主密钥扩展(RFC 7627) 提供者。请注意,通常,服务器证书更改为 如果未启用端点标识,并且前一个 握手是会话恢复的缩写初始握手, 除非可以同时考虑两个证书所代表的身份 一样。但是,如果启用或协商了扩展名,则 服务器证书更改限制不是必需的,将是 相应地丢弃。如果存在兼容性问题,请申请 可以通过设置系统来禁用此扩展程序的协商 在JDK中,将jdk.tls.useExtendedMasterSecret属性设置为false。通过 将系统属性jdk.tls.allowLegacyResumption设置为false, 会话哈希时,应用程序可以拒绝简短的握手 与扩展主密钥扩展未协商。通过设置 系统属性jdk.tls.allowLegacyMasterSecret为false, 应用程序可以拒绝不支持该会话的连接 哈希和扩展的主密钥扩展。
请参见JDK-8148421