Установите самозаверяющие сертификаты, которые больше не работают в Android Q

Я создал самозаверяющий сертификат, который пытался установить на свой телефон под управлением Android 10, но появляется закуска, сообщающая мне, что Private key required to install certificate.

Я попробовал на телефоне под управлением Android 9 с тем же сертификатом, и он работает, как и ожидалось.

Любая идея, есть ли обходной путь для установки ЦС?


person Dorinel Panaite    schedule 22.10.2019    source источник
comment
эй, у тебя есть решение этой проблемы?   -  person Roohi Zuwairiyah    schedule 07.05.2020


Ответы (3)


Большой! Моя проблема была решена с помощью этого кода:

openssl pkcs12 -export -in test.crt -inkey test.key -out test-combined.p12

После этого мне удалось нормально импортировать сертификат test-combined.p12 на мой Android 10.

Благодарю вас!

person Benedito Marques    schedule 15.05.2020
comment
Как я могу получить закрытые ключи стороннего сервера? и почему у Android Q есть такая функция? любое объяснение от андроида - person Prabhakaran; 24.07.2020
comment
Мне тоже любопытно. Для приложения или ОС нет смысла запрашивать закрытый ключ, это в первую очередь противоречит цели использования сертификата. - person tresf; 25.03.2021

Вот как я создал самоподписанный сертификат, который будет работать с Android, iOS и Chrome, из этот ответ:

команды opensl:

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/C=US/ST=Oklahoma/L=Stillwater/O=My Company/OU=Engineering/CN=test.com" -keyout ca.key -out ca.crt
openssl genrsa -out "test.key" 2048
openssl req -new -key test.key -out test.csr -config openssl.cnf
openssl x509 -req -days 3650 -in test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extensions v3_req -extfile openssl.cnf -out test.crt
openssl x509 -inform PEM -outform DER -in test.crt -out test.der.crt

Содержимое openssl.cnf:

[req]
default_bits = 2048
encrypt_key  = no # Change to encrypt the private key using des3 or similar
default_md   = sha256
prompt       = no
utf8         = yes

# Specify the DN here so we aren't prompted (along with prompt = no above).

distinguished_name = req_distinguished_name

# Extensions for SAN IP and SAN DNS

req_extensions = v3_req

# Be sure to update the subject to match your organization.

[req_distinguished_name]
C  = US
ST = Oklahoma
L  = Stillwater
O  = My Company
OU = Engineering
CN = test.com

# Allow client and server auth. You may want to only allow server auth.
# Link to SAN names.

[v3_req]
basicConstraints     = CA:TRUE
subjectKeyIdentifier = hash
keyUsage             = digitalSignature, keyEncipherment
extendedKeyUsage     = clientAuth, serverAuth
subjectAltName       = @alt_names

# Alternative names are specified as IP.# and DNS.# for IP addresses and
# DNS accordingly.

[alt_names]
DNS.1 = test.com

После создания сертификатов:

  1. Установите test.crt (по крайней мере, в моем случае не ca.crt) на свой сервер и перезапустите его.
  2. Отправьте test.crt по электронной почте в свою учетную запись Gmail, затем войдите в Gmail на своем устройстве Android или в симуляторе и нажмите, чтобы установить его. (Он появится на вкладке «ПОЛЬЗОВАТЕЛЬ» в разделе «Настройки» / «Шифрование и учетные данные» / «Доверенные учетные данные».)
person ScottyB    schedule 27.10.2019
comment
пришлите мне вашу ссылку beerpay.io или любую другую, которую вы используете! Ты, мой друг, заслуживаешь пивка-другого! Два дня я работал над этим и, наконец, ввел правильный поиск в Google, чтобы приземлиться здесь. - person Michael Hobbs; 05.01.2020
comment
Рад, что это помогло. Скоро я опубликую лучший ответ на stackoverflow.com/q/57565665/1161573, это намного проще - person ScottyB; 05.01.2020
comment
Кажется, что ограничение CA:TRUE — это то, чего не хватает большинству людей, я сначала подумал (глупый я!), что ваш ответ очень похож на то, что я делал, и пропустил его, но минимальный пример сработал для меня в android.stackexchange.com/questions/237141/ с этим флагом. - person F.X.; 18.06.2021

Опираясь на ответ @ScottyB:

openssl req -new -newkey rsa:2048 -days 3650 -nodes -x509 -subj "/C=US/ST=Oklahoma/L=Stillwater/O=My Company/OU=Engineering/CN=test.com" -keyout ca.key -out ca.crt
openssl genrsa -out "test.key" 2048
openssl req -new -key test.key -out test.csr -config openssl.cnf
openssl x509 -req -days 3650 -in test.csr -CA ca.crt -CAkey ca.key -CAcreateserial -extensions v3_req -extfile openssl.cnf -out test.crt

Ошибка дает подсказку, как исправить. Если вы объедините сертификат и закрытый ключ, сгенерированные выше, в один файл, Android примет его:

openssl pkcs12 -export -in test.crt -inkey test.key -out test-combined.p12

Перенесите файл .p12 на свой телефон Android, а затем используйте «Установить из памяти устройства». Дайте ему красивое удобочитаемое имя, и сертификат CA теперь можно будет использовать с такими службами, как веб-серверы, которые используют ca.key и ca.crt.

Вот фрагмент конфигурации Nginx для отказа от всех подключений, кроме тех, которые представляют сертификат, подписанный вышеуказанным сертификатом ca:

# within server block, eg. under the ssl_certificate config
    ssl_client_certificate /etc/ssl/ca/ca.crt;
    ssl_trusted_certificate /etc/ssl/ca/ca.crt;
    ssl_verify_client optional_no_ca;
    if ($ssl_client_verify != SUCCESS) { return 403; }

Когда ваш браузер Android теперь посещает этот веб-сайт, он пропустит вас дальше, только если вы предъявите подписанный сертификат.

person Alex van Vucht    schedule 16.02.2020
comment
Не могли бы вы поделиться с нами примером? - person sma6871; 16.02.2020
comment
Конечно, я расширил ответ. Надеюсь, это поможет. - person Alex van Vucht; 24.02.2020