Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Welcome To Ask or Share your Answers For Others

Categories

0 votes
582 views
in Technique[技术] by (71.8m points)

java - Getting javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure Error

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

My code is -

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 .... ");

For NotificationTest.verifyKeystore I am getting that this valid is File and Keystore.

I am not understanding why I am getting this error.

Please anybody can help me?

Thanks in Advance ...

In my log I have seen that

** CertificateRequest

Cert Types: RSA, DSS, ECDSA

Cert Authorities:

[read] MD5 and SHA1 hashes: len = 10

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

** ServerHelloDone

[read] MD5 and SHA1 hashes: len = 4

0000: 0E 00 00 00 ....

** Certificate chain

**

** ClientKeyExchange, RSA PreMasterSecret, TLSv1

[write] MD5 and SHA1 hashes: len = 269

.

.

.

.

.

main, READ: TLSv1 Alert, length = 2

main, RECV TLSv1 ALERT: fatal, handshake_failure

main, called closeSocket()

main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

I am not understanding why Cert Authorities: is empty?

See Question&Answers more detail:os

与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome To Ask or Share your Answers For Others

1 Answer

0 votes
by (71.8m points)

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);

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.


与恶龙缠斗过久,自身亦成为恶龙;凝视深渊过久,深渊将回以凝视…
Welcome to OStack Knowledge Sharing Community for programmer and developer-Open, Learning and Share
Click Here to Ask a Question

...