Подтвердить что ты не робот

Не удается отправить push-уведомления с помощью Javapns/Javaapns.

У меня проблема с push-уведомлениями. У меня есть сертификат p.12, который был создан членом команды, и у меня есть токен устройства для того, чтобы устройство было нажато. Я использую библиотеку javapns для выполнения push (также пытался использовать javaapns lib с одинаковыми результатами), но я продолжаю получать эту ошибку:

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, поэтому, возможно, я что-то делаю неправильно или не могу использовать сертификат, сгенерированный на другой машине?

4b9b3361

Ответ 1

Я новый разработчик iOS, и раньше у меня была такая же проблема.

Наконец-то я обнаружил, что проблема связана с p12 certificate. Мы не должны использовать файл приватного ключа p12, вместо этого мы должны сгенерировать p12 из вашего закрытого ключа и загрузить cert из Apple.

Для получения правильного файла p12 выполните следующую команду OpenSSL:

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

Солнечный ответ - отличный, но, к сожалению, это не сработало для меня.

Я получил его, экспортируя пару сертификата/частного ключа из брелка. Фокус в том, что последовательность выбора имеет значение! Сначала необходимо выбрать сертификат, за которым следует закрытый ключ.

Вот как это работает:

  • Импортировать сертификат, загруженный с Apple, в цепочку ключей
  • Разверните так, чтобы был открыт закрытый ключ
  • Выберите сертификат, за которым следует закрытый ключ
  • Щелкните правой кнопкой мыши и выберите [Экспортировать 2 элемента...]