JDK 1.5 SSLHandshakeException

问题描述:

我有一个奇怪的问题,我无法修复。JDK 1.5 SSLHandshakeException

我有通过套接字的JDK 1.5版本和基于SSL的通信,只需发送和接收字符串数据。

try { 

    KeyStore ks = KeyStore.getInstance("JKS"); 
    ks.load(new FileInputStream(
      "path_to_.jks"), 
      "secret_of_jks".toCharArray()); 

    TrustManagerFactory tmf = TrustManagerFactory 
      .getInstance(TrustManagerFactory.getDefaultAlgorithm()); 
    tmf.init(ks); 
    KeyManagerFactory kmf = KeyManagerFactory 
      .getInstance(KeyManagerFactory.getDefaultAlgorithm()); 
    kmf.init(ks, "secret_of_jks".toCharArray()); 
    SSLContext ctx = SSLContext.getInstance("TLS"); 
    ctx.init(kmf.getKeyManagers(), tmf.getTrustManagers(), null); 
    Socket s = ctx.getSocketFactory().createSocket("address_of_server", PORT); 

    String jsonEx = "json text to send server"; 
    StringBuilder sb = new StringBuilder(); 
    sb.append(jsonEx.getBytes().length); 
    sb.append("\r\n"); 
    sb.append(jsonEx); 


    PrintWriter writer = new PrintWriter(s.getOutputStream(), true); 
    writer.println(sb.toString()); 
    BufferedReader in = new BufferedReader(new InputStreamReader(s.getInputStream())); 
    System.out.println(in.readLine()); 
    writer.flush(); 
} catch (Exception e) { 
    e.printStackTrace(); 
} 

当我使用JDK 1.7+一切工作正常,但是当我切换到1.6倍,它抛出javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake

我的证书加密的2048,我还安装了JCE无限制强度仲裁策略 http://www.oracle.com/technetwork/java/javase/downloads/jce-6-download-429243.html

这里是一些例外,如果有人感兴趣:

javax.net.ssl.SSLException:Connection has has被关闭: javax.net.ssl.SSLHandshakeException:在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.checkEOF(SSLSocketImpl.java:1154) 握手期间关闭远程主机连接 在 的com.sun。 net.ssl.internal.ssl.AppInputStream.read(AppInputStream.java:65) 在 sun.nio.cs.StreamDecoder $ CharsetSD.readBytes(StreamDecoder.java:411) 在 sun.nio.cs.StreamDecoder $ CharsetSD.implRead(StreamDecoder.java:453) at sun.nio.cs.StreamDecoder.read(StreamDecoder.java:183)at java.io.InputStreamReader.read(InputStreamReader.java:167)at java.io. BufferedReader.fill(BufferedReader.java:136)at java .io.BufferedReader.readLine(BufferedReader.java:299) java.io.BufferedReader.readLine(BufferedReader.java:362)at ConnectorTest.main(ConnectorTest.java:45)引起者: javax.net.ssl .SSLHandshakeException:远程主机在 com.sun.net.ssl.internal.ssl.SSLSocketImpl收于 com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:739)连接 握手期间 .performInitialHandshake(SSLSocketImpl.java:1025) 在 com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:619) 在 com.sun.net.ssl.internal.ssl.AppOutputStream .write(AppOutputStream.java:59) at sun.nio.cs.StreamEncoder $ CharsetSE.writeBytes(StreamEncoder.java:336) 在 sun.nio.cs.StreamEncoder $ CharsetSE.implFlushBuffer(StreamEncoder.java:404) 在 sun.nio.cs.StreamEncoder $ CharsetSE.implFlush(StreamEncoder.java:408) 在sun.nio.cs.StreamEncoder.flush(StreamEncoder.java:152)在 java.io.OutputStreamWriter.flush(OutputStreamWriter.java:213)在 java.io .BufferedWriter.flush(BufferedWriter.java:236)at java.io.PrintWriter.newLine(PrintWriter.java:410)at java.io.PrintWriter.println(PrintWriter.java:559)at java.io.PrintWriter .println(PrintWriter.java:670)at ConnectorTest.main(ConnectorTest.java:43)引起者: java.io.EOFException:SSL对等方关闭不正确 com.sun.net.ssl.internal.ssl.InputRecord.read(InputRecord.java:321) at com.sun.net.ssl.internal.ssl .SSLSocketImpl.readRecord(SSLSocketImpl.java:720) ...13多

