2012-09-25 14 views
23

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 di fare il push (provato anche i javaapns Lib con gli stessi risultati), ma continuo a ricevere questo errore:Impossibile inviare notifiche push utilizzando l'errore di handshake SSL Javapns/Javaapns

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<PushedNotification> 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?

risposta

89

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

Alla fine ho scoperto che il problema era dovuto allo 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 

Dopo di che, è necessario utilizzare iphone_dev.p12 per comunicare con il server di Apple.

+0

grazie salvami la vita. – aybars

+0

Solo wow! Esportando incredibilmente il certificato e la chiave privata come p12 dal portachiavi non ha funzionato. Ma la tua soluzione ha funzionato. – Elendir

1

Sunny's answer è un grande, 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. Importare il certificato scaricato da Apple nel portachiavi
  2. Espandere in modo che la chiave privata è visibile
  3. Selezionare il certificato seguito dal tasto privata
  4. Fare clic destro e scegliere [Esporta 2 articoli ...]
Problemi correlati