元数据
| id | tls-jdk-upgrade | 收录 | 2026-08-30 |
|---|---|---|---|
| 问题域 | 安全与治理 | 主题分组 | 网络与镜像 |
| 适用工具 | jdk · 外部工具openssl · 外部工具 | ||
症状
HTTPS 调用报 `SSLHandshakeException: Received fatal alert: protocol_version` 或 `No appropriate protocol`;openssl 三连测中 TLS1.0/1.1 与 TLS1.2 结果不对称(一边通一边不通)。
原因
客户端与服务端可用 TLS 版本集合交集为空:服务端仅旧协议(TLSv1.0/1.1)、客户端默认禁旧协议;或老 JDK 默认最高 TLS1.0 连新服务端;或代码硬编码旧协议。
解法
1. openssl 三连测定位哪边受限(`-tls1` / `-tls1_1` / `-tls1_2`);
2. 服务端:nginx `ssl_protocols TLSv1.2 TLSv1.3;`,升级老 openssl;
3. 客户端:java.security `jdk.tls.disabledAlgorithms` 加 `TLSv1, TLSv1.1`(全局),或 `-Djdk.tls.client.protocols=TLSv1.2,TLSv1.3`(当前应用),或代码 `setEnabledProtocols`(单连接);
4. 排查并清理 `TLSv1`/SSLv3 硬编码与跳过校验的 HostnameVerifier;
5. 三连测验证:1.2 通、1.0/1.1 拒。
验证证据
- 机制实测(2026-08-30,WSL Ubuntu,OpenSSL 3.5.5):本地 TLS1.0-only 服务端 → TLS1.2 客户端握手失败(`unsupported protocol`);TLS1.0 客户端成功。反向 TLS1.2-only 服务端 → TLS1.0 客户端报 `tlsv1 alert protocol version`(即 Java 侧 `Received fatal alert: protocol_version` 的底层),TLS1.2 客户端成功。证据:实测复现日志(2026-08-30)。
- 未实测:本机无 JDK 1.6/1.7/8,版本默认行为表来自原文《万字长文!TLS协议升级避坑手册》(净重21克,2026-08-26),未在本机复现;OpenSSL 3.5 默认安全级已禁 TLS1.0/1.1,与新版 JDK 默认禁旧协议机制相同。
来源与证据
素材来源:https://www.cnblogs.com/xsge/p/22703862
验证证据:Evidence details kept locally (2026-08-30)