程序问答   发布时间:2022-06-02  发布网站:大佬教程  code.js-code.com
大佬教程收集整理的这篇文章主要介绍了SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误大佬教程大佬觉得挺不错的,现在分享给大家,也给大家做个参考。

如何解决SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误?

开发过程中遇到SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误的问题如何解决?下面主要结合日常开发的经验,给出你关于SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误的解决方法建议,希望对你解决SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误有所启发或帮助;

Java 7引入了默认情况下启用的SNI支持。我发现某些配置错误的服务器会在SSL握手中发送“无法识别的名称”警告,大多数客户端会忽略此警告… Java除外。如@Bob Kerns所述,Oracle工程师拒绝“修复”此错误/功能。

解决方法是,他们建议设置Jsse.enableSNIExtension属性。要使你的程序无需重新编译即可运行,请按以下方式运行你的应用程序:

java -DJsse.enableSNIExtension=false yourClass

也可以在Java代码中设置该属性,但是必须在任何SSL操作之前设置该属性。加载SSL库后,你可以更改属性,但不会对SNI status 产生任何影响。要在运行时禁用SNI(具有上述限制),请使用:

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

设置此标志的缺点是SNI在应用程序中的任何地方都被禁用。为了利用SNI并仍然支持配置错误的服务器:

  1. SSLSocket使用你要连接的主机名创建一个。让我们命名为sslsock
  2. 尝试运行sslsock.startHandshake()。这将阻塞直到完成或在错误时引发异常。每当中发生错误时startHandshake(),请获取异常消息。如果等于handshake alert: unrecognized_name,则说明服务器配置错误
  3. 收到unrecognized_name警告后(在Java中是致命错误),请重新尝试打开SSLSocket,但这次没有主机名。这有效地禁用了SNI(毕竟,SNI扩展名是关于在ClIEntHello消息中添加主机名)。

解决方法

我今天从Java 1.6升级到Java 1.7。从那时起,当我尝试通过SSL建立到我的Web服务器的连接时发生错误:

javax.net.ssl.SSLProtocolException: handshake alert:  unrecognized_name
    at sun.security.ssl.ClientHandshaker.handshakeAlert(ClientHandshaker.java:1288)
    at sun.security.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1904)
    at sun.security.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:1027)
    at sun.security.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1262)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1289)
    at sun.security.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1273)
    at sun.net.www.protocol.https.httpsClient.afterConnect(httpsClient.java:523)
    at sun.net.www.protocol.https.AbstractDelegatehttpsURLConnection.connect(AbstractDelegatehttpsURLConnection.java:185)
    at sun.net.www.protocol.http.httpURLConnection.geTinputStream(httpURLConnection.java:1296)
    at sun.net.www.protocol.https.httpsURLConnectionImpl.geTinputStream(httpsURLConnectionImpl.java:254)
    at java.net.URL.openStream(URl.java:1035)

这是代码:

SAXBuilder builder = new SAXBuilder();
Document document = null;

try {
    url = new URL(https://some url);
    document = (Document) builder.build(url.openStream());
} catch (NoSuchAlgorithmException eX) {
    Logger.getLogger(DownloadLoaDiciousComputer.class.getName()).log(Level.SEVERE,null,eX);  
}

这只是一个测试项目,这就是为什么我允许和使用不受信任的证书以及代码的原因:

TrustManager[] trustAllCerts = new TrustManager[]{
    new X509TrustManager() {

        public java.security.cert.X509Certificate[] getAcceptedIssuers() {
            return null;
        }

        public void checkClientTrusted(
                java.security.cert.X509Certificate[] certs,String authTypE) {
        }

        public void checkServerTrusted(
                java.security.cert.X509Certificate[] certs,String authTypE) {
        }
    }
};

try {

    SSLContext sc = SSLContext.geTinstance("SSL");
    sc.init(null,trustAllCerts,new java.security.SecureRandom());
    httpsURLConnection.setDefaultSSLSocketFactory(sc.getSocketFactory());
} catch (Exception E) {

    Logger.getLogger(DownloadManager.class.getName()).log(Level.SEVERE,E);
} 

大佬总结

以上是大佬教程为你收集整理的SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误全部内容,希望文章能够帮你解决SSL handshake alert: 自升级到Java 1.7.0后出现unrecognized_name错误所遇到的程序开发问题。

如果觉得大佬教程网站内容还不错,欢迎将大佬教程推荐给程序员好友。

本图文内容来源于网友网络收集整理提供,作为学习参考使用,版权属于原作者。
如您有任何意见或建议可联系处理。小编QQ:384754419,请注明来意。