2011-09-09 Apache 2, openssl и клиентские сертификаты

Материал из YourcmcWiki
Перейти к: навигация, поиск

Интернет полон HOWTO по настройке клиентских SSL-сертификатов в Апаче, которые все сводятся к тому, что нужно сгенерировать сертификаты для сервера и клиентов, подписать клиентские каким-нибудь CA-сертификатом, слить их в PKCS-12 и поставить в браузер, а на сервере прописать SSLVerifyClient require и SSLCACertificateFile </path/to/ca.pem>.

Однако нигде не упоминается важный момент, о котором легко забыть, если использовать «искаробочный» openssl: клиентские сертификаты должны быть именно что клиентскими — поле nsCertType у них должно иметь значение client, email (возможно ещё , objsign), но никак не server, который генерится по умолчанию (что приводит к ошибкам OpenSSL: Exit: error in SSLv3 read client certificate)! Прописывается это в /etc/ssl/openssl.conf (или там, где лежит ваш openssl.conf).

Аналогично CA-сертификат должен быть CA, то есть, иметь basicConstraints=CA:TRUE. Но об этом забыть сложно, потому что команды генерации CA-сертификата всё равно никто никогда не помнит, а все используют /usr/lib/ssl/misc/CA.pl или CA.sh, который выставляет basicConstraints правильно.

Ещё полезное замечание: как упаковать серт+ключ в PKCS-12, из man 1 pkcs12 понятно — openssl pkcs12 -export -keyin key.pem -in cert.pem -out cert.p12. А вот как извлечь ключ — понятно не совсем, ведь если просто сказать openssl pkcs12 cert.p12 -nocerts -out key.pem, и не задавать пароль, в key.pem ключа ни хрена не будет. Чтобы сразу вытащить нешифрованный ключ, нужно сказать openssl pkcs12 cert.p12 -nocerts -out key.pem -nodes.

И последнее, хотя это и упоминается где-то в HOWTO-шках — не забывайте про openssl s_client, это действительно полезная штука! Например, если он при попытке соединения пишет «No client certificate CA names sent», значит, браузеру не отправляется список имён подходящих CA, которыми должен быть подписан клиентский сертификат, и значит, браузер не пришлёт ничего в ответ. Кстати, для проверки SNI (Server Name Indication) нужно указать опции -tls1 -servername server.address.com, просто -servername без -tls1 почему-то не канает.

[ Хронологический вид ]Комментарии

(нет элементов)

Войдите, чтобы комментировать.