2012-06-15 2 views
1

Я пытаюсь отправить уведомление толчок для iPhone с помощью Java-PNS, но я получаю следующее сообщение об ошибке - javax.net.ssl.SSLHandshakeException: Received со смертельным исходом предупреждение: handshake_failureНачало 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 Я получаю, что это действует в файле и Keystore.

Я не понимаю, почему я получаю эту ошибку.

Пожалуйста, кто-нибудь может мне помочь?

Спасибо заранее ...

В моем журнале я видел, что

** CertificateRequest

Cert Типы: RSA, DSS, ECDSA

Cert Власти:

[читать] Хеши MD5 и SHA1: len = 10

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

** ServerHelloDone

[читать] MD5 и SHA1 хеши: Len = 4

0000 : 0E 00 00 00 ....

** цепь Сертификат

**

** ClientKeyExchange, RSA PreMasterSecret, TLSv1

[написать] Хеши MD5 и SHA1: len = 269

.

.

.

.

.

главное, READ: TLSv1 предупреждение, длина = 2

главное, RECV TLSv1 ТРЕВОГА: со смертельным исходом, handshake_failure

главное, называется closeSocket()

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

Я не понимая, почему Cert власти: пуст?

+0

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

ответ

3

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

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

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

+0

благодарит EJP за ваш ответ. Я использую cipherSuites = sslSocket.get ... Пожалуйста, предложите мне, что использовать вместо этого. – Deepu

+1

@DeepakPawar, как правило, с использованием стандартных наборов шифров в порядке. Не устанавливайте ничего. Кроме того, вам не нужно явно вызывать 'startHandshake', это будет сделано, когда вы начнете чтение из выходного потока. – Bruno

+0

Спасибо Бруно, я постараюсь с этим – Deepu

Смежные вопросы