Arhn - архитектура программирования

Ошибка сертификата ssl Android после обновления сертификата на сервере с помощью digicert

Я использовал ключ сертификата ssl, предоставленный серверной командой в приложении для Android в необработанной папке. Первоначально он работал нормально.

     CertificateFactory cf = CertificateFactory.getInstance("X.509");

        InputStream caInputMmx = new BufferedInputStream(this.getAssets().open("123.crt"));
        Certificate caMmx = cf.generateCertificate(caInputMmx);
        String keyStoreType = KeyStore.getDefaultType();
        KeyStore keyStore = KeyStore.getInstance(keyStoreType);
        keyStore.load(null, null);
        keyStore.setCertificateEntry("caMmx", caMmx);
        String tmfAlgorithm = TrustManagerFactory.getDefaultAlgorithm();
        TrustManagerFactory tmf = TrustManagerFactory.getInstance(tmfAlgorithm);
        tmf.init(keyStore);
        SSLContext context = SSLContext.getInstance("TLS");
        context.init(null, tmf.getTrustManagers(), null);
        client.setSslSocketFactory(context.getSocketFactory());

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

com.android.volley.NoConnectionError: javax.net.ssl.SSLHandshakeException: java.security.cert.CertPathValidatorException: якорь доверия для пути сертификации не найден.

При использовании нового обновленного сертификата с сервера наше приложение работает нормально. Есть ли какое-либо обходное решение, чтобы исправить это с сервера, а не обновлять новый сертификат в приложении каждый раз? Потому что, если пользователь не обновит приложение, наше приложение работать не будет. Итак, есть ли способ решить эту проблему вместо обновления сертификата в приложении каждый раз, если срок действия сертификата истек.

Отредактировано:

После комментариев предоставим некоторую дополнительную информацию.

Хранилище ключей: я использую хранилище ключей по умолчанию. КА: Я использую digicert CA, этим парням доверяют.


Ответы:


1

Такая проблема часто возникает из-за отсутствия сертификата цепочки. Сравните свой сайт с SSLLabs и найдите отчеты о неполной цепочке. Обратите внимание, что настольный браузер, такой как Chrome, может по-прежнему работать, потому что он кэширует сертификаты цепочки от более ранних подключений, а иногда даже активно пытается получить недостающие сертификаты цепочки из Интернета.

