Перейти к содержимому

Создание и установка SSL сертификата на Nginx или Apache, на сервере FreeBsd

Создание SSL сертификатов

Рассказывать что это такое не буду… гугл Вам в помощь 🙂
И так начнем:

Генерация частного ключа и CSR

Программный пакет openssl может быть использован для генерации приватного RSA ключа и создания CSR. Он так же может быть использован
для создания самоподписных сертификатов которые могут быть использованы для тестовых целей или внутреннего пользования. Программа, которая
обычно используется для решения этих задач, известна как openssl. Она должна быть установлена в директории /usr/local/ssl. Может быть, вам
придется добавить эту директорию в переменную PATH или же переместить эту программу в директорию, которая уже прописана в переменной PATH,
для того чтобы не писать полный путь. Дальнейшие примеры полагают, что openssl доступен вам без необходимости писать полный путь.

В первую очередь надо создать ваш приватный ключ. Это будет 1024 битный ключ стандарта RSA зашифрованный с использованием алгоритма TripleDES и хранящийся в формате PEM, так что его можно будет читать как простой текст. Мы будем использовать несколько файлов для усиления
случайности и для того чтобы сделать наш ключ более секретным.
Текстовые файлы, которые были сжаты утилитой типа gzip . станут хорошим выбором. Ключ генерируется следующей командой, где file1:file2:etc представляют собой случайные сжатые файлы.

Переходим в папку куда будем помещать сертификаты:

# cd /usr/local/nginx/

Cоздаем ваш приватный ключ

# openssl genrsa -des3 -rand file1:file2:file3 -out server.key

Программа предложит вам ввести пароль и сохранит ключ в файле server.key. Очень важно не забыть пароль. Если ключ будет утерян или пароль будет забыт сертификат станет бесполезен. Невозможно выразить как важен приватный ключ для сертификата. Если приватный ключ или пароль скомпрометированы сертификат должен быть отменен. Как минимум это будет стоить вам денег заплаченных за сертификат. Было бы хорошей идеей сделать резервную копию на безопасном носителе, таком как кассета или дискета.

Один неприятный сторонний эффект ключа с паролем это то что Apache или nginx будет всякий раз спрашивать пароль при старте. Понятно что это не очень удобно если только кто-то не находится постоянно рядом на случай
перезагрузки или аварийной остановки. mod_ssl (Для апача) включает в себя возможность использования внешней программы вместо встроенного парольного диалога. Возможно убрать пароль из ключа. Если приватный ключ более не зашифрован, важно чтобы файл его содержащий, был доступен на чтение только пользователю root. Если ваша система скомпрометирована и третья сторона получила ваш незашифрованный приватный ключ, производный сертификат должен быть отменен. После того что мы сказали, используйте следующую команду для того чтобы убрать пароль из ключа.

# openssl rsa -in server.key -out server.pem

Или же просто в первом шаге не используйте ключ -des3

После того как приватный ключ сгенерирован может быть сгенерирован запрос на подпись сертификатов(CSR —). CSR может быть использован двояко. В идеале CSR должен быть послан к CA такому как Tawte или VeriSign, которые проверят подлинность запрашивающего и выдадут подписанный сертификат. Другой путь — подписать CSR самостоятельно, что будет продемонстрировано ниже.
Во время генерации CSR вас попросят ввести некоторое количество информации. Один из вопросов будет Common Name (eg, YOUR name) []:
Важно чтобы это поле содержало полностью квалифицированное имя домена вашего сервера. Если вебсайт имеет адрес www.zatusim.ru то вы должны написать именно www.zatusim.ru Команда для генерации CSR выглядит так.

# openssl req -new -key server.key -out server.csr

Пример подстановки:

Country Name (2 letter code) [AU]:RU
State or Province Name (full name) [Some-State]:Moscow
Locality Name (eg, city) []:Moscow
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Zatusim Company
Organizational Unit Name (eg, section) []:.
Common Name (eg, YOUR name) []:www.zatusim.ru
Email Address []:webmaster@zatusim.ru
 
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:

Генерация самоподписанного сертификата

На этом этапе вам необходимо сгенерировать самоподписанный сертификат потому что вы или не планируете заводить сертификат подписанный CA, или хотите потестировать новую реализацию SSL пока CA подписывает ваш сертификат. Мой опыт общения с Tawte показывает, что получение сертификата занимает неделю и больше. Время которое занимает получение сертификата варьируется от того как быстро CA получит необходимые документы. Временный сертификат будет выдавать ошибку в клиентском броузере от того, что CA неизвестен и не проверен.

Для того чтобы сгенерировать сертификат годный в течение 60 дней введите следующую команду.

# openssl x509 -req -days 60 -in server.csr -signkey server.key -out server.crt

Установка ключа и сертификата
У меня все виртуальные хоты грузятся из папки.. в прошлой статье я писал как это сделать…

