4

Java-pnsを使用してiPhoneにプッシュ通知を送信しようとしていますが、次のエラーが発生します...

javax.net.ssl.SSLHandshakeException: Received fatal alert: 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私はこれが有効であると取得していFileますKeystore

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

これは私のエラーログです...

** CertificateRequest
Cert Types: RSA, DSS, ECDSA
Cert Authorities:
<empty>
[read] MD5 and SHA1 hashes: len = 10
0000: 0D 00 00 06 03 01 02 40 00 00 .......@..
** ServerHelloDone
[read] MD5 and SHA1 hashes: len = 4
0000: 0E 00 00 00 ....
** Certificate chain
**
** ClientKeyExchange, RSA PreMasterSecret, TLSv1
[write] MD5 and SHA1 hashes: len = 269
...
main, READ: TLSv1 Alert, length = 2
main, RECV TLSv1 ALERT: fatal, handshake_failure
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

認証局が空である理由がわかりませんか?

4

3 に答える 3

5

keytool -listを使用して、クライアント上のキーストアをサーバーに認識されているキーストアと比較することをお勧めします。発生しているハンドシェイクエラーは、サーバーがhelloを実行し、応答でクライアント証明書を期待しているためです。送信していません。これを修正するには、PKCS12証明書をPEM形式に変換し(opensslを使用するのは一方向です)、keytoolを使用してキーストアにインポートする必要があります。

クライアント証明書をキーストアにインポートしてこれを修正すると、2番目のエラーが発生する可能性があります。2番目のエラーは、空のCA証明書に関するものです。おそらく、キーストア内のサーバーに認識されているCA証明書がないためです。CAをインポートして、再試行してください。

于 2012-08-07T20:43:07.307 に答える
0

「JavaCryptographyExtension(JCE)Unlimited StrengthJurisdictionPolicyFiles」をインストールする必要があるようです。これで問題は解決しました。

于 2014-12-11T13:38:14.243 に答える
-4

iPhone / iPadにプッシュ通知を送信するには、JavaPNSを使用しました。

それは非常に使いやすく、それは私のために働いた。

これをたどって使用するだけです。

于 2013-12-31T05:35:59.933 に答える