Создание самоподписанного SSL-сертификата для Apache в CentOS 8
Centos | Комментировать запись
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: Apache, CentOS, CentOS 8, mod_ssl, SSL, TLS