Javax.net.ssl.SSLHandshakeException: Fatal warning received: handshake_failure APN error

I am trying to send a push notification to iPhone using Java-pns, but I am getting the following error ...

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure 

This is my code ...

 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 get that this value is equal to File and Keystore .

I do not understand why I am getting this error.

This is my error log ...

 ** CertificateRequest Cert Types: RSA, DSS, ECDSA Cert Authorities: <empty> [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 don’t understand why certification bodies are empty?

+4
source share
3 answers

To send a push notification to iPhone / iPad, I used JavaPNS .

It is very easy to use and it worked for me.

We can just follow this one to use it.

-3
source

I recommend that you use keytool -list to compare the key store on the client with those known to the server. The error in establishing the connection that you receive is that the server did this hello and is waiting for a response to the client certificate. You do not send it. To fix this, the PKCS12 certificate must be converted to the PEM format (using openssl is one way) and then imported into the keystore using a keyboard tool.

I suspect that if you fix this by importing the client certificate into the keystore, you will hit the second error. The second error will concern empty CA certificates - probably because you do not have a CA certificate that is known to your server in your keystore. Import your CA and try again.

+4
source

It looks like you need to install "Decryption of security policies for unlimited protection of Java Cryptography Extension (JCE)." This solved the problem for me.

0
source

All Articles