13.10.2016
  • @ pradeep.k: ваш код не показывает валидацию, а только загрузку сертификата. Из показанного кода не ясно, что вы используете закрепление. Даже с дополнительной информацией неясно, используете ли вы закрепление в дополнение к обычной проверке или исключительно. Также неясно, выполняете ли вы закрепление сертификата или закрепления открытого ключа и использует ли обновленный сертификат тот же открытый ключ. Кроме того, если вы выполняете исключительно закрепление, вам вообще не нужно будет заменять сертификат по истечении срока его действия. 13.10.2016
  • @ pradeep.k: если проблема действительно вызвана закреплением внутри вашего приложения, то обновление приложения - единственный выбор. 13.10.2016
  • Вы упомянули что-то вроде того, если в обновленном сертификате используется тот же открытый ключ? Я не уверен, что используется такой же открытый ключ ... Любая идея, если этот обновленный сертификат использует тот же открытый ключ, решит эту проблему? Хотя обновление приложения - единственный выбор, мы ищем какое-то быстрое обходное решение, чтобы оно заблокировало пользователей, поскольку в настоящее время приложение используют сотни тысяч пользователей. 13.10.2016
  • @ pradeep.k: как решить проблему сейчас и в будущем зависит от того, как именно вы делаете пиннинг. См. Мой комментарий, где я указал всю недостающую информацию и предоставил недостающие детали, желательно отредактировав свой вопрос, а не размещая его в комментарии. 13.10.2016
  • Я обновил код, в котором мы выполняем закрепление. По коду, я думаю, мы проводим обычную проверку. Пожалуйста, поправьте меня, если ошибаюсь. Чтобы избежать этого, в будущем мы будем следовать каким-то решениям. Мы ищем быстрое решение, чтобы пользователи не чувствовали дискомфорта при использовании приложения. Если мы не предоставим быстрое решение, мы можем потерять сотни тысяч пользователей в одночасье. 13.10.2016
  • Кроме того, любая идея, например, если я могу выполнить некоторые настройки на сервере, чтобы обойти эту безопасность, чтобы приложение работало нормально. 13.10.2016
  • @ pradeep.k: это не похоже на закрепление сертификата, но похоже, что вы просто добавляете свой собственный CA в хранилище ключей. Если это все, то вы просто принимаете сертификаты, выпущенные этим ЦС. Я думаю, вам нужно предоставить дополнительную информацию, т.е. как новый сертификат соотносится с центром сертификации, которому вы доверяете в своем приложении. Также может быть, что вы добавляете в хранилище именно самозаверяющие сертификаты, которым доверяете, но этого нельзя увидеть только по коду, поскольку содержимое добавленных и используемых сертификатов неизвестно. 13.10.2016
  • @ pradeep.k: и нет, вы не можете обойти безопасность, настроив что-то на сервере. Вы можете только убедиться, что сервер предоставляет доверенные сертификаты, то есть сертификаты, выданные ЦС в вашем хранилище доверенных сертификатов. 13.10.2016
  • Большое спасибо за вашу быструю помощь.Мы используем ключ, предоставленный центром сертификации, и новый продленный ключ также из того же центра сертификации. Когда я попробовал openssl s_client -debug -connect ‹server›, я получил сообщение ниже Подтвердите код возврата: 19 (self подписанный сертификат в цепочке сертификатов). Означает ли это, что сервер самоподписывается, а не подписывается с использованием обновленного сертификата, предоставленного CA ?? Пожалуйста, исправьте, если ошибаюсь. . 13.10.2016
  • @ pradeep.k: CA не предоставляют ключи, они подписывают сертификаты. Если выдающий ЦС настроен как доверенный в вашем хранилище ключей (опять же: это неизвестно), он должен работать без изменений в приложении, если сертификат правильно настроен на сервере. Также неизвестно, так ли это. И снова, пожалуйста, добавьте любые детали, необходимые для ответа на вопрос, а не в комментарии. В идеале может потребоваться информация о сертификатах, которые вы загружаете как доверенные, о конечных сертификатах и ​​любых сертификатах цепочки, отправленных сервером, и их отношении к доверенному ЦС. 13.10.2016
  • спасибо за руководство :) Согласно коду, если вы видите, что сертификат, предоставленный для CA, является доверенным для нашего хранилища ключей по умолчанию с использованием TrustManagerFactory. Итак, как и для старого сертификата, мы добавили доверие, но после обновления новый сертификат используется на сервере, предоставленном тем же центром сертификации. 13.10.2016
  • @ pradeep.k: если ЦС, который вы используете, заслуживает доверия, как вы говорите, то настройка сервера испорчена. Например, может отсутствовать сертификат цепочки, как я предлагал в своем первоначальном ответе. Поскольку вы используете общедоступный ЦС, проверьте SSLLabs (см. Исходный ответ). 13.10.2016
  • Новые материалы

    Коллекции публикаций по глубокому обучению
    Последние пару месяцев я создавал коллекции последних академических публикаций по различным подполям глубокого обучения в моем блоге https://amundtveit.com - эта публикация дает обзор 25..

    Представляем: Pepita
    Фреймворк JavaScript с открытым исходным кодом Я знаю, что недостатка в фреймворках JavaScript нет. Но я просто не мог остановиться. Я хотел написать что-то сам, со своими собственными..

    Советы по коду Laravel #2
    1-) Найти // You can specify the columns you need // in when you use the find method on a model User::find(‘id’, [‘email’,’name’]); // You can increment or decrement // a field in..

    Работа с временными рядами спутниковых изображений, часть 3 (аналитика данных)
    Анализ временных рядов спутниковых изображений для данных наблюдений за большой Землей (arXiv) Автор: Рольф Симоэс , Жильберто Камара , Жильберто Кейрос , Фелипе Соуза , Педро Р. Андраде ,..

    3 способа решить квадратное уравнение (3-й мой любимый) -
    1. Методом факторизации — 2. Используя квадратичную формулу — 3. Заполнив квадрат — Давайте поймем это, решив это простое уравнение: Мы пытаемся сделать LHS,..

    Создание VR-миров с A-Frame
    Виртуальная реальность (и дополненная реальность) стали главными модными терминами в образовательных технологиях. С недорогими VR-гарнитурами, такими как Google Cardboard , и использованием..

    Демистификация рекурсии
    КОДЕКС Демистификация рекурсии Упрощенная концепция ошеломляющей О чем весь этот шум? Рекурсия, кажется, единственная тема, от которой у каждого начинающего студента-информатика..