it-roy-ru.com

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

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

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

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

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

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

117
Björn Marschollek

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

От Android KitKat (4.0) до Нуга (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/"Сэндвич с мороженым", 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 и далее становится все труднее, см. Этот отрывок из веб-сайт Чарльз-прокси :

Начиная с 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>
93
Dean Wild

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

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

43
Mark Berry

Если вам нужен ваш сертификат для соединений 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);
        }
    }
}
15
Alexander Egger

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

9
RightHandedMonkey

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

Обновление:

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

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

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

4
BuvinJ

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

Я скопировал /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, но, возможно, вам нужно установить его тоже.

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

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

3
hans

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

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

0
emmby