Назад | Перейти на главную страницу

Ошибка сертификата SSL: certificate_unknown

Я хочу создать сервер push-уведомлений, и при установке сертификата SSL и файла .p12 на сервере мы сталкиваемся с ошибкой ниже: Я хочу знать, что не так с сертификатом ssl, потому что я получаю ошибку certificate_unknown.

main, RECV TLSv1 ALERT:  fatal, certificate_unknown
main, called closeSocket()
main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_unknown
Error pushing notification(s):
Invalid certificate chain (Received fatal alert: certificate_unknown)!  Verify that the keystore you provided was produced according to specs...
      at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:359)
      at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:301)
      at javapns.notification.PushNotificationManager.sendNotification(PushNotificationManager.java:258)
      at javapns.Push.payload(Push.java:122)
      at javapns.Push.alert(Push.java:36)
      at com.applicationname.pns.PushNotification.main(PushNotification.java:31)

//исходный код

    /**
     * 
     */
    package com.applicationname.pns;

    import org.json.JSONException;

    import javapns.Push;
    import javapns.devices.Device;
    import javapns.notification.Payload;
    import javapns.notification.PushNotificationManager;
    import javapns.notification.PushNotificationPayload;


    public class PushNotification
    {
        private static final String HOST = "gateway.sandbox.push.apple.com";
        private static final int PORT = 2195;
        private static final int BADGE = 66;
        private static String iPhoneId = "5696ee2fa44c61fd21a7987d2b1bcf57faa1603e63cb57ff204b158fb90d28a3";
        private static String certificate = "D:/./trunk/Development/JavaPNS/src/com/applicationname/pns/privateKey.p12";
        private static String passwd = "password@1234";

        /**
         * @param args
         */
        public static void main(String[] args)
        {
            Push.alert("Hello World!", certificate, passwd, false,iPhoneId);

            PushNotificationPayload payLoad = new PushNotificationPayload();

            try
            {
                payLoad.addAlert("Hello World!");
                payLoad.addBadge(10);
            }
            catch (JSONException e)
            {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }

        }


}

Необычно загружать закрытый ключ как запрос клиента к сокету SSL. Я лично считаю, что вам следует загрузить открытый ключ. Закрытый ключ загружается через сокет SSL на стороне сервера. Единственная причина, по которой вам может понадобиться закрытый ключ, - это действовать как сервер и принимать соединения с другого конца, но вы, похоже, этого не делаете.

Это могло бы объяснить сообщение «сертификат в неправильном формате».

В отношении:

private static String certificate = "D:/./trunk/Development/JavaPNS/src/com/applicationname/pns/privateKey.p12"

Я думаю, что ошибка довольно очевидна, ваша цепочка сертификатов на самом деле не проверяет ваш сертификат должным образом. Возможно, вам не хватает одного или нескольких сертификатов цепочки, необходимых для проверки вашего окончательного конечного сертификата?

Как бы то ни было, ошибка дает вам очень четкую инструкцию: «Убедитесь, что предоставленное вами хранилище ключей было создано в соответствии со спецификациями ...».

Никто на этом сайте не может ничего добавить, кроме как прочитать сообщение об ошибке и сделать это - ни у кого из нас нет хрустальных шаров, и мы не можем волшебным образом решить вашу проблему.

Я не вижу смысла публиковать вопрос, в котором вы не даете нам никакой дополнительной информации, кроме ОЧЕНЬ четкого сообщения об ошибке, в котором конкретно указывается, что делать. Все, что мы можем сказать, это «делайте то, что говорится в сообщении об ошибке!»

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

У меня есть сервер, который нужно защитить, но время от времени он также должен действовать как клиент для других серверов. Я, наконец, указал на проблему Расширенное использование ключа X509v3 отсутствует Проверка подлинности веб-клиента TLS расширение, когда мой сервер действует как клиент. Я не совсем уверен, что это плохая практика, но бывает так, что некоторая информация передается между защищенными серверами.

Всегда проверяйте расширения сертификатов, чтобы убедиться, что они соответствуют ожиданиям.

openssl x509 -in cert.pem -noout -text | less

Если вы думаете, что у вас тоже есть моя проблема, вам придется повторно выпустить новый сертификат с отсутствующим расширением.

Если вы являетесь вашим собственным центром сертификации, просто добавьте следующее в свою операцию подписи (или свой CSR, если копирование включено) в разделе расширения по вашему выбору (у меня req_both (который является частью моего файла cnf):

[req_both]
... other extensions
extendedKeyUsage = clientAuth, serverAuth
... more extensions

Если вы не являетесь центром сертификации, вам придется инициировать новый запрос на подпись сертификата (CSR) для вашего поставщика сертификатов и либо попросить их скопировать ваши расширения, либо сообщить им обо всех необходимых вам расширениях.