Як встановити довірений сертифікат CA на пристрої Android?


134

Я створив власний сертифікат 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 як довірений сертифікат? Чи існує спосіб це зробити програмно?


Тут можна припустити вкорінений телефон. :)
Björn Marschollek

Відповіді:


116

Перед Android KitKat вам доведеться викорінити свій пристрій, щоб встановити нові сертифікати.

Від Android KitKat (4.0) до Nougat (7.0) це можливо і просто. Мені вдалося встановити сервер Charles Debbuging Proxy на моєму не вкоріненому пристрої та успішно обнюхати трафік SSL.

Витяг з http://wiki.cacert.org/FAQ/ImportRootCert

До версії Android 4.0 з версією Android Gingerbread & Froyo існував єдиний файл, доступний лише для читання (/system/etc/security/cacerts.bks), що містить довірений магазин із усіма сертифікатами CA ('system'), яким за замовчуванням довіряється Android. Це використовують як системні програми, так і всі програми, розроблені за допомогою SDK для Android. Скористайтеся цими інструкціями щодо встановлення сертифікатів CAcert на Android Gingerbread, Froyo, ...

Починаючи з Android 4.0 (Android ICS / 'Сандвіч з морозивом', Android 4.3 'Jelly Bean' та Android 4.4 'KitKat'), системні довірені сертифікати знаходяться на (тільки для читання) системному розділі в папці '/ system / тощо / безпеки / 'як окремі файли. Однак тепер користувачі можуть легко додати власні сертифікати "користувача", які зберігатимуться у "/ data / misc / keychain / certs-додано".

Встановленими системою сертифікатами можна керувати на пристрої Android у розділі "Налаштування -> Безпека -> Сертифікати ->" Система ", тоді як користувацькі довірені сертифікати керуються у розділі" Користувач ". Використовуючи довірені сертифікати користувача, Android змусить користувача пристрою Android виконувати додаткові заходи безпеки: використання PIN-коду, блокування зразка або пароль для розблокування пристрою є обов'язковими при використанні сертифікатів, що надаються користувачем.

Встановити сертифікати CAcert як сертифікати "довірені користувачеві" дуже просто. Встановлення нових сертифікатів як «системних довірених» сертифікатів вимагає більше роботи (і вимагає кореневого доступу), але це має перевагу уникнути вимоги блокувального екрану Android.

З Android N далі стає трохи складніше, дивіться цей витяг із веб-сайту проксі Charles :

Що стосується 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>

