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

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

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

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

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

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

7 ответов


до Android KitKat вы должны root устройство для установки новых сертификатов.

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

извлечение из http://wiki.cacert.org/FAQ/ImportRootCert

перед Android версии 4.0, с Android версии пряники & 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 в разделе "Настройки" - > "Безопасность" - > "сертификаты" - > "Система", тогда как доверенные сертификаты пользователя находятся в разделе "пользователь". При использовании user trusted сертификаты, Android заставит пользователя Android устройства реализовать дополнительные меры безопасности: использование PIN-кода, шаблон блокировки или пароль для разблокировки устройства являются обязательными при использовании пользовательских сертификатов.

установка сертификатов CAcert как "доверенных пользователей" - сертификаты очень легко. Установка новых сертификатов как "system trusted" - сертификаты требуют больше работы (и требует корневого доступа), но у него есть преимущество избежать блокировки экрана Android требование.

от Android N и далее это становится немного сложнее, см. Этот экстракт из сайт Charles proxy:

начиная с Android N, вам нужно добавить конфигурацию в свое приложение, чтобы доверяйте SSL-сертификатам, созданным прокси-сервером Charles SSL. Это означает, что вы можете использовать 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>

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

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


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

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

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

в основном вам потребуется:

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

    АБР тянуть /системы/и т. д./Безопасность/cacerts в.cacerts в БКС.bks

  2. скачать .файл crt от центра сертификации, который вы хотите разрешить.

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

  4. загрузить cacerts.BKS файл обратно на телефон и перезагрузка.

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


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

Я скопировал /системы/и т. д./Безопасность/cacerts в.bks для моей sdcard

скачано 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.класс 1.сервер.ca.crt, im мой случай, у него уже был ca.crt, но, возможно, Вам тоже нужно установить его.

сохраненные в хранилище и скопировать его baxck в /системы/и т. д./Безопасность/cacerts в.БКС (я сделал резервную копию этого файла, сначала на всякий случай)

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


существует гораздо более простое решение для этого, чем опубликовано здесь или в связанных потоках. Если вы используете webview (как я), вы можете достичь этого, выполнив в нем функцию JAVASCRIPT. Если вы не используете WebView, вы можете создать скрытый для этой цели. Вот функция, которая работает практически в любом браузере (или webview) для начала установки ca (как правило, через общий репозиторий сертификатов ОС, в том числе на Droid). Он использует хороший трюк с iFrames. Просто передайте url-адрес a .файл 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 и выше, но более старые версии webview не будут работать так. Общая идея все еще работает - просто загрузите / откройте файл с помощью webview, а затем позвольте ОС взять верх. Это может быть более простое и универсальное решение (в реальной java сейчас):

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

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


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

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