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

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

113 голосов | спросил Björn Marschollek 16 ThuEurope/Moscow2010-12-16T16:44:36+03:00Europe/Moscow12bEurope/MoscowThu, 16 Dec 2010 16:44:36 +0300 2010, 16:44:36

7 ответов


0

До появления 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 , он становится немного сложнее, посмотрите этот отрывок из веб-сайт Чарльза-прокси :

  

Начиная с 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>
ответил Dean Wild 26 FebruaryEurope/MoscowbWed, 26 Feb 2014 16:08:15 +0400000000pmWed, 26 Feb 2014 16:08:15 +040014 2014, 16:08:15
0

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

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

ответил Mark Berry 22 WedEurope/Moscow2010-12-22T05:42:23+03:00Europe/Moscow12bEurope/MoscowWed, 22 Dec 2010 05:42:23 +0300 2010, 05:42:23
0

Если вам нужен сертификат для подключений 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);
        }
    }
}
ответил alexander.egger 20 MonEurope/Moscow2010-12-20T17:30:27+03:00Europe/Moscow12bEurope/MoscowMon, 20 Dec 2010 17:30:27 +0300 2010, 17:30:27
0

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

ответил RightHandedMonkey 5 MaramTue, 05 Mar 2013 01:31:26 +04002013-03-05T01:31:26+04:0001 2013, 01:31:26
0

То, что я сделал, чтобы иметь возможность использовать сертификаты 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 (ничего не вводил при запросе пароля)

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

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

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

ответил hans 18 AMpWed, 18 Apr 2012 10:56:48 +040056Wednesday 2012, 10:56:48
0

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

ответил BuvinJ 25 J000000Friday14 2014, 00:12:34
0

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

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

ответил emmby 17 J0000006Europe/Moscow 2011, 01:34:25

Похожие вопросы

Популярные теги

security × 330linux × 316macos × 2827 × 268performance × 244command-line × 241sql-server × 235joomla-3.x × 222java × 189c++ × 186windows × 180cisco × 168bash × 158c# × 142gmail × 139arduino-uno × 139javascript × 134ssh × 133seo × 132mysql × 132