Создание самоподписанных сертификатов SSL для Apache в Debian

Справочник системного администратора

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

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

Самоподписанный сертификат полезен в ситуациях, когда у вашего сервера нет доменного имени, а также в случаях, когда шифрованный веб-интерфейс не предназначен для взаимодействия с пользователями. Если у вас есть доменное имя, в большинстве случае будет полезнее использовать сертификат, подписанный центром сертификации, например использовать бесплатный доверенный сертификат от Let’s Encrypt.

Шаг 1. Создание сертификата SSL

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

Мы можем сразу создать самоподписанный ключ и пару сертификатов OpenSSL с помощью одной команды:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Вам будет предложено ответить на ряд вопросов. Прежде чем перейти к этому шагу, посмотрим, что делает отправляемая нами команда:

openssl: это базовый инструмент командной строки для создания и управления сертификатами OpenSSL, ключами и другими файлами.
req: данная субкоманда указывает, что мы хотим использовать управление запросами подписи сертификатов X.509 (CSR). X.509 — это стандарт инфраструктуры открытых ключей, используемый SSL и TLS для управления ключами и сертификатами. Вы хотим создать новый сертификат X.509, и поэтому используем эту субкоманду.
-x509: это дополнительно изменяет предыдущую субкоманду, сообщая утилите, что мы хотим создать самоподписанный сертификат, а не сгенерировать запрос на подпись сертификата, как обычно происходит.
-nodes: этот параметр указывает OpenSSL пропустить опцию защиты сертификата с помощью пароля. Для чтения этого файла при запуске сервера без вмешательства пользователя нам потребуется Apache. Кодовая фраза может предотвратить это, поскольку нам придется вводить ее после каждого перезапуска.
-days 365: данный параметр устанавливает срок, в течение которого сертификат будет считаться действительным. Здесь мы устанавливаем срок действия в один год.
-newkey rsa:2048: указывает, что мы хотим генерировать новый сертификат и новый ключ одновременно. Мы не создали требуемый ключ для подписи сертификата на предыдущем шаге, и поэтому нам нужно создать его вместе с сертификатом. Часть rsa:2048 указывает, что мы создаем ключ RSA длиной 2048 бит.
-keyout: эта строка указывает OpenSSL, где мы разместим создаваемый закрытый ключ.
-out: данный параметр указывает OpenSSL, куда поместить создаваемый сертификат.

Вам будет задано несколько вопросов о вашем сервере, чтобы затем использовать эту информацию в сертификате. Укажите любые подходящие ответы. Самая важная строка — это строка, где запрашивается обычное имя (FQDN сервера или ВАШЕ имя), здесь нужно ввести либо ваше доменное имя, либо ваш публичный IP-адрес (очевидно последнее).

Диалог будет примерно таким:

Output
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]:MyCompanyName
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.com

Шаг 2. Настройка Apache для использования SSL

Файлы ключа и сертификата у нас уже есть и находятся в каталоге /etc/ssl. Для того, чтобы ими воспользоваться, необходимо изменить конфигурацию Apache.

Внесем несколько изменений в конфигурацию Apache:
1. Создадим сниппет конфигурации, чтобы задать надежные параметры SSL по умолчанию.
2. Изменим стандартный файл виртуального хоста SSL, чтобы он указывал на сгенерированные нами сертификаты.
3. Изменим незашифрованный файл виртуального хоста, чтобы он автоматически перенаправлял запросы на шифрованный виртуальный хост (по желанию).

Создание сниппета конфигурации Apache с надежными настройками шифрования

Создайте новый сниппет в каталоге /etc/apache2/conf-available с именем ssl-userconf.conf:

sudo nano /etc/apache2/conf-available/ssl-userconf.conf

Внесите в него следующую конфигурацию:

SSLCipherSuite EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH
SSLProtocol All -SSLv2 -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder On
# Disable preloading HSTS for now. You can use the commented out header line that includes
# the "preload" directive if you understand the implications.
# Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload"
Header always set X-Frame-Options DENY
Header always set X-Content-Type-Options nosniff
# Requires Apache >= 2.4
SSLCompression off
SSLUseStapling on
SSLStaplingCache "shmcb:logs/stapling-cache(150000)"
# Requires Apache >= 2.4.11
SSLSessionTickets Off

Сохраните файл комбинацией Ctrl+X и выходите из редактора.

Изменение файла виртуального хоста Apache SSL по умолчанию

Теперь изменим используемый по умолчанию файл виртуального хоста Apache SSL:

/etc/apache2/sites-available/default-ssl.conf

Перед началом рекомендую сделать резервную копию первоначального файла:

