Пытаясь настроить кодированное соединение по https-протоколу, чтобы просто не гонять пароли открытым текстом, столкнулась с проблемой - развитие документации, проработка удобства, и чарующая простота не являются свойствами этой технологии. Хотя, вроде всё просто - есть дерево подписей и подписанный сертификат (грубо говоря - визитка сервера, с которым происходит соединение). Вы смотрите дерево подписей и сами думаете, доверяете вы этим подписям или нет. Или же у вас есть копия сертификата и вы сравниваете. В конце концов (и это требуется чаще всего) вам хочется не очень светиться эксклюзивными данными и вам всё равно какие там визитки. Эту простую задачу превратили в монстроидальный набор крючочков и ручечек. Мне понадобилась неделя чтобы, используя иногда по 3 статьи на разных языках одновременно , дойти до решения вопроса (у меня была задача номер три из моего списка :)
Создать конфигурацию виртуального сервера с возможностью подключения по HTTPS-протоколу для более менее безопасной передачи эксклюзивных данных (трафик будет шифроваться). Вопрос начального обмена ключами, который может повлиять на безопасность соединения, я оставлю для самостоятельного изучения, как проблему выходящую за рамки этой статьи.
В файлике /etc/ssl/openssl.cnf надо проделать следующие изменения:
[ CA_default ] dir = . # Это каталог для работы с ssl certs = $dir/ssl.crt # Это где будут лежать сертификаты crl_dir = $dir/ssl.crl # Это где будут листы "отзывов подписей" database = $dir/index.txt # Здесь index file для индексирования запросов на подпись new_certs_dir = $dir/ssl.crt # Сюда будут писать новые сертификаты certificate = $dir/nemesida-ca.pem # Корневой сертификат serial = $dir/serial # Серийный номер запроса crl = $dir/ssl.crl/nemesida.pem # Текущий лист отзывов подписей private_key = $dir/ssl.key/nemesida-ca.key# Секретный ключ для основного сертификата RANDFILE = $dir/ssl.key/.rand #
Для удобства, перейдём в каталог с конфигурацией Apache, где у меня располагаются подкаталоги с искомыми сертификатами:# cd /usr/local/etc/apacheКорневой сертификат является корнем дерева подписей и является как бы самой ГЛАВНОЙ подписью. Секретный ключ (он нужен для того, чтобы можно было воспользоваться вашим корневым сертификатом для подписи остальных) и сертификат создаются одной командой:# openssl req -config /etc/ssl/openssl.cnf -new -x509 -keyout ssl.key/nemesida-ca.pem -out nemesida-ca.pem -days 3650Вас спросят пароль - введите и запомните его. Все остальные поля заполняйте так, как вам подскажет сердце. Снимите пароль с ключа:# openssl rsa -in ssl.key/nemesida-ca.pem -out nemesida-ca.keyЕсли вы не сможете спасти этот ключ от посягательств, то и пароль вам не поможет.Что делает эта строка, я затрудняюсь ответить точно, но так сделать рекомендуют:# openssl x509 -in nemesida-ca.pem -out nemesida-ca.crtВот и всё - главная подпись, т.е. корневой сертификат, у вас есть. Он подписан сам собой.
Следующие действия, которые надо не забыть совершить, вызывают у меня бурный восторг. Следует создать два файла с некоторой индексной информацией, создать которые openssl не может, равно как и выдать разумное сообщение по этому поводу. Создадим индексный файл (ключевое слово database из openssl.cnf):# touch index.txtСоздадим файл серийных номеров (ключевое слово serial из openssl.cnf):# echo '01' > serialЭтот файл должен содержать две цифры (обязательно). Если вы ещё не создавали никаких сертификатов кроме корневого, файл должен содержать 01.
Создание сертификатов сервера состоит из процедуры создания запроса на попись, а затем подписания этого запроса в отличии от создания самоподписанного корневого сертификата. Создаём запрос на подпись нового сертификата и создаём секретный ключ к нему:# openssl req -config /etc/ssl/openssl.cnf -new -keyout ssl.key/nemesida.pem -out ssl.csr/nemesida.pemВводя даные, учтите, что поле Common Name должно содержать полностью определённое доменное имя (FQDN) того сайта, где вы будете использовать https-протокол, чтобы броузеры не выдавали предупреждения о неверности имени. Снимите пароль с ключа:# openssl rsa -in ssl.key/nemesida.pem -out nemesida.keyПодпишите запрос (подписка запроса и есть создание нового сертификата) своим корневым сертификатом:# openssl ca -config /etc/ssl/openssl.cnf -policy policy_anything -out ssl.crt/nemesida.pem -infiles ssl.csr/nemesida.pemПодготовьте сертификат к использованию:# openssl x509 -in ssl.crt/nemesida.pem -out ssl.crt/nemesida.crt
Создайте на всякий случай список запросов (там будут храниться и данные по отзывам подписей, если вам это когда-либо понадобится):# openssl ca -gencrl -out ssl.crl/nemesida.pem
В файле httpd.conf (сами найдите ваш файл конфигурации) прописываем:
NameVirtualHost *:443 DocumentRoot "/home/nemesida/www" ServerName nemesida.ru ScriptAlias /cgi-bin/ /home/nemesida/cgi-bin/ SSLEngine on SSLCertificateFile /usr/local/etc/apache/ssl.rt/nemesida.crt SSLCertificateKeyFile /usr/local/etc/apache/ssl.key/nemesida.key SSLCACertificateFile /usr/local/etc/apache/nemesida-ca.crt SSLCARevocationFile /usr/local/etc/apache/ssl.crl/nemesida.crl SSLOptions +StdEnvVars SSLOptions +StdEnvVars SetEnvIf User-Agent ".*MSIE.*" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0