2012-09-25 17 views
23

Tengo un problema con las notificaciones automáticas. Tengo un certificado p.12 que fue creado por un miembro del equipo y tengo el token del dispositivo para que se envíe el dispositivo. Estoy usando la biblioteca javapns hacer el empuje (también probé los javaapns lib con los mismos resultados), pero me siguen dando este error:No se pueden enviar notificaciones push usando Javapns/Javaapns Error de protocolo de enlace SSL

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) 

y este es el código que estoy utilizando para probar

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

He leído y probado las sugerencias de varias de las otras publicaciones, incluida la importación del certificado en cacerts keystore, pero la importación también falla. Estoy desarrollando usando eclipse en una máquina de Windows.

¿Alguien familiarizado con este problema? Soy nuevo en el uso de ssl entonces quizás estoy haciendo algo mal o es que no puedo usar un certificado generado en otra máquina?

Respuesta

89

Soy un nuevo desarrollador de iOS y tuve el mismo problema anteriormente.

Finalmente encontré que el problema se debía al p12 certificate. No deberíamos usar el archivo de clave privada p12, en su lugar debemos generar un p12 de su clave privada y la descarga de cert de Apple.

favor ejecute el siguiente comando OpenSSL para obtener el archivo p12 correcta:

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 

Después de eso, se debe utilizar iphone_dev.p12 para comunicarse con el servidor de manzana.

+0

gracias save my life. – aybars

+0

¡Simplemente guau! Sorprendentemente, exportar el certificado y la clave privada como p12 desde el llavero no funcionó. Pero tu solución sí. – Elendir

1

Sunny's answer es genial, pero lamentablemente no funcionó para mí.

Lo tengo trabajando exportando el certificado/par de claves privadas del llavero. ¡El truco es que la secuencia de selección importa! El certificado debe seleccionarse primero, seguido de la clave privada.

Así es como funciona:

  1. Importe el certificado descargado de Apple en los llaveros
  2. Ampliar de manera que la clave privada es visible
  3. Seleccione el certificado seguido de la clave privada
  4. Haga clic derecho y elija [Exportar 2 elementos ...]
Cuestiones relacionadas