获取 javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure 错误 [英] Getting javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure Error
问题描述
我正在尝试使用 Java-pns 向 iPhone 发送推送通知,但出现以下错误 -javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure
I am trying to send push notification to iPhone using Java-pns but I am getting the following error - javax.net.ssl.SSLHandshakeException: Received fatal alert: 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,我发现这是有效的文件和密钥库.
For NotificationTest.verifyKeystore I am getting that this valid is File and Keystore.
我不明白为什么我会收到这个错误.
I am not understanding why I am getting this error.
请问有人可以帮我吗?
提前致谢...
在我的日志中我看到了
** 证书请求
证书类型:RSA、DSS、ECDSA
Cert Types: RSA, DSS, ECDSA
认证机构:
[阅读] MD5 和 SHA1 哈希值:len = 10
[read] MD5 and SHA1 hashes: len = 10
0000: 0D 00 00 06 03 01 02 40 00 00 .....@..
0000: 0D 00 00 06 03 01 02 40 00 00 .......@..
** ServerHelloDone
** ServerHelloDone
[阅读] MD5 和 SHA1 哈希值:len = 4
[read] MD5 and SHA1 hashes: len = 4
0000: 0E 00 00 00 ....
0000: 0E 00 00 00 ....
** 证书链
**
** ClientKeyExchange、RSA PreMasterSecret、TLSv1
** ClientKeyExchange, RSA PreMasterSecret, TLSv1
[write] MD5 和 SHA1 哈希值:len = 269
[write] MD5 and SHA1 hashes: len = 269
.
.
.
.
.
主要,阅读:TLSv1 警报,长度 = 2
main, READ: TLSv1 Alert, length = 2
主要,RECV TLSv1 警报:致命,握手失败
main, RECV TLSv1 ALERT: fatal, handshake_failure
main,调用 closeSocket()
main, called closeSocket()
main,处理异常:javax.net.ssl.SSLHandshakeException:收到致命警报:握手_失败
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
我不明白为什么证书颁发机构:是空的?
I am not understanding why Cert Authorities: is empty?
推荐答案
如果没有看到堆栈跟踪和可能在使用 -Djavax.net.debug=ssl,handshake 运行客户端或服务器时产生的输出,就无法回答.
但是:
Impossible to answer without seeing a stack trace and possibly the output produced when running client or server with -Djavax.net.debug=ssl,handshake.
However:
String[] cipherSuites = sslSocket.getSupportedCipherSuites();sslSocket.setEnabledCipherSuites(cipherSuites);
String[] cipherSuites = sslSocket.getSupportedCipherSuites(); sslSocket.setEnabledCipherSuites(cipherSuites);
不要那样做.它根本不安全,它只是掩盖了真正的问题,这几乎总是一个证书信任链问题:要么客户端不信任服务器的证书,反之亦然.
Don't do that. It is radically insecure, and it just conceals the real problem, which is almost always a certificate trust chain problem: either the client doesn't trust the server's certificate or vice versa.
这篇关于获取 javax.net.ssl.SSLHandshakeException:收到致命警报:handshake_failure 错误的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!