Как установить доверенный сертификат CA на устройстве Android? - PullRequest
118 голосов
/ 16 декабря 2010

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

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

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

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

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

Ответы [ 7 ]

93 голосов
/ 26 февраля 2014

До 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 («системы»). по умолчанию на 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 Proxying только с приложениями, которые вы управление.

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

Добавьте файл 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>
43 голосов
/ 22 декабря 2010

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

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

15 голосов
/ 20 декабря 2010

Если вам нужен сертификат для подключений 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);
        }
    }
}
9 голосов
/ 05 марта 2013

Руководство по ссылке здесь , вероятно, ответит на оригинальный вопрос без необходимости программирования пользовательского соединителя 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 на устройстве pre-android-4.0

4 голосов
/ 25 июля 2014

Существует гораздо более простое решение, чем опубликовано здесь или в связанных темах. Если вы используете веб-просмотр (как и я), вы можете достичь этого, выполнив в нем функцию JAVASCRIPT. Если вы не используете веб-просмотр, вы можете создать скрытый для этой цели. Вот функция, которая работает практически в любом браузере (или веб-браузере) для запуска установки (обычно через общий репозиторий os cert, в том числе на 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;
}

UPDATE:

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

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

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

3 голосов
/ 18 апреля 2012

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

Я скопировал /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 из моей sdcard (ничего не вводил при запросе пароля)

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

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

Перезагрузил свой телефон и теперь могуВист мой сайт, который использует сертификат StartSL без ошибок.

0 голосов
/ 17 июня 2011

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

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

...