Настройка ssl в apache на CentOS

Хочу поделиться небольшой информацией о том, как настроить ssl подключение в apache на сервере с CentOS и перевести сайты с http на https. Делается это не сложно, но есть пара нюансов.

Онлайн-курс по устройству компьютерных сетей

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Недавно я уже рассказывал о том как получить бесплатный ssl сертификат для подтверждения доменного имени. Мы его использовали для организации ssl/tls соединений в почтовом сервере. Теперь его же мы будем использовать для того, чтобы перевести наш сайт на работу по ssl протоколу.

О том, как получить бесплатный сертификат от let's encrypt и настроить apache на работу с ним читайте в моей статье по настройке web сервера apache на centos 8.

Установка mod_ssl в apache

В качестве сервера у нас выступает apache на CentOS, хотя это не принципиально, настройка на других linux дистрибутивах будет идентичной. Рабочим web сервером является apache. Использовать ssl протокол в apache мы будем с помощью мода mod_ssl. Первым делом проверим, установлен ли он:

# rpm -qa | grep mod_ssl

Если нет, то устанавливаем:

# yum -y install mod_ssl

После установки мода, идем в директорию /etc/httpd/conf.d и правим там файл настроек ssl.conf. Прописываем пути к сертификатами в директивах SSLCertificateFile и SSLCertificateKeyFile.

Создание виртуального хоста с поддержкой ssl

Далее необходимо либо создать новый виртуальный хост apache, либо отредактировать существующий в файле /etc/httpd/conf/httpd.conf. Добавляем в конец файла:

<VirtualHost *:443>
 SSLEngine on
 SSLCertificateFile /root/cert/zeroxzed.ru.crt
 SSLCertificateKeyFile /root/cert/zeroxzed.ru.kye
 <Directory /var/www/vhosts/zeroxzed.ru/www>
 AllowOverride All
 </Directory>
 DocumentRoot /var/www/vhosts/zeroxzed.ru/www
 ServerName zeroxzed.ru
 </VirtualHost>

После сохранения проверяем конфигурацию apache:

# httpd -t

Если появляется предупреждение:

[warn] _default_ VirtualHost overlap on port 443, the first has precedence

То ищем в /etc/httpd/conf/httpd.conf строчку NameVirtualHost *:80 и добавляем после нее NameVirtualHost *:443

Снова проверяем. Если ошибок нет, перезапускаем апач и заходим на сайт, прописав в адресной строке https, вместо http. Теперь ваш сайт доступен по протоколу https. Но пользователи сайта могут об этом не знать. Было бы разумным сделать переадресацию с открытого протокола на защищенный. Сделаем это.

Переадресация с http на https

Для того, чтобы сделать автоматическую переадресацию с http на https, необходимо в описании виртуального хоста в httpd.conf добавить порт 80 вместе с 443:

<VirtualHost *:80 *:443>

И в корне сайта с помощью .htaccess и mod_rewrite делаем перенаправление всех запросов с http на https:

# cat .htaccess
RewriteEngine On
 RewriteCond %{HTTPS} off
 RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI}

Теперь даже если просто набрать адрес сайта с http откроется его защищенная версия https. Не забудьте проверить, включен ли у вас модуль mod_rewrite в настройках apache. И проверьте фаервол. Для корректной работы сайта по протоколу https необходимо открыть 443 порт на веб сервере.

Онлайн-курс по устройству компьютерных сетей.

На углубленном курсе "Архитектура современных компьютерных сетей" вы с нуля научитесь работать с Wireshark и «под микроскопом» изучите работу сетевых протоколов. На протяжении курса надо будет выполнить более пятидесяти лабораторных работ в Wireshark.

Помогла статья? Подписывайся на telegram канал автора

Анонсы всех статей, плюс много другой полезной и интересной информации, которая не попадает на сайт.

Автор Zerox

