Создать свой сертификат android

Полный список

— создаем ключи и подписываем приложение

Тема этого урока не относится непосредственно к программированию. И вполне себе можно кодить без этих знаний. Но для общего развития, думаю, об этом все-таки стоит поговорить. Данные знания пригодятся вам, например, когда будете делать приложение с гугл-картой, или когда будете выкладывать свое творение на маркет.

Подпись приложения

Вообще, в процессе подписи и верификации участвуют закрытый/открытый ключи и сертификат. Если кому интересно, то можете погуглить эти понятия и почитать подробнее. Я же, чтобы не усложнять урок, буду просто называть все это ключом. Для понимания темы урока этого будет достаточно.

Вы создали приложение и хотите его протестировать на реальном устройстве или эмуляторе. Для того, чтобы установить и запустить приложение, оно должно быть подписано. Если вы еще не публиковали на маркете свои приложения, то, скорее всего, про то, что приложение надо подписывать, вы слышите первый раз. И точно помните, что ни с какими подписями не возились. Создавали проект, кодили все, что нужно, сохраняли и запускали и все прекрасно работало. Так происходило, потому что Eclipse сам создавал ключ и сам подписывал приложение этим ключом, чтобы вам на первых порах не приходилось думать об этом. И когда ваше приложение устанавливалось, оно было уже подписанным. А если попытаться установить неподписанное приложение, то получим ошибку.

Итак, приложение обязательно должно быть подписанным, и Eclipse любезно берет это на себя. Он подписывает их debug-ключом. Раньше срок его действия был всего один год. Android проверяет срок действия ключа только при установке. Т.е. если вы установили приложение и срок действия ключа истек, вы все равно сможете использовать установленное приложение. А вот установить или обновить приложение, подписанное истекшим ключом, не получится. Система выдаст ошибку.

Сейчас срок debug-ключа равен 30 лет. Но приложение, подписанное debug-ключом, не получится опубликовать на маркете. А значит, нам надо будет создавать свой ключ и подписывать им приложение.

keytool

Для создания ключа нам понадобится утилита keytool. Ее можно найти по адресу \bin. Она умеет создавать новые ключи и показывать информацию о уже существующих. Давайте сначала попробуем посмотреть информацию о существующем ключе. Для этого возьмем тот самый debug-ключ, который используется для подписи приложений по умолчанию. Узнать где он находится можно в настройках Eclipse: Window > Preferences >Android > Build.

Файл debug.keystore имеет расширение keystore. Это можно перевести как хранилище ключей. Это действительно так, один такой файл может содержать в себе несколько ключей. Для того чтобы обратится к конкретному ключу внутри хранилища используется alias (алиас, можно рассматривать его как имя ключа).

Посмотрим, какие ключи есть в хранилище debug.keystore. Используем команду list. С помощью параметров keystore и storepass укажем имя файла хранилища и пароль к хранилищу:

keytool -list -keystore debug.keystore -storepass android

Мы видим, что здесь хранится один ключ с алиасом androiddebugkey, и создан он был 26.08.2012. Этот ключ и используется Eclipse-ом для подписи вашего приложения по умолчанию. Хранилище и ключ имеют одинаковый пароль — android.

Давайте создадим свой ключ. Для этого используем команду genkey и к ней идет куча параметров.

keytool -genkey -keystore mykeys.keystore -storepass spassword -alias mykey1 -keypass kpassword1 -dname “CN=Dmitry Vinogradov O=StartAndroid C=RU” -validity 10000

Выглядит страшно, но на самом деле все несложно. Просто надо понимать следующее:
хранилище — это файл и оно защищено паролем
ключ в хранилище имеет алиас и свой пароль
также ключ содержит информацию о владельце и имеет ограниченный срок действия

Именно эти вышеперечисленные параметры мы и задали в скрипте.

keystore — имя файла хранилища
storepass — пароль к хранилищу
alias — алиас создаваемого ключа
keypass — пароль к ключу
dname — информация о владельце ключа
validity — срок действия ключа (в днях)

dname задается в определенном формате. Я указал только имя, организацию и страну.

После выполнения этой команды в хранилище mykeys.keystore создался ключ с вышеуказанными параметрами. Если указанное хранилище не существует, то оно будет создано.

Теперь давайте снова используем команду list и поглядим на только что созданный ключ

