Вопрос по apple-push-notifications, ssl, java – Получение javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: handshake_failure Ошибка

1

Я пытаюсь отправить push-уведомление на iPhone с помощью Java-pns, но получаю следующую ошибку: 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

Типы сертификатов: 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

main, называется closeSocket ()

main, обработка исключения: javax.net.ssl.SSLHandshakeException: получено фатальное предупреждение: handshake_failure

Я не понимаю почемуCert Authorities: пустой?

Можете ли вы опубликовать полную трассировку стека? atk

Ваш Ответ

1   ответ
3

не увидев трассировку стека и, возможно, вывод, полученный при запуске клиента или сервера с-Djavax.net.debug=ssl,handshake. Тем не мение:

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

Не делай этого. Это радикально небезопасно и просто скрывает реальную проблему, которая почти всегда является проблемой цепочки доверия сертификатов: либо клиент не доверяет сертификату сервера, либо наоборот.

спасибо EJP за ваш ответ. Я использую cipherSuites = sslSocket.get ... Пожалуйста, предложите мне, что использовать вместо. Deepu
Спасибо бруно, попробую с этим Deepu
@DeepakPawar, как правило, хорошо подходит для использования комплектов шифров по умолчанию. Ничего не устанавливайте. Кроме того, вам не нужно звонитьstartHandshake явно, это будет сделано, когда вы начнете читать из выходного потока.

Похожие вопросы