Как установить доверенный сертификат ЦС на Android-устройство?

Я создал свой собственный сертификат CA и теперь хочу установить его на свое устройство Android Froyo (HTC Desire Z), чтобы оно доверяло моему сертификату.

Android хранит сертификаты ЦС в своем хранилище ключей Java в /system/etc/security/cacerts.bks. Я скопировал файл на свой компьютер, добавил свой сертификат с помощью portecle 1.5 и отправил его обратно на устройство.

Теперь Android, похоже, не перезагружает файл автоматически. Я прочитал в нескольких сообщениях в блоге, что мне нужно перезагрузить устройство. Это приведет к тому, что файл снова будет перезаписан исходным.

Следующей моей попыткой было установить сертификат с SD-карты, скопировав его и используя соответствующую опцию в меню настроек. Устройство сообщает мне, что сертификат установлен, но, видимо, не доверяет сертификату. Более того, когда я пытаюсь скопировать хранилище ключей на свой компьютер, я все равно нахожу исходное хранилище cacerts.bks.

Итак, как правильно установить мой собственный сертификат корневого ЦС на устройстве Android 2.2 в качестве доверенного сертификата? Есть ли способ сделать это программно?


person Björn Marschollek    schedule 16.12.2010    source источник
comment
Вы можете предположить здесь рутированный телефон. :)   -  person Björn Marschollek    schedule 22.12.2010


Ответы (10)


До Android KitKat вам необходимо выполнить рутирование устройства, чтобы установить новые сертификаты.

С Android KitKat (4.0) до Nougat (7.0) это возможно и просто. Мне удалось установить сертификат Charles Web Debbuging Proxy на мое некорневое устройство и успешно прослушивать SSL-трафик.

Выдержка из http://wiki.cacert.org/FAQ/ImportRootCert

До версии Android 4.0 с версией Android Gingerbread & Froyo существовал единственный файл, доступный только для чтения (/system/etc/security/cacerts.bks), содержащий хранилище доверенных сертификатов со всеми сертификатами CA ('system'), которым по умолчанию доверяют. Android. Его используют как системные приложения, так и все приложения, разработанные с помощью Android SDK. Используйте эти инструкции по установке сертификатов CAcert на Android Gingerbread, Froyo, ...

Начиная с Android 4.0 (Android ICS / 'Ice Cream Sandwich', Android 4.3 'Jelly Bean' и Android 4.4 'KitKat'), системные доверенные сертификаты находятся в системном разделе (только для чтения) в папке '/ system / etc / security / 'как отдельные файлы. Однако теперь пользователи могут легко добавлять свои собственные «пользовательские» сертификаты, которые будут храниться в «/ data / misc / keychain / certs-added».

Системными сертификатами можно управлять на устройстве Android в разделе «Настройки» -> «Безопасность» -> «Сертификаты» -> «Система», а доверенные сертификаты пользователя - в разделе «Пользователь». При использовании доверенных сертификатов пользователя Android вынуждает пользователя устройства Android применять дополнительные меры безопасности: использование PIN-кода, блокировки с использованием графического ключа или пароля для разблокировки устройства является обязательным при использовании сертификатов, предоставленных пользователем.

Установить сертификаты CAcert как «доверенные» сертификаты пользователя очень просто. Установка новых сертификатов в качестве «доверенных системным» сертификатов требует больше работы (и требует корневого доступа), но это дает то преимущество, что позволяет избежать требования блокировки экрана Android.

Начиная с Android N становится немного сложнее, см. этот отрывок из Прокси-сайт Charles:

Начиная с Android N, вам необходимо добавить конфигурацию в свое приложение, чтобы оно доверяло сертификатам SSL, созданным Charles SSL Proxying. Это означает, что вы можете использовать SSL-прокси только с приложениями, которые вы контролируете.

Чтобы настроить приложение на доверие Чарльзу, вам необходимо добавить в приложение файл конфигурации сетевой безопасности. Этот файл может переопределить системное значение по умолчанию, позволяя вашему приложению доверять установленным пользователем сертификатам CA (например, корневому сертификату Charles). Вы можете указать, что это применяется только в отладочных сборках вашего приложения, чтобы производственные сборки использовали профиль доверия по умолчанию.

Добавьте в приложение файл res / xml / network_security_config.xml:

