власноруч підписаний сертифікат встановлює претензії на успіх, але android діє так, ніби cert там немає


17

Я намагаюся встановити самопідписаний сертифікат для свого веб-сервера в Android 4.3. У мене є .crt-файл у корені карти SD (який насправді емулюється, оскільки у мене немає слота SD у слоті).

Щоб встановити сертифікат, перейдіть у меню Налаштування -> Загальне -> Захист -> Зберігання даних -> Встановити зі сховища пристрою.

У мене з'являється діалогове вікно із зазначенням назви сертифіката (ім'я файлу мінус розширення .crt), яке я можу змінити (але не робити), "використовується для" витягування з вибраними "VPN та додатками" та текстом у нижній частині діалогового вікна, в якому повідомляється "Пакет містить: один сертифікат користувача". Все виглядає нормально, тому я натискаю "Ок". Діалогове вікно вимкнеться, і з'явиться тост-повідомлення із встановленим "[ім'ям]".

Однак якщо я негайно перейду до "Довірених облікових даних і виберіть" Користувач ", нічого там немає! Новий сертифікат також не під" Системою ", але я цього не очікував би. Якщо я перейду до цього браузера і спробую перейти до свого веб-сайт, я все ще отримую попередження про те, що сертифікат сайту не довіряється. Я також спробував перезавантажити, але це не має значення.

Що я роблю неправильно? Повна відсутність повідомлень про помилки не є корисною. Чи можливо мій сертифікат у неправильному форматі? Я спробував використовувати файл .crt у каталозі ssl сервера, і спробував перетворити його у формат DER.

Оновлення: я десь читав, що Android вимагає, щоб сертифікати були у форматі p12, тому я перетворив сертифікат Apache2 у p12 за допомогою наступної команди:

openssl pkcs12 -export -inkey server.key -in server.crt -out ~/server.p12

Потім я повторив вищезазначені дії, отримав те саме повідомлення про успіх, а потім продовжував бачити сертифікат у облікових даних користувачів, і я все одно отримую недовірену помилку сертифіката з мобільного браузера.

Відповіді:


19

У мене була така ж проблема з тим, щоб Android дійсно встановив сертифікат, поки я не знайшов цей сайт, який описує метод, який працював на мене. Вона зводиться до наступних кроків:

  1. Створіть приватний ключ та відкритий сертифікат x509 з розширеннями v3_req та увімкнено як CA:

    sudo openssl req -x509 -nodes -days 365 -newkey rsa:4096 -keyout /etc/ssl/private/my_site.key -out /etc/ssl/certs/my_site.crt -reqexts v3_req -extensions v3_ca

  2. Перетворіть сертифікат у формат DER, який розуміється під Android:

    sudo openssl x509 -in /etc/ssl/certs/my_site.crt -outform der -out my_site.der.crt

  3. Використовуйте будь-який метод, щоб отримати доступ my_site.der.crtдо свого пристрою Android - мені було просто просто розмістити файл на моєму веб-сервері та завантажити його через браузер Android, який автоматично дозволяє встановити його.

Хоча я хотів би, щоб крок 1 був розбитий на два (1а. Генерація приватного ключа та 1b. Генерація публічного сертифіката), я не вкладав занадто багато часу на дослідження, як це зробити. Будь ласка, повідомте мене в коментарі, якщо ви знайшли спосіб, який працює, дякую.

(Замість того, щоб додавати коментар, я вважаю, що це дійсно належить як частина відповіді для подальшого ознайомлення, тому я його редагую. - Майкл)

Замість того, щоб створити сертифікат, увімкнутий як CA, я створив CA, який підписався самостійно, а потім повторно підписав свій існуючий ключ / csr з новим CA. Потім я додав підписаний CA до Android та вуаля! Це спрацювало!

Створення самопідписаного КА:

openssl genrsa -out rootCA.key 4096
openssl req -x509 -new -nodes -key rootCA.key -days 3650 -out rootCA.pem

Повторне підписання існуючої КСВ у мене було від створення ключа з

openssl x509 -req -in existing.csr -CA rootCA.pem -CAkey rootCA.key -CAcreateserial -out existing.crt -days 3649

Тепер, використовуючи модифіковану форму другої команди, я перетворив сертифікат CA у форму DER:

openssl x509 -in /etc/apache2/ssl/rootCA.pem -outform der -out ~/rootCA.der.crt

Чудова річ у тому, що будь-які додаткові ненадійні сертифікати, які тепер перепідписані з новим самопідписаним CA, тепер будуть довіряти будь-якому пристрою, ніж встановлений новий CA, не потребуючи нічого іншого. Це точно не вирішує проблему довіри до сайтів, над якими ви не маєте контролю, але це може полегшити, якщо ви матимете вплив (скажімо) на свій ІТ-відділ для внутрішнього сервера чи чогось іншого.


1
У мене вже є сертифікат, який мені потрібно встановити, тому я спробував крок 2, і він все ще не відображається в довірених облікових даних користувачів після того, як він стверджує, що вдалося встановити, а Chrome все ще відображає помилку "ненадійний сайт" після перезавантаження.
Майкл

1
Чи може бути щось про розширення v3_req та увімкнено як CA, що сертифікат повинен мати для Android, щоб ним користуватися? Якщо так, чи є команда, яку я можу використовувати, щоб взяти існуючий сертифікат і додати до нього цю інформацію, оскільки я не маю контролю над усіма сертами, які я хочу встановити.
Майкл

3
Щоб відповісти на першу половину мого попереднього запитання, я прочитав сторінку, яку ви пов’язали, і, здається, проблема полягає в тому, що Android відмовляється встановлювати сертифікати, що підписуються самостійно (але не підписані СА). Це, здається, не (дер) -документовано, а той факт, що Android робить вигляд на встановлення, робить це ще гірше. Але питання залишається, якщо у мене є самопідписаний сертифікат, над яким я не маю контролю, чи є якийсь спосіб "CA" - змінити його, щоб я міг його встановити?
Майкл

1
@ Я сподіваюся, що ви не заперечуєте, я збираюсь відредагувати вашу відповідь, щоб включити моє рішення, а не включати його в коментарі, оскільки воно справді належить до складу відповіді.
Майкл

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