Создание самоподписного SSL-сертификата и настройка хоста Apache 2 для работы по https

Внимание! Для новых версий Ubuntu (начиная с 10.04+ и вплоть до актуальной Ubuntu 12.04 LTS) существует и уже представлен у нас на сайте более простой способ создания самоподписного SSL-сертификата для Apache2. Но и эту статью мы оставляем на сайте в виду ряда полезных комментариев.

Великий веб-сервер Apache 2 умеет работать по защищенному протоколу https в рамках которого всё передаваемая информация шифруется сервером и клиентом по криптографическому протоколу SSL. Это значит, что даже перехвативший запросы клиента и страницы возвращаемые сервером — не сможет посмотреть содержание этих запросов и этих страниц. Как минимум, все эти данные постоянно оседают у провайдера и если, например, его гнусный сотрудник захочет, то легко узнает те пароли, которые вы отправляете на многие сайты в POST- или GET-запросах.

Для собственного сервера вам, как минимум, следует беречь пароли от баз данных, вбвиаемые в веб-морду phpMyAdmin.

Для того, чтобы организовать шифрованную передачу по протоколу SSL требуется специальный сертификат на сервере. Его подтверждают (обычно за деньги) всякие серьёзные центры по сертификации. Но можно сгененрировать сертификат и самостоятельно — такой сертификат называется самоподписным, потому что никакой центр аттестации его не подтверждает, а подтверждаете лично вы.

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

Всего-то придётся успокоить браузер, при попытке первого соединения с хостом, зашифрованным самоподписным сертификатом, разок взглянув на примерно такое окошко:

Что, конечно, критично для неосведомлённых посетителей (тем более, если ваш сайт ориентирован далеко не на гиков), но годно — для вас лично или для команды разработчиков, коллег и пр. Так вот о том, как на своём сервере за несколько минут для нужного хоста настроить SSL с самоподписным сертификатом — далее и пойдёт речь.

Активируем соответствующий модуль Apache2, сделать это в любимом дистрибутиве можно так:
sudo a2enmod ssl

Создаём свой ключ для шифрования:
sudo openssl genrsa -des3 -out server.key 1024

В конце потребуется пару раз ввести (задать и подтвердить) пароль для вашего ключа. Тут всё стандартно: не забывайте свой пароль, но и не записывайте его на стикере в углу монитора. Минимально допустимая длина пароля тут — 4 символа, но рекомендуется задать пароль в 8+ символов, да такой, чтоб он содержал буквы разных регистров и цифры.

Можно создать не шифрованную копию ключа вот так:
sudo openssl rsa -in server.key -out server.key.insecure

И для удобства это лучше сделать: иначе при каждой (ре-)активации хоста с SSL потребуется вводить пароль.

Плюс вот в чём: не придётся вводить пароль при запуске сервера.

Создав не шифрованную копию, давайте далее использовать именно её, поэтому совершим пару переименований (в результате которых, ключ с паролем окажется в файле server.key.secure и далее нами использоваться не будет):
sudo mv server.key server.key.secure
sudo mv server.key.insecure server.key

Теперь будем создавать CSR, это тоже просто:
sudo openssl req -new -key server.key -out server.csr

Вас попросят сообщить информацию о себе, в принципе (поскольку сертификат мы создаём самоподписной) можно ничего не сообщать, тупо вводя пустые ответы. Но если вы захотите получить «настоящий» сертификат CA, то все данные, конечно, надо заполнить, притом указывая достоверные значения.

Но перейдём к процессу самоподписания:
sudo openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

Сертификат на этом, кстати, готов. Теперь надо скопировать файлы куда положено (чтоб их увидел Apache2) и настроить на обработку ssl сам веб-сервер.

Копируем ключи:
sudo cp server.crt /etc/ssl/certs
sudo cp server.key /etc/ssl/private

Теперь настроим на использование SSL виртуальный хост, я сделаю это с хостом по умолчанию, который обязательно доступен сразу после установки Apache.

Теперь нам потребуется создать виртуальный хост, который будет поддерживать SSL. Итак, для начала создадим конфигурационный файл:
sudo nano /etc/apache2/sites-available/example

И разместим туда примерно такую конфигурацию хоста:
ServerAdmin root@domain.tld ServerName domain.tld ServerAlias www.domain.tld DocumentRoot /var/www/example/public_html Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all ErrorLog /var/www/example/error.log CustomLog /var/www/example/access.log combined ServerAdmin root@domain.tld ServerName domain.tld ServerAlias www.domain.tld DocumentRoot /var/www/example/public_html SSLEngine on SSLOptions +FakeBasicAuth +ExportCertData +StrictRequire SSLCertificateFile /etc/ssl/certs/server.crt SSLCertificateKeyFile /etc/ssl/private/server.key Options Indexes FollowSymLinks MultiViews AllowOverride All Order allow,deny allow from all ErrorLog /var/www/example/error.log CustomLog /var/www/example/access.log combined

Корнем сайта при этом будет директория /var/www/example/public_html, логи будут храниться в директории /var/www/example, а обслуживаться хостом будет домен domain.tld.

Вы уже, наверное, отметили для себя, чтоб для обычного http-соединения по 80 порту и для защищённого https-соединения по 443 порту создано два отдельных виртуальных хоста, во второй из хостов, соответственно, добавлены директивы для активации ssl, а остальные настройки совпадают. Но, в общем случае, настройки могли и различаться, т.е., грубо говоря, на одном домене но по разным протоколам (http или https) могут размещаться совершенно разные сайты.

И ещё есть такой нюанс: если вы собираетесь для нескольких виртуальных хостов на своём сервере использовать ssl, то описывать все хосты надо в отдельных файлах, т.е. для данного примера следовало бы создать /etc/apache2/sites-available/example и отдельно /etc/apache2/sites-available/example-ssl, описав по одному виртуальному хосту в каждом, а в файл /etc/apache2/apache2.conf надо добавить такую строку (например, в самый конец):

NameVirtualHost *:443

Иначе можете встретить такую примерно ругань от Apache: [warn] _default_ VirtualHost overlap on port 443, the first has precedence

Итак, сохраняем файл.

Активируем наш новый хост:
sudo a2ensite example

Теперь научим Apache ждать соединение на стандартном для SSL порту 443, для этого отправимся редактировать файл:
sudo nano /etc/apache2/ports.conf

Теперь надо осмотреться, если там уже есть блок подобный этому:
    Listen 443

Тогда никаких правок вносить не надо (при включение модуля ssl веб-сервер сам начнёт слушать нужный нам порт).

А вот если похожего блока нет, то добавляйте его в конец файла.

Сохраняем (если вносили изменения) или закрываем файл (в nano это можно сделать кнопкой F2).

Перезапускам веб-сервер:
apache2ctl restart

Всё, можно пробовать заглянуть на свой хост по https.

»

Оцените статью
Про Ubuntu — блог о популярном СПО GNU/Linux-дистрибутиве Ubuntu (Убунту Линукс)