Владимир, системный администратор, автор сайта. Люблю настраивать сервера, изучать что-то новое, делиться знаниями, писать интересные и полезные статьи. Открыт к диалогу и сотрудничеству. Если вам интересно узнать обо мне побольше, то можете послушать интервью. Запись на моем канале - https://t.me/srv_admin/425 или на сайте в контактах.

17 комментариев

  1. Спасибо помогло!

  2. Надо бы исправить zeroxzed.ru.kye -> zeroxzed.ru.key
    Хотя все равно никто не замечает.

  3. Здравствуйте не подскажите можно ли получить сертификат lets encrypt если например будет два сервера с внешними ip и при этом один плавающий будет на два сервера, доменное имя к нему будет прикручено к плавающему ip?

    • Можно. Сервер же клиентам все равно будет отвечать с какого-то ip. Let's encrypt во время выпуск сертификата делает проверку обычным запросом на web сервер.

  4. Для чего прописывать дважды SSLCertificateFile и SSLCertificateKeyFile, сначала в ssl.conf а потом в VirtualHost?
    попробовал удалить из VirtualHost, рабоает, но не наоборот. А если на сервере несколько доменов?

    • Зачем дважды? В статье у меня этого нет. Есть глобальные настройки для всех виртуальных хостов, а есть настройки конкретного виртуального хоста. Настраивают обычно каждый виртуальный хост в отдельности, так как сертификаты для них уникальные.

  5. День добрый!
    Прекрасно зашли ваши установка CentOS и LAMP, а вот тут ну никак. Вероятно, я чего-то недопонимаю. Хочу мигрировать с Ubuntu на CentOS с имеющимися сайтами и сертификатами.
    Можно как-то по-подробнее, с нюансами?

    • А в чем проблема? Тут фактически надо только указать сертификат в конфиге и все. Нюансов нет.

      • Да, действительно. Ложная тревога. На второй день нашел пару своих ошибок и одно небольшое недопонимание. Всё ок. Спасибо за Ваши статьи.

  6. Аноним

    Стиль изложения - 5 баллов! Четко и по существу. Спасибо.

  7. А как на Zabbix 4 с Centos 7 сделать https? Можете расписать подробно пожалуйста

    • Так же как и везде в апаче. Заббикс никаких нюансов не приносит - это обычный сайт на php.

    • 1. Ставим ссльный мод: yum install mod_ssl
      2. Создаем дериктории под ключи: mkdir -p /etc/httpd/ssl/private
      chmod 700 /etc/httpd/ssl/private
      3. Создаем сертификат: openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/httpd/ssl/private/apache-selfsigned.key -out /etc/httpd/ssl/apache-selfsigned.crt Далее проходим простенький мастер создания сертификата
      4. Отредактировать апачевский конф файл ссл: /etc/httpd/conf.d/ssl.conf Строки: DocumentRoot "/usr/share/zabbix"
      ServerName example.com:443
      SSLCertificateFile /etc/httpd/ssl/apache-selfsigned.crt
      SSLCertificateKeyFile /etc/httpd/ssl/private/apache-selfsigned.key
      5. systemctl restart httpd.service
      6. Далее редактируем httpd.conf
      ServerName zbx
      DocumentRoot /usr/share/zabbix/
      Redirect permanent /secure https://zbx

      SSLEngine on
      SSLCertificateFile /etc/httpd/ssl/apache-selfsigned.crt
      SSLCertificateKeyFile /etc/httpd/ssl/private/apache-selfsigned.key
      ServerName zbx
      DocumentRoot /usr/share/zabbix/

      7. systemctl restart httpd.service
      Теперь заббикс должен открывается по https и редиректит обращения на http туда же.

    • to Jhony коммент выше

  8. ssl.conf покажите чем должен быть заполнен этот файл в виде примера

  9. Спасибо! Доходчиво написано. Сэкономил на сертификате.

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

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

Нажимая кнопку "Отправить комментарий" Я даю согласие на обработку персональных данных.
Используешь Telegram? Подпишись на канал автора →
This is default text for notification bar