1
Мої користувацькі файли сертифікатів ( /system/etc/security/cacerts/*.0) не зберігаються після перезавантаження / перезавантаження AVD, тому це рішення не вдалося.
fikr4n

@BornToCode цікаво - я дуже рідко використовую AVD, тому мені не було відомо про це обмеження
Дін Дикий

Я бачу налаштування debug-overrides, чи означає це, що це network_security_configлише варіант налагодження націлювання? Якщо у мене є інший варіант, такий як варіант UAT, то це не буде працювати?
Ісаак

1
@Isaac це означає, що він застосовуватиметься до будь-яких варіантів, де debuggable = true
Dean Wild

1
@DeanWild - велике спасибі! Я намагався цю роботу працювати назавжди і продовжував отримувати "недійсний сертифікат SSL" під час налагодження програми. Це рішення спрацювало як шарм для мого додатка Android, який працює на Android 9 на Samsung Note 8.
Дейв Блек

43

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

Деталі та посилання: http://www.mcbsys.com/techblog/2010/12/android-certificate/ . У цій публікації перегляньте посилання на помилку Android 11231 - ви можете додати свій голос і запит до цієї помилки.


3
Розробник Android відповів на мій запит. оновлення cacerts.bks: "у всіх випусках, хоча 2.3, потрібна OTA, щоб оновити cacerts.bks на не вкоріненому телефоні." code.google.com/p/android/isissue/detail?id=11231#c25 . OTA = над ефіром, правда? Чи може це бути, чому ваш телефон продовжує повертатися до заводських cacerts.bks? Однак якщо у вас є кореневий доступ, вам, здається, ви повинні мати можливість завантажити вихідний код, додати cert, а потім створити cacerts.bks за допомогою сценарію certimport.sh. android.git.kernel.org/?p=platform/libcore.git;a=tree;f=luni/… .
Марк Беррі

Дякую. Очевидно, це не відповідь, яку я хотів почути, але, здається, є правильною. Я сподівався, що є спосіб встановити сертифікат без оновлення всієї системи. Я, звичайно, можу створити новий cacerts.bks, з кореневим доступом я навіть можу замінити стару, але вона повертається до оригінальної версії при кожному перезавантаженні. Без перезавантаження, схоже, Android відмовляється перезавантажувати файл довірених сертифікатів.
Бьорн Маршоллек

27
А як же встановити сертифікати CA на платформах 3.X і 4.X?
Алок Кулкарні


16

Якщо вам потрібен ваш сертифікат для підключення 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);
        }
    }
}

Спасибі за Вашу відповідь. Насправді мені потрібно встановити сертифікат таким чином, що кожна програма на пристрої довіряє сертифікату. Така ж проблема повинна існувати і для деяких менших ЦС, таких як CAcert, сертифікатам яких не довіряють за замовчуванням. Як вони встановлюють свої сертифікати?
Бьорн Маршоллек

Ви спробували: Налаштування -> Безпека -> Встановити з SD Card
Олександр Еггер


2
У мене така ж проблема, я повинен завантажити сертифікат .PDX X509 за допомогою програми Adroid 2.3.3, а потім створити SSL Connection. Хтось може мені допомогти з коментованим кодом?
AndroidLearner

9

Посібник, зв'язаний тут , ймовірно, відповість на початкове запитання без необхідності програмування користувацького роз'єму SSL.

Знайдено дуже детальне керівництво щодо імпортування кореневих сертифікатів, яке насправді дає вам змогу встановлювати довірені сертифікати CA на різних версіях пристроїв Android (серед інших пристроїв).

В основному вам потрібно:

  1. Завантажте: файл cacerts.bks з телефону.

    adb pull /system/etc/security/cacerts.bks cacerts.bks

  2. Завантажте файл .crt від органу, що сертифікує, який ви хочете дозволити.

  3. Змініть файл cacerts.bks на своєму комп’ютері за допомогою постачальника BouncyCastle

  4. Завантажте файл cacerts.bks назад на телефон і перезавантажте.

Ось більш детальний крок за кроком для оновлення попередніх телефонів Android: Як оновити зберігання ключів зберігання сертифікатів HTTPS на пристрої до android-4.0


5

Є набагато простіше рішення для цього, ніж розміщене тут, або в пов'язаних потоках. Якщо ви використовуєте веб-перегляд (як і я), ви можете досягти цього, виконавши в ньому функцію JAVASCRIPT. Якщо ви не використовуєте веб-перегляд, можливо, ви захочете створити для цього прихований. Ось функція, яка працює практично в будь-якому веб-переглядачі (або веб-перегляді) для встановлення програми kickoff ca (як правило, через спільне сховище 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 і новіших версій, але старіші версії веб-перегляду не працюватимуть так. Загальна ідея все ще працює - просто завантажте / відкрийте файл за допомогою перегляду в Інтернеті, а потім дозвольте OS взяти на себе. Це може бути простішим і універсальнішим рішенням (у фактичній Java зараз):

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

Зауважте, що instance_ є посиланням на Діяльність. Це чудово працює, якщо ви знаєте URL до cert. Однак у моєму випадку я це вирішую динамічно за допомогою програмного забезпечення на стороні сервера. Мені довелося додати неабияку кількість додаткового коду, щоб перехопити URL-адресу переадресації і викликати це таким чином, що не спричинило збій на основі ускладнення з потоком, але я не додаватиму всю цю плутанину тут ...


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 (нічого не вводили, коли запитали пароль)

Виберіть імпорт у порталі та відкрийте sub.class1.server.ca.crt, я моєму випадку, він уже мав ca.crt, але, можливо, вам також потрібно встановити це.

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

Перезавантажив телефон і тепер я можу переглядати цей сайт, використовуючи сертифікат startssl без помилок.



будь-яка ідея, як повернути cacert.bks назад на не вкоріненому пристрої?
Боб

1

Ці кроки працювали для мене:

  1. Встановіть додаток Dory Certificate Android на свій мобільний пристрій: https://play.google.com/store/apps/details?id=io.tempage.dorycert&hl=uk
  2. Підключіть мобільний пристрій до ноутбука за допомогою USB-кабелю.
  3. Створіть кореневу папку на внутрішній пам'яті телефону, скопіюйте файл сертифіката у цю папку та від'єднайте кабель.
  4. Відкрийте додаток Dory Certificate Android, натисніть круглу кнопку [+] та виберіть потрібну опцію Імпортувати сертифікат файлу.
  5. Виберіть формат, введіть ім’я (я набрав те саме, що і ім’я файлу), перегляньте файл сертифіката та натисніть [ОК].
  6. Три картки будуть перераховані. Я проігнорував картку, на якій була лише кнопка [ЗНАЧИТИ CSR], і продовжив натискання кнопки [ВСТАНОВИТИ] на двох інших картках.
  7. Я оновив веб-додаток PWA, я не відкрив свій мобільний Chrome (він розміщений на локальному веб-сервері IIS) та voala! Немає хромового попередження. Зелений замок був там. Це працювало.

Крім того, я знайшов такі варіанти, які мені не потрібно було намагатися, але мені було легко дотримуватися:

Нарешті, це може не бути актуальним, але, якщо ви хочете створити та налаштувати сертифікат, який підписав власноруч (з mkcert) для додатку (веб-сайту) PWA, розміщеного на локальному веб-сервері IIS, я перейшов до цієї сторінки:

https://medium.com/@aweber01/locally-trusted-development-certificates-with-mkcert-and-iis-e09410d92031

Дякую і сподіваємось, що це допомагає !! :)


0

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

Однак це буде працювати лише для вашої програми. Немає можливості програматично це робити для всіх програм на пристрої користувача, оскільки це буде ризиком для безпеки.


Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.