プッシュ通知に問題があります。チームメンバーによって作成された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を初めて使用するので、何か間違っているのでしょうか、それとも別のマシンで生成された証明書を使用できないのですか?
私は新しい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
を使用してAppleサーバーと通信します。
サニーの答え は素晴らしいものですが、残念ながらうまくいきませんでした。
キーチェーンから証明書/秘密鍵のペアをエクスポートすることで機能しました。トリックは、選択順序が重要であることです!最初に証明書を選択し、次に秘密鍵を選択する必要があります。
以下にその仕組みを示します。