keytool -list -keystore mykeys.keystore -storepass spassword

Видим, что внутри все так, как мы и создавали — один ключ с алиасом mykey1.

Туда же можно поместить второй ключ. Но теперь запишем скрипт создания ключа в несколько урезанном виде. Мы не будем указывать пароли к хранилищу и ключу, и информацию о владельце.

Читайте также:  Как перепрошивают планшеты андроид

keytool -genkey -keystore mykeys.keystore -alias mykey2 -validity 10000

и программа спросит нас о недостающих данных. Сначала пароль к хранилищу, затем данные о владельце ключа (я заполнял не все требуемые значения), затем пароль для создаваемого ключа и подтверждение пароля.

Функционально разницы нет, но при таком способе вам не надо знать формат ввода параметра dname (утилита все спросит сама), и посторонним не видны пароли, которые вы вводили.

Теперь в хранилище два ключа. Выполним list и убедимся.

keytool -list -keystore mykeys.keystore

Обратите внимание, что я не ввел пароль от хранилища (например, чтобы не «светить» его). Утилита спросит меня:

Видно, что был запрошен пароль и в хранилище сейчас два ключа.

Команду list можно еще выполнить с параметром v. Этот параметр добавляет информативности.

Теперь для каждого ключа виден не только алиас и дата создания, но и инфа о владельце, срок действия и пр.

Параметр v также можно использовать и с командой genkey. После создания ключа будет выведено немного информации о нем в консоль.

jarsigner

Итак, разобрались с keytool. Знаем, как создавать хранилище с ключами и как посмотреть инфу о существующих. Осталось узнать, как подписать приложение ключом. Для этого используется другая утилита — jarsigner.

Скрипт подписи выглядит так:

jarsigner -keystore mykeys.keystore -storepass spassword -keypass kpassword1 Package1.apk mykey1

Имена параметров нам знакомы по keytool: хранилище (keystore), пароль (storepass) к нему и пароль (keypass) к ключу. А последние два параметра – это имя APK-файла, который вы хотите подписать и алиас ключа из указанного хранилища, который вы хотите использовать для подписи.

После этого приложение будет подписано и система примет его к установке.

Ради интереса давайте попробуем установить неподписанный APK. Чтобы создать его надо щелкнуть правой кнопкой мыши на проекте в Eclipse и выбрать Android tools > Export Unsigned Application Package. Далее указываем путь, куда сохранить APK-файл. Eclipse создает приложение из проекта и сохраняет его в указанный каталог. После этого он выводит сообщение, что перед публикацией приложения необходимо его подписать и сжать (утилитой zipalign).

Попробуем установить приложение на эмулятор с помощью adb. Получаем ошибку Failure [INSTALL_PARSE_FAILED_NO_CERTIFICATES]:

Система обнаружила, что приложение не подписано.

Если же сначала закинуть APK на эмулятор и там запустить файловым менеджером, получим такое сообщение при установке:

Визард

Eclipse предоставляет визард, который позволяет реализовать все вышеописанные шаги по подготовке приложения к установке. Для этого надо на проекте в Eclipse щелкнуть правой кнопкой и выбрать Android tools > Export Signed Application Package.

Визард на всякий случай уточнит проект

Затем надо выбрать: использовать существующее хранилище или создавать новое. Если используем существующее, то выбираем его и вводим пароль к этому хранилищу.

Жмем Next, и визард спрашивает, какой из существующих ключей использовать, либо дает возможность создать новый.

Выбираем существующий ключ, вводим пароль к нему

Осталось указать путь и имя файла, куда Eclipse сохранит готовое, подписанное и сжатое приложение. Заодно он сразу показывает срок действия сертификата.

Жмем Finish и получаем готовое приложение, которое можно публиковать на маркете.

Если же у вас пока нет ключа, то визард поможет вам его создать, чтобы не надо было возиться с консолью и keytool.

В этом случае вы указываете, что хотите создать хранилище

Далее надо создать ключ

Здесь вы указываете алиас, пароль, срок действия (в годах) и инфу о владельце.

Ну и остается указать путь к создаваемому файлу

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

По поводу срока действия ключа, в хелпе пишут, что рекомендуется ставить 25 лет. И что при публикации приложения на маркете, проверяется, что срок действия закончится позднее, чем 22 октября 2033. Думаю, эта дата будет периодически сдвигаться.

