2010-12-16 4 views
95

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

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

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

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

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

+0

Вы может принять корневой телефон здесь. :) – 2010-12-22 14:35:51

+0

Stack Overflow - это сайт для вопросов программирования и разработки. Этот вопрос кажется вне темы, потому что речь идет не о программировании или разработке. См. [Какие темы можно задать здесь] (http://stackoverflow.com/help/on-topic) в Справочном центре. Возможно, более удобное место для поиска [Android Enthusiasts Stack Exchange] (http://android.stackexchange.com/). – jww 2016-10-29 09:00:43

ответ

58

До 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 года это становится Литтлер труднее, увидеть этот экстракт из Charles proxy website:

По состоянию на Android N, вам необходимо добавить в конфигурацию приложения, чтобы иметь его доверять SSL-сертификатам, созданным Charles SSL Proxying. Это означает, что вы можете использовать SSL Proxying только с приложениями, которыми вы управляете .

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

Добавить файл Рез/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> 
14

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

Спасибо за ваш ответ.Фактически, мне нужно установить сертификат таким образом, чтобы каждое приложение на устройстве доверяло сертификату. Такая же проблема должна существовать и для некоторых более мелких ЦС, таких как CAcert, чьи сертификаты по умолчанию не доверяют. Как они получают свои сертификаты? – 2010-12-20 17:48:26

+0

Вы пытались: Настройки -> Безопасность -> Установить с SD-карты – 2010-12-20 20:11:26

+0

Также может быть интересно: http://android.git.kernel.org/?p=platform/packages/apps/CertInstaller.git;a = blob; f = src/com/android/certinstaller/CertFile.java; h = 8e6379491fc342632e85396ccbc8ba75192d2133; hb = HEAD – 2010-12-20 20:17:57

41

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

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

0

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

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

3

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

Я скопировал /system/etc/security/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.class1.server.ca.crt, им мой случай это Allready было ок .crt, но, возможно, вам тоже нужно установить это.

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

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

6

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

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

В основном вам нужно:

  1. Скачать: файл cacerts.bks с телефона.

    ADB тянуть /system/etc/security/cacerts.bks cacerts.bks

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

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

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

Вот более подробный шаг за шагом для обновления ранее андроид телефон: How to update HTTPS security certificate authority keystore on pre-android-4.0 device

3

Там это БОЛЬШЕ более легкое решение, чем здесь, или в связанных потоках. Если вы используете веб-просмотр (как и я), вы можете добиться этого, выполнив в нем функцию JAVASCRIPT. Если вы не используете веб-просмотр, вы можете создать скрытую для этой цели. Вот функция, которая работает практически в любом браузере (или в веб-браузере) для запуска установки (как правило, через общий репозиторий сертификатов os, в том числе на 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 трюк работает на дроидов с API 19 и выше, но более старых версий WebView не будет работать, как это , Общая идея все еще работает - просто загрузите/откройте файл с помощью веб-браузера, а затем оставьте его. Это может быть более простым и универсальным решением (в реальной Java сейчас):

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

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

Смежные вопросы