В конфиге хоста должно получиться примерно следующее:

    server {
        listen       443;
        server_name  zatusim.ru www.zatusim.ru;
 
    ssl on;
    ssl_certificate      /usr/local/nginx/server.crt;
    ssl_certificate_key  /usr/local/nginx/server.key;
 
    ssl_session_timeout  5m;
    ssl_prefer_server_ciphers on;
    ssl_session_cache    shared:SSL:1m;
    ssl_ciphers ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP:+eNULL;

Заходим на свой домен с https в итоге, так как сертификат у нас не подписан «спец службами» 🙂 в ФФ мы получим что сертификат не подписан, считываем его и добавляем в доверенные. ИЕ скажет что не безопасно 🙂 мы то знаем что все пучком… заходим и видим что прекрасно соединились…

ДЛя тех кто настраивает под apache + mod_ssl

Когда Apache и mod_ssl установлены — создаются несколько поддиректорий в конфигурационной директории Apache. Их расположение зависит от того, как компилировался Apache. Если использовать мои инструкции, компилируя Apache, конфигурационная директория будет /usr/local/apache/etc Директории, которые создает mod_ssl содержат в себе файлы ssl.crt, ssl.csr, и ssl.key Это хорошее место для хранения сертификатов, запросов на подпись и приватных ключей. Если у вас будет несколько хостов с SSL хорошей практикой стать включение в имена этих файлов имен защищаемых хостов.

Добавляя виртуальные хосты к веб-серверу, я обычно предпочитаю хранить их конфигурации в отдельном файле. Это дает уверенность, что все конфигурации могут быть быстро найдены, и, заодно, не позволяет основному конфигурационному файлу разрастаться. Если все виртуальные хосты сохранены в файле ssl.conf, то для того чтобы Apache нашел его и прочитал надо включить в основной конфиг следующюю строку:

# Include /usr/local/apache/etc/ssl.conf

Конфигурирование виртуального хоста, использующего SSL.

Обширные примеры конфигурации SSL для виртуальных хостов включены в файл /usr/local/apache/etc/httpd.conf.default, который устанавливается вместе с mod_ssl. Ознакомьтесь с документацией на mod_ssl для того чтобы получить более подробную информацию о возможностях конфигурации. Простой хост использующий SSL в конфигурационном файле может быть прописан так. SSL Virtual Hosts

ServerAdmin webmaster@zatusim.ru
DocumentRoot /usr/local/apache/share/htdocs
ServerName www.zatusim.ru
ScriptAlias /cgi-bin/ /usr/local/apache/share/htdocs/cgi-bin/
SSLEngine on
SSLCertificateFile /usr/local/apache/etc/ssl.crt/server.crt
SSLCertificateKeyFile /usr/local/apache/etc/ssl.key/server.pem
SetEnvIf User-Agent ".*MSIE.*" nokeepalive ssl-unclean-shutdown
CustomLog /usr/local/apache/var/log/ssl_request_log \
"%t %h %{SSL_PROTOCOL}x %{SSL_CIPHER}x \"%r\" %b"

Не забудьте скопировать ваш сертификат туда куда указали путь в апаче или же пропишите свой.

Этот пример создаст виртуальный хост с именем. который доступен через порт 443 (стандартный порт для протокола https) сайты с IP адресом вашего сервера. Можно создать столько дополнительных виртуальных хостов для вашего сервера сколько IP адресов он обслуживает. Просто добавьте дополнительные конфигурационные блоки между директивами.

По архитектурным причинам протокол SSL не позволяет создавать name-based (HTTPS 1.1) виртуальные хосты. Для того чтобы создать новый виртуальный хост с поддержкой SSL на другом IP адресе просто замените _default_на новый IP.

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

Теперь вы можете использовать ваш любимый броузер для просмотра содержимого только что созданного виртуального хоста защищённого SSL . Не забудьте использовать префикс https:// вместо http://. Вы получите окно с предупреждением, если вы использовали самоподписанный сертификат. Подтвердите согласие и страница продолжит загружаться уже защищенная с помощью SSL . Статусная строка вашего броузера должна содержать иконку в виде замка которая показывает что страница защищена. Вот и всё.

Опубликовано в*nix

комментария 3

  1. Сергей Сергей

    Спасибо за инфу, теперь нужно только нормальный сертификат с подписями..

  2. KuLiBiN KuLiBiN

    Огромное спасибо! Заработало сразу, даже не верится =)
    Сейчас будем заказывать доверенный сертификат.

  3. Maxnag Maxnag

    Привет! Спасибо за статью, но у меня выявились побочные эффекты. Например, я настраивал на один сайт сертификат, теперь он доступен и через 80, как раньше, и через 443, это нормально, меня устраивает, но почему другие хосты прописанные в конфигах nginx стали работать по 443? В них ведь стоит слушать только 80 порт?! И вот в это проблема, мне нужно четко указать на сайт и только чтобы он работал на 443!

    Есть какие-то идеи? Заранее благодарен.

Добавить комментарий для Maxnag Отменить ответ

Ваш адрес email не будет опубликован. Обязательные поля помечены *