Не удается отправить push-уведомления с помощью сбоя рукопожатия SSL Javapns/Javaapns
У меня проблема с push-уведомлениями. У меня есть сертификат p.12, который был создан членом команды, и у меня есть токен устройства, на которое нужно отправить устройство. Я использую библиотеку javapns для выполнения push (также пробовал библиотеку javaapns с теми же результатами), но продолжаю получать эту ошибку:
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, но импорт также не удался. Я разрабатываю с использованием Eclipse на Windows-машине.
Кто-нибудь знаком с этой проблемой? Я новичок в использовании ssl, так что, возможно, я делаю что-то не так, или я не могу использовать сертификат, созданный на другом компьютере?
2 ответа
Я - новый разработчик iOS, и у меня была та же самая проблема прежде.
Я наконец обнаружил, что проблема была из-за p12 certificate
, Мы не должны использовать файл p12 личного ключа, вместо этого мы должны сгенерировать p12 из вашего личного ключа и загрузить сертификат из Apple.
Пожалуйста, выполните следующую команду OpenSSL, чтобы получить правильный файл p12:
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
общаться с яблочным сервером.
Ответ Санни отличный, но, к сожалению, он мне не помог.
Я получил его, экспортировав пару сертификат / закрытый ключ из цепочки для ключей. Хитрость в том, что последовательность выбора имеет значение! Сначала необходимо выбрать сертификат, а затем закрытый ключ.
Вот как это работает:
- Импортируйте сертификат, загруженный из Apple, в цепочки для ключей
- Разверните так, чтобы закрытый ключ был виден
- Выберите сертификат, а затем закрытый ключ
- Щелкните правой кнопкой мыши и выберите [Экспортировать 2 элемента...]