самозаверяющий сертификат устанавливает требования успешно, но андроид действует так, как будто сертификата там нет

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

(Вместо того, чтобы добавить комментарий, я чувствую, что это действительно часть ответа на будущее, поэтому я его редактирую. - Майкл)

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

Создание самозаверяющего CA:

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

Повторная подпись существующего CSR, который я имел от создания ключа от

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

Самое замечательное в этом то, что любые дополнительные ненадежные сертификаты, которые теперь повторно подписаны с помощью нового самозаверяющего ЦС, теперь будут доверенными на любом устройстве, если новый ЦС был установлен без необходимости устанавливать что-либо еще. Это не совсем решает проблему доверия к сайтам, которые вы не можете контролировать, но это может упростить ситуацию, если вы будете иметь какое-либо влияние на (скажем) свой ИТ-отдел для внутреннего сервера или чего-то еще.

FriendFX
источник
1
У меня уже есть сертификат, который необходимо установить, поэтому я попытался выполнить шаг 2, и он по-прежнему не отображается в User Trusted Credentials после того, как утверждается, что установка прошла успешно, а Chrome по-прежнему отображает ошибку «ненадежный сайт» после перезапуска.
Майкл
1
Может ли быть что-то с расширением v3_req и включенным в качестве CA, что сертификат должен иметь Android для его использования? Если это так, есть ли команда, которую я могу использовать, чтобы взять существующий сертификат и добавить эту информацию к нему, так как у меня нет контроля над всеми сертификатами, которые я хочу установить.
Майкл
3
Чтобы ответить на первую половину моего предыдущего вопроса, я прочитал страницу, на которую вы ссылались, и похоже, что проблема в том, что Android отказывается устанавливать самозаверяющие сертификаты (но не самозаверяющие центры сертификации). Это, кажется, не (дер) -документально, и тот факт, что Android притворяется, делает установку еще хуже. Но остается вопрос: если у меня есть самоподписанный сертификат, который я не могу контролировать, есть ли какой-нибудь способ «CA» - указать его, чтобы я мог установить его?
Майкл
1
@ Надеюсь, вы не возражаете, я собираюсь отредактировать ваш ответ, чтобы включить мое решение, а не включать его в комментарии, поскольку оно действительно является частью ответа.
Майкл
1
Я не понимаю, как генерируется существующий запрос на подпись .csr. Я думаю, что это последний упущенный пункт для полного пошагового руководства.
cngenther