2012-09-25 13 views
23

プッシュ通知に問題があります。チームメンバーによって作成されたp.12証明書があり、プッシュするデバイスのデバイストークンがあります。私はプッシュを行うにはjavapnsライブラリを使用しています(これも同じ結果とjavaapns libにを試してみました)が、私はこのエラーを取得しておいてください。Javapns/Javaapnsを使用してプッシュ通知を送信できないSSLハンドシェイクのエラー

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を使用することに新しいので、おそらく私は何か間違っているか、別のマシンで生成された証明書を使用できないのでしょうか?

答えて

89

私は新しいiOS開発者です。以前は同じ問題がありました。

最後に、この問題はp12 certificateが原因であることがわかりました。 秘密鍵p12ファイルは使用しないでください。秘密鍵からp12を、Appleからcertをダウンロードしてください。

は正しいP12ファイルを取得するには、次のOpenSSLコマンドを実行してください。その後

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を使用する必要があります。

+0

私の人生を保存してください。 – aybars

+0

ちょうどうわー!キーチェーンからp12として驚いたことに証明書と秘密鍵をエクスポートできませんでした。しかし、あなたのソリューションはそうでした。 – Elendir

1

Sunny's answerは素晴らしいですが、残念ながらそれは私のためには機能しませんでした。

私はキーチェーンから証明書/秘密鍵のペアをエクスポートすることで動作しています。トリックは選択シーケンスが重要であることです!最初に証明書を選択し、続いて秘密鍵を選択する必要があります。ここで

は、それがどのように動作するかです:

  1. インポートキーホルダー
  2. にアップルからダウンロードした証明書は、秘密鍵が
  3. プライベートキーに続いて証明書を選択し
  4. 見えるように展開します右クリックし[エクスポート2の項目]を選択してください。
関連する問題