Imansible inviare notifiche push utilizzando l’errore di handshake SSL Javapns / Javaapns

Ho un problema con le notifiche push. Ho un certificato p.12 che è stato creato da un membro del team e ho il token dispositivo per il dispositivo a cui essere spinto. Sto usando la libreria javapns per fare il push (ho anche provato la libreria javaapns con gli stessi risultati) ma continuo a ricevere questo errore:

javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174) at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:136) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.recvAlert(SSLSocketImpl.java:1720) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:954) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1138) at com.sun.net.ssl.internal.ssl.SSLSocketImpl.writeRecord(SSLSocketImpl.java:632) at com.sun.net.ssl.internal.ssl.AppOutputStream.write(AppOutputStream.java:59) at java.io.OutputStream.write(OutputStream.java:58) at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:402) at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:350) at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:320) at javapns.Push.sendPayload(Push.java:177) at javapns.Push.combined(Push.java:100) at PushTest.push(PushTest.java:43) at PushTest.main(PushTest.java:25) 

e questo è il codice che sto usando per testare

 try { List n = Push.combined(text, 20, null, file, "********", false, token); for (PushedNotification notification : n) { if (notification.isSuccessful()) System.out.println("Push notification sent successfully to: " + notification.getDevice().getToken()); else { String invalidToken = notification.getDevice().getToken(); Exception theProblem = notification.getException(); theProblem.printStackTrace(); ResponsePacket theErrorResponse = notification.getResponse(); if (theErrorResponse != null) System.out.println(theErrorResponse.getMessage()); } } } catch (CommunicationException e) { // TODO Auto-generated catch block e.printStackTrace(); } catch (KeystoreException e) { // TODO Auto-generated catch block e.printStackTrace(); } 

Ho letto e provato i suggerimenti di molti altri post, inclusa l’importazione del certificato nel keystore di cacerts, ma l’importazione ha avuto esito negativo. Sto sviluppando usando eclipse su una macchina Windows.

Qualcuno ha familiarità con questo problema? Sono nuovo nell’usare ssl quindi forse sto facendo qualcosa di sbagliato o non posso usare un certificato generato su un’altra macchina?

Sono un nuovo sviluppatore iOS e ho avuto lo stesso problema prima.

Alla fine ho scoperto che il problema era dovuto al p12 certificate . Non dovremmo usare il file p12 della chiave privata, dovremmo invece generare un p12 dalla tua chiave privata e il download di cert da Apple.

Si prega di eseguire il seguente comando OpenSSL per ottenere il file p12 corretto:

 developer_identity.cer <= download from Apple mykey.p12 <= Your private key openssl x509 -in developer_identity.cer -inform DER -out developer_identity.pem -outform PEM openssl pkcs12 -nocerts -in mykey.p12 -out mykey.pem openssl pkcs12 -export -inkey mykey.pem -in developer_identity.pem -out iphone_dev.p12 

Dopodiché, dovresti usare iphone_dev.p12 per comunicare con Apple Server.

La risposta di Sunny è fantastica, ma sfortunatamente non ha funzionato per me.

Ho funzionato esportando la chiave del certificato / chiave privata dal portachiavi. Il trucco è che la sequenza di selezione conta! Il certificato deve essere selezionato per primo, seguito dalla chiave privata.

Ecco come funziona:

  1. Importa il certificato scaricato da Apple nei portachiavi
  2. Espandi in modo che la chiave privata sia visibile
  3. Seleziona il certificato seguito dalla chiave privata
  4. Fai clic con il tasto destro e scegli [Esporta 2 elementi …]