24

プッシュ通知に問題があります。チームメンバーによって作成された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<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ファイルは使用しないでください。代わりに、秘密鍵から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アップルサーバーとの通信に使用する必要があります。

于 2012-09-30T07:29:39.717 に答える
2

サニーの答えは素晴らしいものですが、残念ながらそれは私にはうまくいきませんでした。

キーチェーンから証明書/秘密鍵のペアをエクスポートすることで機能しました。秘訣は、選択順序が重要であるということです。最初に証明書を選択し、次に秘密鍵を選択する必要があります。

仕組みは次のとおりです。

  1. Appleからダウンロードした証明書をキーチェーンにインポートします
  2. 秘密鍵が表示されるように展開します
  3. 証明書に続いて秘密鍵を選択します
  4. 右クリックして[2つのアイテムをエクスポート...]を選択します
于 2016-09-09T15:42:21.417 に答える