<network-security-config>    
    <debug-overrides> 
        <trust-anchors> 
            <!-- Trust user added CAs while debuggable only -->
            <certificates src="user" /> 
        </trust-anchors>    
    </debug-overrides>  
</network-security-config>

Затем добавьте ссылку на этот файл в манифест приложения следующим образом:

<?xml version="1.0" encoding="utf-8"?> 
<manifest>
    <application android:networkSecurityConfig="@xml/network_security_config">
    </application> 
</manifest>
person Dean Wild    schedule 26.02.2014
comment
Мои пользовательские файлы сертификатов (/system/etc/security/cacerts/*.0) не сохраняются после перезагрузки / перезапуска AVD, поэтому это решение не удалось. - person fikr4n; 27.02.2016
comment
@BornToCode интересно - я редко использую AVD, поэтому я не знал об этом ограничении - person Dean Wild; 20.04.2016
comment
Я вижу параметр debug-overrides, означает ли это, что этот network_security_config нацелен только на вариант отладки? Если у меня есть другой вариант, такой как вариант UAT, тогда это не сработает? - person Isaac; 28.05.2019
comment
@Isaac это означает, что он будет применяться к любым вариантам, где debuggable = true - person Dean Wild; 28.05.2019
comment
@DeanWild - большое вам спасибо! Я пытался заставить это работать вечно и продолжал получать недействительный сертификат ssl при отладке моего приложения. Это решение отлично подействовало на мое приложение для Android, работающее на Android 9 на Samsung Note 8. - person Dave Black; 06.09.2019
comment
В Android 11 подраздел панели «Безопасность» называется «Шифрование и учетные данные» вместо «Сертификаты». - person ThomasW; 25.08.2020
comment
Недостатком, добавленным в Android 4.4, является сообщение Network May Be Monitored by an Unknown Third Party, когда список доверенных сертификатов пользователя не пуст. Даже настоящий корневой сертификат CA или сертификат, которому вы доверяете, будет выдавать вам это сообщение в тени при каждой перезагрузке. - person Skip R; 26.08.2020

Я потратил много времени, пытаясь найти ответ на этот вопрос (мне нужен Android, чтобы увидеть сертификаты StartSSL). Вывод: Android 2.1 и 2.2 позволяют импортировать сертификаты, но только для использования с WiFi и VPN. Пользовательского интерфейса для обновления списка доверенных корневых сертификатов нет, но обсуждается возможность добавления этой функции. Неясно, существует ли надежный обходной путь для ручного обновления и замены файла cacerts.bks.

Подробности и ссылки: http://www.mcbsys.com/techblog/2010/12/android-certificates/. В этом посте см. Ссылку на ошибку Android 11231 - возможно, вы захотите добавить свой голос и запрос к этой ошибке.

person Mark Berry    schedule 22.12.2010
comment
Разработчик Android ответил на мой запрос re. обновление cacerts.bks: во всех выпусках, начиная с 2.3, требуется OTA для обновления cacerts.bks на телефоне без рутирования. code.google.com/p/android/issues/detail? id = 11231 # c25. OTA = по воздуху, верно? Может быть, поэтому ваш телефон продолжает возвращаться к заводскому cacerts.bks? Однако, если у вас ДЕЙСТВИТЕЛЬНО есть root-доступ, похоже, вы сможете загрузить исходный код, добавить сертификат, а затем создать cacerts.bks с помощью скрипта certimport.sh. android.git .kernel.org /? p = платформа / libcore.git; a = tree; f = luni /. - person Mark Berry; 22.12.2010
comment
Спасибо. Очевидно, это был не тот ответ, который я хотел услышать, но, похоже, он правильный. Я надеялся, что есть способ установить сертификат без обновления всей системы. Я, конечно, могу создать новый cacerts.bks, с root-доступом я могу даже заменить старый, но он возвращается к исходной версии при каждой перезагрузке. Без перезагрузки Android вроде бы отказывается перезагружать файл доверенных сертификатов. - person Björn Marschollek; 22.12.2010
comment
Как насчет установки сертификатов CA на платформах 3.X и 4.X? - person Alok Kulkarni; 02.04.2012
comment
4.X и далее: stackoverflow.com/questions/4461360/ - person Dean Wild; 25.11.2015

Если вам нужен сертификат для соединений HTTPS, вы можете добавить файл .bks в качестве необработанного ресурса в свое приложение и расширить DefaultHttpConnection, чтобы ваши сертификаты использовались для соединений HTTPS.

public class MyHttpClient extends DefaultHttpClient {

    private Resources _resources;

    public MyHttpClient(Resources resources) {
        _resources = resources;
    }

    @Override
    protected ClientConnectionManager createClientConnectionManager() {
        SchemeRegistry registry = new SchemeRegistry();
        registry.register(new Scheme("http", PlainSocketFactory
            .getSocketFactory(), 80));
        if (_resources != null) {
            registry.register(new Scheme("https", newSslSocketFactory(), 443));
        } else {
            registry.register(new Scheme("https", SSLSocketFactory
                .getSocketFactory(), 443));
        }
        return new SingleClientConnManager(getParams(), registry);
    }

    private SSLSocketFactory newSslSocketFactory() {
        try {
            KeyStore trusted = KeyStore.getInstance("BKS");
            InputStream in = _resources.openRawResource(R.raw.mystore);
            try {
                trusted.load(in, "pwd".toCharArray());
            } finally {
                in.close();
            }
            return new SSLSocketFactory(trusted);
        } catch (Exception e) {
            throw new AssertionError(e);
        }
    }
}
person Alexander Egger    schedule 20.12.2010
comment
Спасибо за ваш ответ. На самом деле мне нужно установить сертификат таким образом, чтобы каждое приложение на устройстве доверяло сертификату. Та же проблема должна существовать и для некоторых небольших центров сертификации, таких как CAcert, сертификаты которых по умолчанию не являются доверенными. Как они устанавливают свои сертификаты? - person Björn Marschollek; 20.12.2010
comment
Вы пробовали: Настройки - ›Безопасность -› Установить с SD-карты - person Alexander Egger; 20.12.2010
comment
Также это может быть интересно: android.git.kernel.org/?p=platform/packages/apps/ - person Alexander Egger; 20.12.2010
comment
У меня та же проблема, мне нужно загрузить сертификат .PDX X509 с помощью приложения Adroid 2.3.3, а затем создать SSL-соединение. Может ли кто-нибудь помочь мне с закомментированным кодом? - person AndroidLearner; 17.07.2012

Руководство, связанное здесь, вероятно, ответит на исходный вопрос без необходимости для программирования настраиваемого коннектора SSL.

Нашел очень подробное руководство по импорту корневых сертификатов, которое фактически поможет вам установить доверенные сертификаты CA на разные версии устройств Android (среди других устройств).

В основном вам необходимо:

  1. Загрузите: файл cacerts.bks со своего телефона.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Загрузите файл .crt из удостоверяющего центра, который вы хотите разрешить.

  3. Измените файл cacerts.bks на своем компьютере с помощью BouncyCastle Provider.

  4. Загрузите файл cacerts.bks обратно на свой телефон и перезагрузитесь.

Вот более подробные пошаговые инструкции по обновлению более ранних версий телефонов Android: Как обновить хранилище ключей центра сертификации безопасности HTTPS на устройстве до Android 4.0

person RightHandedMonkey    schedule 04.03.2013

Для этого есть НАМНОГО более простое решение, чем опубликованное здесь или в связанных темах. Если вы используете веб-просмотр (как и я), вы можете добиться этого, выполнив в нем функцию JAVASCRIPT. Если вы не используете веб-просмотр, вы можете создать для этой цели скрытый. Вот функция, которая работает практически в любом браузере (или веб-просмотре) для запуска установки CA (обычно через общий репозиторий сертификатов os, в том числе на Droid). Он использует хороший трюк с iFrames. Просто передайте этой функции URL-адрес файла .crt:

function installTrustedRootCert( rootCertUrl ){
    id = "rootCertInstaller";
    iframe = document.getElementById( id );
    if( iframe != null ) document.body.removeChild( iframe );
    iframe = document.createElement( "iframe" );
    iframe.id = id;
    iframe.style.display = "none";
    document.body.appendChild( iframe );
    iframe.src = rootCertUrl;
}

ОБНОВИТЬ:

Трюк с iframe работает на дроидах с API 19 и выше, но более старые версии веб-просмотра не будут работать так. Однако общая идея по-прежнему работает - просто загрузите / откройте файл с помощью веб-просмотра, а затем позвольте операционной системе взять на себя управление. Это может быть более простое и универсальное решение (сейчас в реальной java):

 public static void installTrustedRootCert( final String certAddress ){
     WebView certWebView = new WebView( instance_ );
     certWebView.loadUrl( certAddress );
 }

Обратите внимание, что instance_ - это ссылка на Activity. Это отлично работает, если вы знаете URL-адрес сертификата. В моем случае, однако, я решаю это динамически с помощью программного обеспечения на стороне сервера. Мне пришлось добавить изрядное количество дополнительного кода, чтобы перехватить URL-адрес перенаправления и вызвать его таким образом, чтобы не вызвать сбоя из-за сложности потоковой передачи, но я не буду добавлять сюда всю эту путаницу ...

person BuvinJ    schedule 24.07.2014

Что я сделал, чтобы использовать сертификаты startssl, было довольно просто. (на моем рутированном телефоне)

Я скопировал /system/etc/security/cacerts.bks на свою SD-карту

Загружено http://www.startssl.com/certs/ca.crt и http://www.startssl.com/certs/sub.class1.server.ca.crt

Зашел на portecle.sourceforge.net и запустил portecle прямо с веб-страницы.

Открыл мой файл cacerts.bks с моей SD-карты (ничего не ввел при запросе пароля)

Выберите импорт в портакле и откройте sub.class1.server.ca.crt, в моем случае он уже имел ca.crt, но, возможно, вам также нужно установить его.

Сохранил хранилище ключей и скопировал его baxck в /system/etc/security/cacerts.bks (на всякий случай я сделал резервную копию этого файла)

Перезагрузил телефон, и теперь я могу без ошибок заходить на свой сайт, используя сертификат startssl.

person hans    schedule 18.04.2012
comment
Новое в Mozilla: Недоверие к новому WoSign и сертификаты StartCom. - person jww; 29.10.2016
comment
есть идеи, как вернуть cacert.bks на устройство без рутирования? - person Bob; 22.02.2017

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

https://github.com/Magisk-Modules-Repo/movecert

person Nightcap79    schedule 23.02.2020
comment
Не могли бы вы объяснить немного подробнее, как это сделать? На самом сайте нет объяснений по установке и использованию. Спасибо! Кстати, модуль Magisk теперь находится по адресу github.com/Magisk-Modules-Repo/movecert - person xpt; 09.04.2021
comment
У вас должно быть рутированное устройство и установлен Magisk, затем откройте Magisk, нажмите на значок модуля, который является первым значком справа в нижних значках навигации, затем выполните поиск сертификата перемещения, нажмите на установку ›› перезагрузка - person Nightcap79; 17.04.2021

Эти шаги сработали для меня:

  1. Установите приложение Dory Certificate для Android на свое мобильное устройство: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. Подключите мобильное устройство к ноутбуку с помощью USB-кабеля.
  3. Создайте корневую папку во внутренней памяти телефона, скопируйте файл сертификата в эту папку и отсоедините кабель.
  4. Откройте приложение Dory Certificate для Android, нажмите круглую кнопку [+] и выберите правильный вариант «Импортировать сертификат файла».
  5. Выберите формат, укажите имя (я ввел то же, что и имя файла), просмотрите файл сертификата и нажмите [OK].
  6. Появятся три карты. Я проигнорировал карту, на которой была только кнопка [ПОДПИСАТЬ CSR], и щелкнул кнопку [УСТАНОВИТЬ] на двух других картах.
  7. Я обновил веб-приложение PWA, которое я не открывал в своем мобильном Chrome (он размещен на локальном веб-сервере IIS) и вуаля! Нет предупреждающего сообщения о Chrome. Зеленый замок был там. Это было сработало.

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

Наконец, это может быть неактуальным, но, если вы хотите создать и настроить самозаверяющий сертификат (с помощью mkcert) для своего приложения (веб-сайта) PWA, размещенного на локальном веб-сервере IIS, я следил за этой страницей:

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

Спасибо и надеюсь, что это поможет !! :)

person Manuel Hernandez    schedule 13.09.2019

Вот альтернативное решение, которое фактически добавляет ваш сертификат во встроенный список сертификатов по умолчанию: Доверять всем сертификатам с использованием HttpClient через HTTPS

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

person emmby    schedule 16.06.2011

Вы пробовали: Настройки - ›Безопасность -› Установить с SD-карты? - Александр Эггер 20 дек.

Я не уверен, почему это еще не ответ, но я просто последовал этому совету, и он сработал.

person ZzZombo    schedule 19.01.2021