SSL 握手警报:升级到 Java 1.7.0 后出现无法识别的名称问题
从 Java 1.6 升级到 1.7 后,用户可能会遇到建立 SSL 时出现 SSLHandshake 警报,并显示错误消息“unrecognized_name”连接到网络服务器。此错误主要是由于 Java 7 引入了服务器名称指示 (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中文网其他相关文章!