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

标签 java ssl-certificate apple-push-notifications

我对推送通知有疑问。我有一个由团队成员创建的 p.12 证书,并且我有要推送到的设备的设备 token 。我正在使用 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 keystore ,但导入也失败了。我正在 Windows 机器上使用 eclipse 进行开发。

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

最佳答案

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

我终于发现问题出在p12证书上。 我们不应该使用私钥 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 与苹果服务器通信。

关于java - 无法使用 Javapns/Javaapns SSL 握手失败发送推送通知,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12585858/

相关文章:

java - 如何使用缩略图调整图像大小时将黑色背景替换为白色?

python-2.7 - 检查文件是证书还是 key

java - 向 APNS 发送推送通知(AdHoc 部署)

java android 非常大的xml解析

java - Mockito 缺少any*() 静态方法 1. 如何合理替换?

ios - 我应该如何处理通过多个 channel 分发的应用程序的推送通知?

ssl - CAS + SSLHandshakeException + ValidatorException + PKIX 路径构建失败 + 无法找到请求目标的有效证书路径

c# - Xamarin.Forms - iOS RegisteredForRemoteNotifications 没有被调用

ios - Apple 开发者仪表板 - 应用程序 ID 部分缺失

java - 如何将方阵分解为方阵子矩阵?