1

Java-pns を使用して iPhone にプッシュ通知を送信しようとしていますが、次のエラーが発生します - javax.net.ssl.SSLHandshakeException: 致命的なアラートを受信しました: handshake_failure

私のコードは -

String token="95076d2846e8979b46efd1884206a590d99d0f3f6139d947635ac4186cdc5942";
String host = "gateway.sandbox.push.apple.com";
int port = 2195;
String payload = "{\"aps\":{\"alert\":\"Message from Java o_O\"}}";

NotificationTest.verifyKeystore("res/myFile.p12", "password", false);
KeyStore keyStore = KeyStore.getInstance("PKCS12");
keyStore.load(getClass().getResourceAsStream("res/myFile.p12"), "password".toCharArray());

KeyManagerFactory keyMgrFactory = KeyManagerFactory.getInstance("SunX509");
keyMgrFactory.init(keyStore, "password".toCharArray());

SSLContext sslContext = SSLContext.getInstance("TLS");
sslContext.init(keyMgrFactory.getKeyManagers(), null, null);
SSLSocketFactory sslSocketFactory = sslContext.getSocketFactory();

SSLSocket sslSocket = (SSLSocket) sslSocketFactory.createSocket(host, port);
String[] cipherSuites = sslSocket.getSupportedCipherSuites();
sslSocket.setEnabledCipherSuites(cipherSuites);
sslSocket.startHandshake();

char[] t = token.toCharArray();
byte[] b = Hex.decodeHex(t);

OutputStream outputstream = sslSocket.getOutputStream();

outputstream.write(0);
outputstream.write(0);
outputstream.write(32);
outputstream.write(b);
outputstream.write(0);
outputstream.write(payload.length());
outputstream.write(payload.getBytes());

outputstream.flush();
outputstream.close();

System.out.println("Message sent .... ");

NotificationTest.verifyKeystoreの場合 、この有効なファイルとキーストアが得られます。

このエラーが発生する理由がわかりません。

誰でも私を助けることができますか?

前もって感謝します ...

私のログで私はそれを見ました

** 証明書リクエスト

証明書の種類: RSA、DSS、ECDSA

認証機関:

[読み取り] MD5 および SHA1 ハッシュ: len = 10

0000: 0D 00 00 06 03 01 02 40 00 00 .......@..

** ServerHelloDone

[読み取り] MD5 および SHA1 ハッシュ: len = 4

0000: 0E 00 00 00 ....

** 証明書チェーン

**

** ClientKeyExchange、RSA PreMasterSecret、TLSv1

[書き込み] MD5 および SHA1 ハッシュ: len = 269

.

.

.

.

.

メイン、読み取り: TLSv1 アラート、長さ = 2

メイン、RECV TLSv1 ALERT: 致命的、handshake_failure

メイン、closeSocket() と呼ばれる

メイン、例外処理: javax.net.ssl.SSLHandshakeException: 致命的なアラートを受け取りました: handshake_failure

Cert Authorities:が空である理由がわかりません。

4

1 に答える 1

3

-Djavax.net.debug=ssl,handshake.ただし、スタック トレースと、クライアントまたはサーバーを実行しているときに生成される出力を確認せずに回答することはできません。

String[] cipherSuites = sslSocket.getSupportedCipherSuites(); sslSocket.setEnabledCipherSuites(cipherSuites);

そうしないでください。それは根本的に安全ではなく、実際の問題を隠しているだけです。これは、ほとんどの場合、証明書の信頼チェーンの問題です。クライアントがサーバーの証明書を信頼していないか、またはその逆です。

于 2012-06-15T12:02:26.850 に答える