首页 >Java >java教程 >为什么升级到 Java 1.7 后我会收到'unrecognized_name”SSL 握手警报?

为什么升级到 Java 1.7 后我会收到'unrecognized_name”SSL 握手警报?

DDD
DDD原创
2024-12-07 07:12:10759浏览

Why Am I Getting an

SSL 握手警报:升级到 Java 1.7.0 后出现无法识别的名称问题

从 Java 1.6 升级到 1.7 后,用户可能会遇到建立 SSL 时出现 SSLHandshake 警报,并显示错误消息“unrecognized_name”连接到网络服务器。此错误主要是由于 Java 7 引入了服务器名称指示 (SNI) 支持,该支持默认情况下处于启用状态。

要解决此问题,有多个选项可用:

  • 禁用 SNI:

要全局禁用 SNI,请使用以下命令行参数可以在运行应用程序时使用:

-Djsse.enableSNIExtension=false

或者,可以在执行任何 SSL 操作之前以编程方式设置该属性:

System.setProperty("jsse.enableSNIExtension", "false");

但是,禁用 SNI 可能会对应用程序产生影响需要其功能。

  • 处理无法识别的名称警报:

另一种方法涉及更优雅地处理“unrecognized_name”警报。可以采取以下步骤:

// Create an SSLSocket with the desired hostname
SSLSocket sslsock = ...

// Attempt handshake
try {
    // This will block until the attempt succeeds or fails.
    sslsock.startHandshake();
} catch (SSLException e) {
    // Handle the exception here. If it contains the "unrecognized_name" message, disable SNI and retry.
}

// Disable SNI and retry handshake without hostname
if (e.getMessage().contains("unrecognized_name")) {
    sslsock = ... // Create an SSLSocket without specifying a hostname
    sslsock.startHandshake();
}
  • 允许不受信任的证书:

提供的代码尝试使用不受信任的服务器连接证书。为了缓解这种情况,请考虑实施自定义信任管理或使用内置信任管理器:

// Custom trust management (for untrusted certificates)
TrustManager[] trustAllCerts = ...

// Built-in trust manager
TrustManager[] trustManagers = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm()).getTrustManagers();

以上是为什么升级到 Java 1.7 后我会收到'unrecognized_name”SSL 握手警报?的详细内容。更多信息请关注PHP中文网其他相关文章!

声明:
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn