k001
k001
:...

April 2032
        1 2 3
4 5 6 7 8 9 10
11 12 13 14 15 16 17
18 19 20 21 22 23 24
25 26 27 28 29 30

k001 [userpic]
android: importing certificates

Все спят, а я пробую поставить свой (самоподписанный) SSL сертификат в гуглофон. Фигушки с маслицем! То есть он как бы туда ставится, но это ничего не меняет.

Собственно, задача в том, чтобы получить доступ к своему почтовому серверу по IMAP over SSL (dovecot), SMTP + TLS (sendmail). Доступ-то я получил (IMAP, кстати, работает со штатным клиентом очень хорошо), только с опциями "SSL (trust any certificate)" и "TLS (trust any certificate)". Хочется то, что в скобках, убрать.

Собственно, поставить сертификат очень просто -- надо сделать так, чтобы веб-сервер отдавал его с Content-Type: application/x-x509-ca-cert. Для этого пишем:
cat << EOF >> /etc/httpd/conf.d/types.conf
AddType application/x-x509-ca-cert .pem
EOF
/etc/init.d/httpd restart


Дальше открываем URL с сертификатом, и он вроде как импортируется (при этом спрашивается пароль на внутрений keychain). Причём это получилось у меня сделать с сертификатом в формате pem.

Кстати, нашёл в Интернетах вопиюще неправильные инструкции. Дескать, надо подсунуть телефону сертификат в формате PKCS12, и всё зажужжит. А чтобы сделать такой сертификат, надо, мол, иметь доступ к приватному ключу (про это много где написано). Вот такая примерно неправильная команда предлагается:

openssl pkcs12 -export -out cert.p12 -in cert/cert.pem -inkey private/cert.pem -name "My cert"

В результате мы получаем файлик, в котором есть и сертификат, и приватный ключ (в чём можно убедиться, просмотрев вывод openssl pkcs12 -info -nodes -in cert.p12). Конечно, это совсем не то, что мы хотим выкладывать и раздавать! Правильная команда вот такая:

openssl pkcs12 -export -out cert.p12 -in cert.pem -nokeys -name "My cert"

Впрочем, это не помогает всё равно. При попытке открыть URL с сертификатом телефон спрашивает пароль от сертификата в бесконечном цикле (пока не нажмёшь Cancel) -- никакой пароль не подходит. Я пробовал делать файл сертификата с паролем и без -- без разницы, и так и так не работает.

Потом я подумал, что проблема в том, что это самоподписанный сертификат, и вспомнил про CAcert.org. Дай, думаю, их рутовый CA сертификат поставлю. Тут тоже всё просто, но ничего не работает. Во-первых, заходим на https://www.cacert.org/ и убеждаемся, что браузер ругается на подписанный непонятно кем сертификат. Во-вторых, открываем http://www.cacert.org/certs/root.crt -- сертификат импортируется. В-третьих, проверяем, что есть результат -- снова открываем https://www.cacert.org/ -- ой, всё равно ругается.

Не знаю, что я делаю не так. Вроде бы всё делаю так. Android 2.2.

Есть вариант, конечно, пересобрать кейчейн и подсунуть ему, но для этого надо разлочивать телефон, это как-то неспортивно.

Tags: , ,
Comments

Чего чего, а хранилища пользовательских сертификатов я не встречал.

Из явы весь SSL и прочие криптофункции используются через библиотеку http://www.bouncycastle.org/
А она написана в лучших традициях корпоротивной явы (т.е. левой задней пяткой). Список доверенных сертификатов ей скармливается на этапе компиляции.

Сопутствующий баг: http://code.google.com/p/android/issues/detail?id=1016

В клиенте k9-mail в начале года начали работать над поддержкой пользовательских сертификатов: http://groups.google.com/group/k-9-mail/browse_thread/thread/2a676995bdd78935