Понадобилось мне тут сегодня для тестирования работы скрипта на защищенном HTTP получить каким-то образом SSL-сертификат. Получать платный для служебного домена, которым не пользуется никто, кроме нескольких сотрудников, конечно, глупо, поэтому было решено создать собственный. Это, как выяснилось, очень и очень просто.
Для начала давайте займемся сертификатом. Сначала создаем ключ:
sudo su
openssl genrsa -des3 -out myserver.key 1024
openssl rsa -in myserver.key -out myserver.key.insecure
По сути дела защищенный ключ нам больше не понадобится, но лучше его все-таки никуда не устранять.
mv myserver.key.insecure insecure.key
Следующий этап у нас ― это создание CSR. Тут понадобится заполнить кое-какую форму, но если Вы будете, как и я, использовать сертификат только для тестовых целей, то можно все поля просто оставлять пустыми (кроме «YOUR NAME», где нам следует указать доменное имя).
openssl req -new -key insecure.key -out myserver.csr
Теперь пришло время заверить сертификат и на этом можно заканчивать первый этап:
openssl x509 -req -days 3650 -in myserver.csr -signkey insecure.key -out myserver.crt
В моем примере сертификат выдается на 10 лет, но вместо «3650» Вы можете указать что душе угодно.
Теперь займемся самим сервером Apache, который нужно научить работать с нашими сертификатами. Для начала копируем полученные файлы туда, откуда сервер будет их получать:
cp myserver.crt /etc/ssl/certs
cp insecure.key /etc/ssl/private
Теперь включим соответствующий компонент:
a2enmod ssl
И перейдем к настройке самого сервера.
Для начала открываем в текстовом редакторе файл «/etc/apache2/sites-available/default-ssl». Удаляем все содержимое и добавляем нашу конфигурацию:
<VirtualHost *:443>
ServerName myserver.example
DocumentRoot /var/www
SSLEngine on
SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire
SSLCertificateFile /etc/ssl/certs/myserver.crt
SSLCertificateKeyFile /etc/ssl/private/insecure.key
</VirtualHost>
В данном примере «myserver.example» ― домен, по которому наш сайт будет открываться в браузере (можно прописать в hosts хоть google.com), а «/var/www» ― домашняя папка. Можно указать отличную от той, что указана в конфигурации обычного сайта, тогда по http будет открываться один сайт, а по https ― другой. Можно указать и другие параметры, но я указал только самые основные.
Теперь после перезагрузки мы можем столкнуться с ошибкой «[warn] _default_ VirtualHost overlap on port 443, the first has precedence», поэтому сразу открываем в текстовом редакторе файл «/etc/apache2/ports.conf», находим в нем строки «Listen 443» и над ними дописываем:
NameVirtualHost *:443
Теперь все вроде как готово. Перезагружаем сервер командой «service apache2 restart» и открываем сайт в браузере (у меня Google Chrome). Браузер будет ругаться на то, что сертификат его не устраивает. Решаем и эту проблему. Запускаем из консоли следующую команду:
openssl pkcs12 -export -out myserver.pfx -inkey myserver.key -in myserver.crt -certfile myserver.crt
Сначала добавляем «myserver.crt» в список доверенных издателей браузера, затем полученный файл «myserver.pfx» добавляем в список доверенных сертификатов браузера. Все, теперь мы больше не увидим при открытии сайта предупреждения о недоверенном соединении. Обратите внимание, работать это будет только с одним доменом, для остальных нужны будут собственные сертификаты, так как в противном случае предупреждение все-таки будет выводится.