Как установить сертификат trusted 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 в качестве доверенного сертификата? Есть ли способ сделать это программно?

2187   7  

7 ответов:

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

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

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

начиная с Android N и далее он становится немного сложнее, см. Этот отрывок из Чарльз прокси-сайт:

начиная с 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>

Я потратил много времени, пытаясь найти ответ на этот вопрос (мне нужен 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 с вашего телефон.

    adb pull / system/etc/security / cacerts.bks cacerts.БКС

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

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

  4. загрузить cacerts.файл bks возвращается на ваш телефон и перезагружается.

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

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

Я скопировал /system/etc/security / cacerts.БКС на мою почту

скачано http://www.startssl.com/certs/ca.crt и http://www.startssl.com/certs/sub.class1.server.ca.crt

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

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

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

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

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

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

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

Comments

    Ничего не найдено.