На следующем уроке:

— разбираемся, что такое Package для приложения

Присоединяйтесь к нам в Telegram:

— в канале StartAndroid публикуются ссылки на новые статьи с сайта startandroid.ru и интересные материалы с хабра, medium.com и т.п.

— в чатах решаем возникающие вопросы и проблемы по различным темам: Android, Kotlin, RxJava, Dagger, Тестирование

— ну и если просто хочется поговорить с коллегами по разработке, то есть чат Флудильня

Читайте также:  Полный сброс андроид сони

— новый чат Performance для обсуждения проблем производительности и для ваших пожеланий по содержанию курса по этой теме

Источник

Как установить доверенный сертификат ЦС на Android-устройство?

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

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

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

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

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

10 ответов

До Android KitKat вам необходимо выполнить рутирование устройства, чтобы установить новые сертификаты.

С Android KitKat (4.0) до Nougat (7.0) это возможно и просто. Мне удалось установить сертификат Charles Web Debbuging Proxy на мое некорневое устройство и успешно прослушивать SSL-трафик.

До версии 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:

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

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

Добавьте в приложение файл res / xml / network_security_config.xml:

Затем добавьте ссылку на этот файл в манифест приложения следующим образом:

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

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

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

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

В основном вам необходимо:

Читайте также:  All in one sms app android

Загрузите: файл cacerts.bks со своего телефона.

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

Загрузите файл .crt из удостоверяющего центра, который вы хотите разрешить.

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

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

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

Для этого есть НАМНОГО более простое решение, чем опубликованное здесь или в связанных темах. Если вы используете веб-просмотр (как и я), вы можете добиться этого, выполнив в нем функцию JAVASCRIPT. Если вы не используете веб-просмотр, вы можете создать для этой цели скрытый. Вот функция, которая работает практически в любом браузере (или веб-просмотре), чтобы запустить установку CA (обычно через общий репозиторий сертификатов os, в том числе на Droid). Он использует хороший трюк с iFrames. Просто передайте этой функции URL-адрес файла .crt:

Трюк с iframe работает на дроидах с API 19 и выше, но более старые версии веб-просмотра не будут работать так. Однако общая идея по-прежнему работает — просто загрузите / откройте файл с помощью веб-просмотра, а затем позвольте операционной системе взять на себя управление. Это может быть более простое и универсальное решение (сейчас в реальной java):

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

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

Я скопировал /system/etc/security/cacerts.bks на свою SD-карту

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

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

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

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

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

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

Эти шаги работали для меня:

  1. Установите приложение Dory Certificate для Android на свое мобильное устройство: https: //play.google.com/store/apps/details?id=io.tempage.dorycert&hl=en_US
  2. Подключите мобильное устройство к ноутбуку с помощью USB-кабеля.
  3. Создайте корневую папку во внутренней памяти телефона, скопируйте файл сертификата в эту папку и отсоедините кабель.
  4. Откройте приложение Dory Certificate для Android, нажмите круглую кнопку [+] и выберите правильный вариант «Импортировать сертификат файла».
  5. Выберите формат, укажите имя (я ввел то же, что и имя файла), просмотрите файл сертификата и нажмите [OK].
  6. Появятся три карты. Я проигнорировал карту, на которой была только кнопка [ПОДПИСАТЬ CSR], и щелкнул кнопку [УСТАНОВИТЬ] на двух других картах.
  7. Я обновил веб-приложение PWA, которое я не открывал в своем мобильном Chrome (он размещен на локальном веб-сервере IIS) и вуаля! Нет предупреждающего сообщения о Chrome. Зеленый замок был там. Это было сработало.

В качестве альтернативы я нашел следующие варианты, которые мне не нужно было пробовать самому, но которые выглядели простыми:

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

Спасибо и надеюсь, что это поможет !! 🙂

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

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

Вы пробовали: Настройки -> Безопасность -> Установить с SD-карты? — Александр Эггер 20 дек.

Я не уверен, почему это еще не ответ, но я просто последовал этому совету, и он сработал.

Если вам нужен ваш сертификат для соединений HTTPS, вы можете добавить файл .bks в качестве необработанного ресурса в свое приложение и расширить DefaultHttpConnection, чтобы ваши сертификаты использовались для соединений HTTPS.

Источник

Оцените статью