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

时间:2012-06-15 08:26:26

标签: java ssl apple-push-notifications

我正在尝试使用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 我知道这个有效的是文件和密钥库。

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

请有人帮助我吗?

提前致谢...

在我的日志中,我看到了

** CertificateRequest

证书类型:RSA,DSS,ECDSA

证书颁发机构:

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

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

** ServerHelloDone

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

<00> 0000:0E 00 00 00 ....

**证书链

**

** ClientKeyExchange,RSA PreMasterSecret,TLSv1

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

main,READ:TLSv1 Alert,length = 2

主要,RECV TLSv1警告:致命,handshake_failure

main,名为closeSocket()

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

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

1 个答案:

答案 0 :(得分:3)

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

  

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

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