获取javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure错误

我正在尝试使用Java-pns向iPhone发送推送通知但我收到以下错误 – javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

我的代码是 –

String token="95076d2846e8979b46efd1884206a590d99d0f3f6139d947635ac4186cdc5942"; String host = "gateway.sandbox.push.apple.com"; int port = 2195; String payload = "{\"aps\":{\"alert\":\"Message from Java o_O\"}}"; NotificationTest.verifyKeystore("res/myFile.p12", "password", false); KeyStore keyStore = KeyStore.getInstance("PKCS12"); keyStore.load(getClass().getResourceAsStream("res/myFile.p12"), "password".toCharArray()); KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509"); keyMgrFactory.init(keyStore, "password".toCharArray()); SSLContext sslContext = SSLContext.getInstance("TLS"); sslContext.init(keyMgrFactory.getKeyManagers(), null, null); SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory(); SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(host, port); String[] cipherSuites = sslSocket.getSupportedCipherSuites(); sslSocket.setEnabledCipherSuites(cipherSuites); sslSocket.startHandshake(); char[] t = token.toCharArray(); byte[] b = Hex.decodeHex(t); OutputStream outputstream = sslSocket.getOutputStream(); outputstream.write(0); outputstream.write(0); outputstream.write(32); outputstream.write(b); outputstream.write(0); outputstream.write(payload.length()); outputstream.write(payload.getBytes()); outputstream.flush(); outputstream.close(); System.out.println("Message sent .... "); 

对于NotificationTest.verifyKeystore,我得知这个有效的是File和Keystore。

我不明白为什么我会收到这个错误。

请有人帮帮我吗?

提前致谢 …

在我的日志中,我已经看到了

** CertificateRequest

证书类型:RSA,DSS,ECDSA

证书颁发机构:

[read] MD5和SHA1哈希:len = 10

0000:0D 00 00 06 03 01 02 40 00 00 ……. @ ..

** ServerHelloDone

[read] MD5和SHA1哈希:len = 4

0000:0E 00 00 00 ….

**证书链

**

** ClientKeyExchange,RSA PreMasterSecret,TLSv1

[写] MD5和SHA1哈希:len = 269

main,READ:TLSv1 Alert,length = 2

主,RECV TLSv1警告:致命,握手_失败

main,名为closeSocket()

main,处理exception:javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure

我不明白为什么证书颁发机构是空的?

使用-Djavax.net.debug=ssl,handshake.时,无法查看堆栈跟踪以及运行客户端或服务器时可能产生的输出-Djavax.net.debug=ssl,handshake. 然而:

String [] cipherSuites = sslSocket.getSupportedCipherSuites(); sslSocket.setEnabledCipherSuites(密码组);

不要那样做。 它从根本上说是不安全的,它只是隐藏了真正的问题,这几乎总是证书信任链问题:客户端不信任服务器的证书,反之亦然。