java - 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]
这里发生了什么?
解决方案
原来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
推荐阅读
- macos - Qt如何控制mac上的摄像头?
- excel - 是否可以在公式中使用单元格
- wordpress - 小部件未显示在 wordpress woocomerce 网站的商店页面上
- docker - 为什么我的 cgroup 写入吞吐量不受限制?
- c# - 如何编写脚本来自动化手动添加 services.DbContext 到 startup.cs 的过程?
- appx - 由于此问题,无法下载 Appx 文件
- graphql - NestJS GraphQL 联合循环解析器
- java - 具有错字容忍度、计数、特定于用户等的列表的高级过滤?
- node.js - 有没有办法fetchLess?阿波罗分页
- javascript - 如何从 OAuth2 获取公会