Создание самоподписанного SSL-сертификата для Apache в CentOS 8

TLS (Transport Layer Security) и его предшественник SSL (Secure Socket Layers) – это криптографические протоколы, которые используются для защиты данных, передаваемых в Интернете. Эта технология позволяет защитить обмен данными между сервером и клиентом и предотвратить перехват или несанкционированный доступ к передаваемой информации. Кроме того, эти протоколы предоставляют систему сертификатов, которая помогает пользователям проверить подлинность сайтов, на которые они заходят.

Данный мануал поможет создать самоподписанный SSL-сертификат для веб-сервера Apache в CentOS 8.

Примечание: Самоподписанный сертификат не сможет подтвердить подлинности сервера, так как он не подписан проверенным центром сертификации (ЦС); тем не менее, такой сертификат позволит шифровать взаимодействие с веб-клиентами. Самоподписанный сертификат подходит пользователям, у которых пока что нет доменного имени. При наличии домена рекомендуется обратиться за подписью сертификата к одному из надёжных ЦС. Также можно получить бесплатный доверенный сертификат от сервиса Let’s Encrypt.

Читайте также: Создание сертификата Let’s Encrypt для Apache в CentOS 8

Требования

  • Сервер CentOS 8, настроенный согласно этому мануалу. Чтобы начать работу над сертификатом, войдите на сервер как пользователь sudo.
  • Предварительно установленный веб-сервер Apache. Можно установить стек LAMP, одним из компонентов которого является Apache (для этого следуйте руководству Установка стека LAMP в CentOS 8). Также для установки веб-сервера можно использовать эти команды:

sudo dnf install httpd
# включить Apache и добавить его в автозагрузку:
sudo systemctl enable httpd
sudo systemctl start httpd
# настроить firewalld:
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

1: Установка mod_ssl

Для начала установите mod_ssl, модуль Apache, который обеспечивает поддержку шифрования SSL.

Для этого используйте dnf:

sudo dnf install mod_ssl

Из-за бага в пакете нам нужно перезапустить Apache, чтобы он правильно сгенерировал стандартный SSL-сертификат и ключ, иначе вы получите ошибку «’/etc/pki/tls/certs/localhost.crt’ does not exist or is empty».

sudo systemctl restart httpd

2: Создание SSL-сертификата

Для работы TLS/SSL использует комбинацию открытого сертификата и закрытого ключа. Закрытый ключ хранится на сервере и не разглашается. SSL-сертификат используется открыто и доступен всем пользователям, запрашивающим контент.

Чтобы создать самоподписанный сертификат и ключ, запустите команду:

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

Команда задаст вам ряд вопросов. Давайте рассмотрим компоненты команды подробнее:

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

Заполните появившиеся поля данными о сервере, которые будут отображаться в сертификате.

Самой важной строкой является Common Name (введите FQDN или свое имя). Как правило, в эту строку вносят доменное имя, с которым нужно связать сервер. В случае если доменного имени нет, внесите в эту строку IP-адрес сервера. В целом эти поля выглядят примерно так:

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com

Файлы ключа и сертификата будут помещены в каталог /etc/pki/tls. Это стандартный каталог для хранения подобных файлов в CentOS.

3: Настройка Apache для поддержки SSL

Итак, на данном этапе файлы ключа и сертификата готовы. Теперь нужно отредактировать настройки Apache, чтобы он мог использовать их. В CentOS вы можете поместить новые файлы Apache (с обязательным расширением .conf) в /etc/httpd/conf.d, и они будут загружены во время следующего перезапуска Apache

В этом мануале мы создадим базовый файл конфигурации. Если у вас уже настроен Apache <Virtual host> и вам нужно только добавить в него SSL, можете просто скопировать конфигурации, начинающиеся с SSL, и изменить порт VirtualHost с 80 на 443.

Откройте новый файл в каталоге /etc/httpd/conf.d:

sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf

Вставьте в него такие строки:

<VirtualHost *:443>
ServerName your_domain_or_ip
DocumentRoot /var/www/ssl-test
SSLEngine on
SSLCertificateFile /etc/pki/tls/certs/apache-selfsigned.crt
SSLCertificateKeyFile /etc/pki/tls/private/apache-selfsigned.key
</VirtualHost>

Обязательно обновите строку ServerName, указав в ней, как вы хотите обращаться к своему серверу. Это может быть имя хоста, полное доменное имя или IP-адрес. Это значение должно совпадать со значением Common Name, которое вы выбрали при создании сертификата.

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

Теперь давайте создадим наш DocumentRoot и поместим в него HTML-файл для тестирования:

sudo mkdir /var/www/ssl-test

Откройте новый файл index.html в текстовом редакторе:

sudo vi /var/www/ssl-test/index.html

Вставьте в этот пустой файл следующее:

<h1>it worked!</h1>

Конечно, это не полноценный HTML-файл, но этого будет достаточно для проверки нашей конфигурации.

Сохраните и закройте файл, затем проверьте конфигурацию Apache на наличие синтаксических ошибок с помощью команды:

sudo apachectl configtest

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

Когда все будет в порядке, перезагрузите Apache, чтобы принять изменения конфигурации:

sudo systemctl reload httpd

Теперь откройте ваш сайт в браузере с https://.

Вы должны увидеть ошибку. Это нормальное поведение браузера в подобной ситуации, поскольку он не может проверить подлинность хоста. Однако в данном случае нужно только шифровать трафик, с чем самоподписанный сертификат вполне справляется, потому предупреждение браузера можно пропустить. Для этого нажмите кнопку advanced или more information.

После этого браузер выведет сообщение «it worked!».

Примечание: Если ваш браузер вообще не подключается к серверу, убедитесь, что ваше соединение не заблокировано брандмауэром. Если вы используете firewalld, введите следующие команды, чтобы открыть порты 80 и 443:

sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

4: Настройка переадресации HTTP на HTTPS

На данный момент поддерживает только HTTPS по порту 443. Для более надёжной защиты сервера рекомендуется вообще отключить незашифрованный трафик HTTP.

Отредактируйте виртуальный хост, разрешающий HTTP-трафик, и настройте переадресацию. Откройте файл:

sudo vi /etc/httpd/conf.d/your_domain_or_ip.conf

В конце найдите блок VirtualHost для порта 80. В директиву ServerName внесите ваш домен или IP. Затем добавьте директиву Redirect, которая будет переадресовывать весь незашифрованный трафик:

<VirtualHost *:80>
ServerName your_domain_or_ip
Redirect / https://your_domain_or_ip/
</VirtualHost>

Сохраните и закройте файл.

Проверьте синтаксис файла и перезагрузите веб-сервер:

sudo apachectl configtest
sudo systemctl reload httpd

Чтобы убедиться, что переадресация работает, попробуйте открыть сайт с префиксом http://. Вы должны автоматически попадать на https://.

Заключение

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

Конечно, при разработке сайта рекомендуется подписать SSL-сертификат в надежном центре сертификации, что позволит избежать появления отпугивающих предупреждений. Рекомендуем вам обратиться к надежному центру сертификации, например, к Let’s Encrypt.

Читайте также: Создание сертификата Let’s Encrypt для Apache в CentOS 8

Tags: , , , , ,

Добавить комментарий