sudo cp /etc/apache2/sites-available/default-ssl.conf /etc/apache2/sites-available/default-ssl.conf.bak

Открываем файл конфигурации хоста в редакторе:

sudo nano /etc/apache2/sites-available/default-ssl.conf

Если убрать комментарии, мы должны будем увидеть следующую конфигурацию:

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin webmaster@localhost
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem
SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>

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

После внесения изменений ваш файл конфигурации виртуального хоста SSL должен выглядеть примерно так:

<IfModule mod_ssl.c>
<VirtualHost _default_:443>
ServerAdmin your_email@example.com
ServerName server_domain_or_IP
DocumentRoot /var/www/html
ErrorLog ${APACHE_LOG_DIR}/error.log
CustomLog ${APACHE_LOG_DIR}/access.log combined
SSLEngine on
SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
<FilesMatch "\.(cgi|shtml|phtml|php)$">
SSLOptions +StdEnvVars
</FilesMatch>
<Directory /usr/lib/cgi-bin>
SSLOptions +StdEnvVars
</Directory>
</VirtualHost>
</IfModule>

Сохраните файл комбинацией Ctrl+X и выходите из редактора.

Изменение файла хоста HTTP для перенаправления на HTTPS (рекомендуется)

В настоящее время сервер будет предоставлять нешифрованный трафик HTTP и шифрованный трафик HTTPS. В большинстве случаев для обеспечения безопасности рекомендуется включить автоматическое перенаправление HTTP на HTTPS. Если вы не хотите использовать эту функцию, или она вам не нужна, вы можете спокойно пропустить этот раздел.

Чтобы изменить файл нешифрованного виртуального хоста для перенаправления всего трафика для шифрования SSL, мы можем открыть файл:

sudo nano /etc/apache2/sites-available/000-default.conf

Внутри файла в блоках конфигурации VirtualHost нам нужно добавить директиву Redirect, которая должна направлять весь трафик на версию сайта с шифрованием SSL:

<VirtualHost *:80>
Redirect "/" "https://your_domain_or_IP/"
</VirtualHost>

Сохраните файл комбинацией Ctrl+X и выходите из редактора.

Шаг 3. Активация изменений в Apache

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

Для активации модуля mod_ssl необходимо выполнить команду:

sudo a2enmod ssl

Для активации модуля mod_headers необходимо выполнить команду:

sudo a2enmod headers

Теперь можно активировать виртуальный хост SSL с помощью команды:

sudo a2ensite default-ssl

Также нам нужно будет активировать файл ssl-userconf.conf для считывания заданных значений:

sudo a2enconf ssl-userconf

Мы активировали наш хост и все необходимые модули, теперь нужно проверить конфигурацию на наличие ошибок в синтаксисе. Для этого можно ввести следующую команду:

sudo apache2ctl configtest

Если проверка будет успешно пройдена, мы получим результат, выглядящий примерно так:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message
Syntax OK

Первая строка — это сообщение о том, что директива ServerName не задана глобально. Если вы хотите избавиться от этого сообщения, вы можете задать для ServerName доменное имя вашего сервера или IP-адрес в каталоге /etc/apache2/apache2.conf. Это необязательно, потому что данное сообщение носит чисто информативный характер и не сообщает о какой либо ошибке.

Если в результатах есть сообщение Syntax OK, в вашей конфигурации нет синтаксических ошибок. Мы можем безопасно перезапустить Apache для внесения изменений:

sudo systemctl restart apache2

Шаг 4. Тестирование шифрования

Теперь мы готовы протестировать наш сервер с использованием протокола https.
Откройте браузер и введите https:// и доменное имя или IP-адрес вашего сервера в адресную панель:
https://server_domain_or_IP
Поскольку созданный нами сертификат не подписан одним из доверенных центров сертификации вашего браузера, вы увидите пугающее предупреждение, которое будет выглядеть примерно так:

Такое предупреждение вполне естественное и его следует ожидать. Сертификат нам нужен только для шифрования, а не для подтверждения подлинности нашего хоста третьей стороной. Нажмите «Дополнительно», а затем нажмите на указанную ссылку, чтобы перейти к своему хосту:

Теперь должен открыться ваш сайт. Если вы посмотрите в адресную строку браузера, вы увидите символ замка со знаком «x». В данном случае это означает, что сертификат не удается проверить, но ваше соединение все равно шифруется.

Если вы настроили Apache для перенаправления HTTP на HTTPS, вы можете проверить правильность перенаправления функций:

http://server_domain_or_IP

Если при этом появляется такой же значок, перенаправление работает правильно.

Tags: