Создаем собственный SSL-сертификат


Понадобилось мне тут сегодня для тестирования работы скрипта на защищенном HTTP получить каким-то образом SSL-сертификат. Получать платный для служебного домена, которым не пользуется никто, кроме нескольких сотрудников, конечно, глупо, поэтому было решено создать собственный. Это, как выяснилось, очень и очень просто.

Для начала давайте займемся сертификатом. Сначала создаем ключ:

sudo su
openssl genrsa -des3 -out myserver.key 1024
Вводим пароль и создаем небезопасную версию этого же ключа (отличие будет в том, что при перезапуске HTTP-сервера у нас никто не будет спрашивать пароль):
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» добавляем в список доверенных сертификатов браузера. Все, теперь мы больше не увидим при открытии сайта предупреждения о недоверенном соединении. Обратите внимание, работать это будет только с одним доменом, для остальных нужны будут собственные сертификаты, так как в противном случае предупреждение все-таки будет выводится.


07.04.2013, 14:46
  SSL, HTTPS, Apache2.
Просмотров: 6519.
5