ConnectorTest Line 43 is 

System.out.println(in.readLine()); 

更新

trigger seeding of SecureRandom 
done seeding SecureRandom 
Allow unsafe renegotiation: false 
Allow legacy hello messages: true 
Is initial handshake: true 
Is secure renegotiation: false 
%% No cached client session 
*** ClientHello, TLSv1 
RandomCookie: GMT: 1439443814 bytes = { 228, 36, 73, 128, 109, 225, 11, 36, 62, 40, 147, 150, 27, 145, 150, 163, 244, 28, 97, 56, 188, 81, 117, 31, 235, 60, 101, 224 } 
Session ID: {} 
Cipher Suites: [SSL_RSA_WITH_RC4_128_MD5, SSL_RSA_WITH_RC4_128_SHA, TLS_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_RSA_WITH_AES_128_CBC_SHA, TLS_DHE_DSS_WITH_AES_128_CBC_SHA, SSL_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA, SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA, SSL_RSA_WITH_DES_CBC_SHA, SSL_DHE_RSA_WITH_DES_CBC_SHA, SSL_DHE_DSS_WITH_DES_CBC_SHA, SSL_RSA_EXPORT_WITH_RC4_40_MD5, SSL_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA, SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA, TLS_EMPTY_RENEGOTIATION_INFO_SCSV] 
Compression Methods: { 0 } 
*** 
main, WRITE: TLSv1 Handshake, length = 75 
main, WRITE: SSLv2 client hello message, length = 101 
main, received EOFException: error 
main, handling exception: javax.net.ssl.SSLHandshakeException: Remote host closed connection during handshake 
main, SEND TLSv1 ALERT: fatal, description = handshake_failure 
main, WRITE: TLSv1 Alert, length = 2 
main, called closeSocket() 

更新2

我刚刚发现,它们之间的区别是:

从星期二有效02月16日20时07分36秒GET直到2016周四02月16日20时07分36秒GET 2017年 1.7 正确

从星期二02月16日16时07分36秒GMT 2016有效期至星期四二月16 16时07分36秒 GMT 2017年1.6错误

+0

您可以检查此链接,而不是一个解决方案,但一些见解: http://*.com/questions/21245796/javax-net-ssl-sslhandshakeexception-remote-host-closed-connection-during-handsh –

了大量的研究后,我发现,有没有办法做到这一点,当然,安装无限的政策也是丑陋的解决方案。 Sun不建议我们改变政策。解决这个问题的最好方法是,总是保持你的Java版本比这个更好。为此,我不得不写1.5,并且没有其他机会只需升级系统,并决定差,但唯一的解决办法,那工作,当然。我在具有不同Jboss端口的同一台计算机上创建了一些具有Java 1.8 + Wildlfy 8.2的代理服务,并从那里调用服务。 1.5和1.8应用程序与简单的肥皂协议进行通信。问题“固定”。

可能是因为服务器不支持客户端的SSL版本(客户端提供过低的SSL版本)。

尝试添加系统属性“javax.net.debug = SSL”,所以你得到一个更好的错误描述成系统的。例如:

System.setProperty("javax.net.debug", "ssl"); 

或添加命令行参数:

-Djavax.net.debug=ssl 

你为什么要使用旧的Java?如果您必须使用1.6,请尝试将其更新到最新的修补程序版本。

+0

我必须使用旧版本,但没有理由,如果我更新到1.6,它只适用于Java 1.7 +。我编辑的调试日志我的问题。 – Mike

+0

检查: http://*.com/questions/9828414/receiving-sslhandshakeexception-handshake-failure-despite-my-client-ignoring-al – user2170710