24

我对推送通知有疑问。我有一个由团队成员创建的 p.12 证书,并且我有要推送到的设备的设备令牌。我正在使用 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)

这是我用来测试的代码

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

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

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

4

2 回答 2

89

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

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

请执行以下 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与苹果服务器进行通信。

于 2012-09-30T07:29:39.717 回答
2

Sunny's answer is a great one, but unfortunately it didn't work for me.

I got it working by exporting the certificate/private key pair from the keychain. The trick is that the selection sequence matters! The certificate has to be selected first, followed by the private key.

Here is how it works:

  1. Import the certificate downloaded from Apple into the keychains
  2. Expand so that the private key is visible
  3. Select the certificate followed by the private key
  4. Right click and choose [Export 2 items...]
于 2016-09-09T15:42:21.417 回答