无法使用Javapns / Javaapns SSL握手失败发送推送通知

我有推送通知的问题。 我有一个由团队成员创建的p.12证书,我有要推送到的设备的设备令牌。 我正在使用javapns库来执行推送(也尝试了相同结果的javaapns lib)但我不断收到此错误:

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) 

这是我用来测试的代码

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

我阅读并尝试了其他几个post的建议,包括将证书导入cacerts密钥库,但导入也失败了。 我正在使用Windows上的eclipse进行开发。

有谁熟悉这个问题? 我是新手使用ssl所以也许我做错了或者我不能使用在另一台机器上生成的证书?

我是一名新的iOS开发人员,之前我遇到过同样的问题。

我终于发现问题是由于p12 certificate 。 我们不应该使用私钥p12文件,而是应该从您的私钥生成p12并从Apple下载证书。

请执行以下OpenSSL命令以获取正确的p12文件:

 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 

之后,您应该使用iphone_dev.p12与Apple服务器进行通信。

Sunny的答案很棒,但不幸的是它对我不起作用。

我通过从钥匙串导出证书/私钥对来实现它。 诀窍是选择序列很重要! 必须首先选择证书,然后选择私钥。

下面是它的工作原理:

  1. 将从Apple下载的证书导入到钥匙串中
  2. 展开以便私钥可见
  3. 选择证书,然后选择私钥
  4. 右键单击并选择[导出2个项目…]