Received fatal alert handshake_failure 错误
# 常见问题 - Received fatal alert: handshake_failure
错误
# 1. 错误描述
在使用 Hutool-HTTP 进行 HTTPS 请求时,可能会遇到 Received fatal alert: handshake_failure
错误。该错误通常出现在尝试连接某些 HTTPS 服务器时,原因通常与 JDK 的 SSL/TLS 安全机制配置有关。
# 2. 错误分析
该错误的主要原因通常与以下几方面有关:
- JDK 版本问题:某些较旧版本的 JDK 默认未启用最新的 TLS 协议(如 TLS 1.2),这会导致与部分服务器在 SSL/TLS 握手时出现协议不匹配。
- SSL/TLS 协议配置问题:服务器要求使用特定的 TLS 协议版本,但客户端未启用或支持该版本。
- JCE 安全限制:JDK 中的 Java Cryptography Extension (JCE) 可能限制了某些加密算法的使用,导致握手失败。
# 3. 解决方案
# 方法 1:升级 JDK 版本
如果你使用的是 JDK 8,建议升级到 JDK 8 的较新版本,例如 jdk1.8.0_181
或更高版本。新版 JDK 默认启用了更多的安全协议和加密算法,能有效解决该问题。
# 方法 2:手动配置 HTTPS 协议
如果升级 JDK 后问题仍然存在,或者无法升级 JDK,可以尝试手动配置 HTTPS 协议。通过以下代码设置支持的协议版本:
// 设置支持的 HTTPS 协议
System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
1
2
2
TLSv1.2, TLSv1.1, SSLv3
:该配置确保客户端在与服务器进行 SSL/TLS 握手时,支持多种常见协议。如果服务器仅支持其中某一个协议,握手过程将自动选择合适的版本。
# 示例代码:解决 handshake_failure
错误
import cn.hutool.http.HttpRequest;
public class HttpsExample {
public static void main(String[] args) {
// 设置支持的 HTTPS 协议版本
System.setProperty("https.protocols", "TLSv1.2,TLSv1.1,SSLv3");
// 发起 HTTPS 请求
String result = HttpRequest.get("https://example.com")
.timeout(20000) // 设置超时时间
.execute()
.body();
// 打印响应结果
System.out.println(result);
}
}
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
注意:
- 在实际开发中,HTTPS 协议的选择应根据服务器的配置进行调整,确保与服务器支持的协议版本一致。
- 如果服务器明确不支持某些协议(如 SSLv3),可以删除相应的协议配置。
# 4. 适用场景
- 场景 1:旧版 JDK:使用 JDK 8 较低版本进行 HTTPS 请求时,因协议不匹配导致握手失败。
- 场景 2:服务器限制特定协议:服务器仅支持特定版本的 TLS 协议(如 TLS 1.2),但客户端未正确配置。
- 场景 3:开发环境与生产环境不一致:在开发环境和生产环境中,可能由于不同的 SSL/TLS 配置导致代码在某些环境中无法正常运行。
编辑此页 (opens new window)
上次更新: 2024/12/28, 18:32:08