Это руководство поможет установить TLS/SSL-сертификат от Let’s Encrypt на сервер Apache в CentOS 7, а также автоматизировать обновление сертификата при помощи cron.
Сертификаты SSL нужны веб-серверам для шифрования трафика между сервером и клиентом, что обеспечивает дополнительный уровень безопасности. Центр сертификации Let’s Encrypt позволяет быстро получить и установить бесплатный сертификат.
Требования
- Предварительно настроенный сервер CentOS 7 и учётная запись не-root пользователя с доступом к sudo (инструкции по настройке можно найти здесь).
- Предварительно установленный веб-сервер Apache.
- Доменное имя; в данном руководстве используется условный домен example.com.Его нужно заменить своим доменным именем.
1: Создание виртуального хоста
Плагин Apache для Let’s Encrypt позволяет упростить процесс генерирования и установки SSL-сертификата. Для корректной работы плагина необходимо создать виртуальный хост. При этом каждому отдельному домену, на который нужно установить сертификат, нужен индивидуальный виртуальный хост.
Примечание: Если вы настроили виртуальные хосты ранее, пропустите этот раздел.
Структура каталогов
Для начала нужно создать в каталоге /etc/httpd структуру каталогов для хранения фалов виртуальных хостов.
Следуйте стандартной структуре дистрибутивов на основе Debian, которая позволяет быстро включать и отключать виртуальны хосты.
Откройте каталог настроек Apache:
cd /etc/httpd
Каталог sites-available хранит все существующие на данном сервере виртуальные хосты; создайте этот каталог:
sudo mkdir /etc/httpd/sites-available
Затем создайте каталог для хранения включенных виртуальных хостов; согласно стандартной структуре этот каталог называется sites-available и хранит только символьные ссылки на файлы включенных виртуальных хостов.
sudo nano /etc/httpd/conf/httpd.conf
После этого нужно сообщить серверу Apache, как найти файлы виртуальных хостов. Для этого нужно отредактировать главный конфигурационный файл и добавить в него строку, объявляющую каталог для дополнительных конфигурационных файлов. Откройте файл в текстовом редакторе:
sudo nano /etc/httpd/conf/httpd.conf
В конец файла нужно добавить строку:
IncludeOptional sites-enabled/*.conf
Сохраните и закройте файл.
Создание виртуального хоста
Теперь нужно создать виртуальный хост. Откройте каталог /etc/httpd/sites-available и создайте новый файл. В данном руководстве этот файл называется example.com.conf; выберите своё имя файла.
Примечание: Расширение .conf обязательно.
sudo nano /etc/httpd/sites-available/example.com.conf
Добавьте в файл такой код:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
ErrorLog /var/log/apache/example.com/error.log
</VirtualHost>
Примечание: Не забудьте заменить условные данные своими.
Сохраните и закройте файл.
Вышеприведённый код состоит из следующих директив:
- ServerName: доменное имя.
- ServerAlias (опционально): алиасы доменного имени; как правило, в качестве алиаса используется домен с префиксом www.
- DocumentRoot: главный каталог сайта, хранящий все его файлы. По умолчанию главным каталогом Apache в системе CentOS 7 является /var/www/html, однако вы можете выбрать любой другой каталог.
- ErrorLog (опционально): пользовательский каталог для хранения логов ошибок данного виртуального хоста. Если не добавить опцию в файл, Apache будет использовать стандартный лог ошибок /var/log/httpd/error_log.
Включение виртуального хоста
Виртуальный хост готов к работе, но не включен, потому пока что Apache не поддерживает его. Чтобы включит виртуальный хост, нужно создать символьную ссылку в каталоге sites-enabled, указывающую на новый виртуальный хост. Запустите команду:
sudo ln -s /etc/httpd/sites-available/example.com.conf /etc/httpd/sites-enabled/example.com.conf
Чтобы отключить обслуживание виртуального хоста, нужно просто удалить символьную ссылку из каталога sites-enabled и перезапустить Apache. При этом файл виртуального хоста удалять не нужно.
Если данный домен был настроен как главный домен сайта Apache в файле httpd.conf, нужно удалить эту настройку, чтобы избежать неожиданного поведения сервера при генерировании сертификата SSL.
Откройте /etc/httpd/conf/httpd.conf и найдите директивы ServerName и ServerAlias; если они указывают на один домен, заданный в виртуальном хосте, нужно закомментировать их, добавив знак # в начале строки:
sudo nano /etc/httpd/conf/httpd.conf
# ServerName gives the name and port that the server uses to identify itself.
# This can often be determined automatically, but we recommend you specify
# it explicitly to prevent problems during startup.
#
# If your host doesn't have a registered DNS name, enter its IP address here.
#
#ServerName example.com:80
#ServerAlias www.example.com
Теперь осталось только перезапустить Apache:
sudo systemctl restart httpd
Примечание: Подробный мануал по настройке виртуальных хостов Apache можно найти здесь.
2: Установка зависимостей
Прежде чем приступить к установке клиента Let’s Encrypt и созданию сертификата SSL, нужно установить несколько зависимостей.
Для начала добавьте репозиторий EPEL:
sudo yum install epel-release
Для загрузки клиента Let’s Encrypt понадобится git:
sudo yum install git
Для работы скрипта обновления сертификата необходим инструмент bc (он рассчитывает дату истечения срока действия сертификата). Чтобы установить его, выполните:
sudo yum install bc
3: Загрузка клиента Let’s Encrypt
Теперь можно загрузить клиент Let’s Encrypt из официального репозитория.
Поскольку клиент Let’s Encrypt еще находится в бета-версии, его, вероятно, придётся часто обновлять, чтобы исправить баги и получить доступ к новой функциональности.
Клонируйте репозиторий Let’s Encrypt в каталог /opt, предназначенный для хранения дополнительных пакетов системы.
sudo git clone https://github.com/letsencrypt/letsencrypt /opt/letsencrypt
На сервере появится локальная копия официального репозитория Let’s Encrypt в каталоге /opt/letsencrypt.
4: Создание SSL-сертификата
Процесс генерирования SSL-сертификата для Apache с помощью клиента Let’s Encrypt довольно прост. Клиент автоматически получит и установит сертификат, валидный для всех доменов, указанных в качестве аргументов.
Откройте каталог letsencrypt:
cd /opt/letsencrypt
Чтобы запустить интерактивную установку и получить сертификат для одного домена, выполните команду:
./letsencrypt-auto --apache -d example.com
Примечание: Замените условный домен example.com своим доменным именем.
Чтобы получить один сертификат для нескольких доменов и поддоменов, укажите их как дополнительные параметры в команде. В таком случае первый домен в списке будет базовым; потому рекомендуется начинать список с самого домена, а уже затем указывать дополнительные поддомены или алиасы. Например:
./letsencrypt-auto --apache -d example.com -d www.example.com
В этом примере основным доменом будет example.com. Эта информация понадобится в дальнейшем для автоматизации обновлений сертификата.
После установки зависимостей программа предоставит пошаговые инструкции для пользовательской настройки сертификата. Вам будет предложено предоставить адрес электронной почты для восстановления потерянного ключа и получения уведомлений, а также включить http и https.
Если установка прошла успешно, на экране появится следующее сообщение:
IMPORTANT NOTES:
- If you lose your account credentials, you can recover through
e-mails sent to user@example.com.
- Congratulations! Your certificate and chain have been saved at
/etc/letsencrypt/live/example.com/fullchain.pem. Your cert
will expire on 2016-04-21. To obtain a new version of the
certificate in the future, simply run Let's Encrypt again.
- Your account credentials have been saved in your Let's Encrypt
configuration directory at /etc/letsencrypt. You should make a
secure backup of this folder now. This configuration directory will
also contain certificates and private keys obtained by Let's
Encrypt so making regular backups of this folder is ideal.
- If you like Let's Encrypt, please consider supporting our work by:
Donating to ISRG / Let's Encrypt: https://letsencrypt.org/donate
Donating to EFF: https://eff.org/donate-le
После завершения установки сгенерированный сертификат появится в /etc/letsencrypt/live.
Систематизация виртуальных хостов
Во время создания сертификата плагин Apache для Let’s Encrypt автоматически создаст новый виртуальный хост для поддержки доступа https. Однако этот файл будет помещён в каталог sites-enabled, а этот каталог не должен содержать ничего кроме символьных ссылок.
Чтобы сохранить правильную структуру файлов виртуальных хостов, нужно переместить новый файл в каталог sites-available и создать символьную ссылку на него в каталоге sites-enabled:
sudo mv /etc/httpd/sites-enabled/example.com-le-ssl.conf /etc/httpd/sites-available/example.com-le-ssl.conf
sudo ln -s /etc/httpd/sites-available/example.com-le-ssl.conf /etc/httpd/sites-enabled/example.com-le-ssl.conf
Содержимое каталога sites-enabled будет выглядеть так:
lrwxrwxrwx 1 root root 48 Jan 25 12:37 example.com.conf -> /etc/httpd/sites-available/example.com.conf
lrwxrwxrwx 1 root root 55 Jan 25 12:44 example.com-le-ssl.conf -> /etc/httpd/sites-available/example.com-le-ssl.conf
Чтобы обновить настройки, перезапустите Apache:
sudo systemctl restart httpd
Состояние сертификата
Проверить состояние сертификата можно по следующей ссылке (вместо условного домена укажите своё базовое доменное имя):
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
5: Автоматическое обновление
Сертификаты Let’s Encrypt действительны в течение 90 дней, но во избежание ошибок их рекомендуется обновлять каждые 60 дней. На момент написания статьи клиент не оборудован функцией автоматического обновления сертификатов. Этот процесс можно выполнить вручную, просто запустив клиент Let’s Encrypt с использованными ранее параметрами.
Чтобы вручную обновить сертификат Let’s Encrypt для Apache, отключив интерактивный режим, введите:
./letsencrypt-auto certonly --apache --renew-by-default -d example.com -d www.example.com
Если при первом запуске команды (для установки сертификата) вы задали несколько доменных имен, при обновлении вы должны задать точно тот же список доменов, в противном случае клиент сгенерирует новый сертификат вместо обновления существующего.
Надёжный способ обеспечить своевременное обновление сертификата – это демон cron.
Для облегчения этого процесса можно использовать скрипт, который будет проверять дату истечения срока действия сертификата и запускать обновление, если до истечения срока остаётся менее 30 дней.
Скрипт будет автоматически запускаться один раз в неделю. Таким образом, в случае сбоя cron у вас будет в запасе 30 дней, чтобы снова попытаться обновить сертификат.
Загрузите скрипт и сделайте его исполняемым; предварительно можно просмотреть его содержимое.
sudo curl -L -o /usr/local/sbin/le-renew http://do.co/le-renew-centos
sudo chmod +x /usr/local/sbin/le-renew
Скрипт le-renew использует базовый домен в качестве аргумента. Узнать, какой домен является базовым, можно в /etc/letsencrypt/live (в этом каталоге хранятся генерированные сертификаты).
Чтобы запустить скрипт вручную, введите:
sudo le-renew example.com
Поскольку текущий сертификат был создан только что, у скрипта нет необходимости обновлять его и он просто сообщит, сколько дней осталось до истечения срока действия сертификата:
Checking expiration date for example.com...
The certificate is up to date, no need for renewal (89 days left).
После этого нужно отредактировать crontab и добавить в таблицу новую команду, которая будет запущена раз в неделю.
sudo crontab -e
Затем добавьте следующую строку:
30 2 * * 1 /usr/local/sbin/le-renew example.com >> /var/log/le-renew.log
Сохраните и закройте файл. Теперь cron будет запускать команду le-renew каждый понедельник в 2:30 ночи, а вывод команды будет помещён в лог /var/log/le-renewal.log.
Примечание: Больше информации о работе cron можно получить в статье «Автоматизация задач с помощью cron».
6: Обновление клиента Let’s Encrypt (опционально)
После выхода обновлений для клиента Let’s Encrypt можно обновить локальную копию при помощи команды:
cd /opt/letsencrypt
sudo git pull
Эта команда загрузит все обновления клиента.
Заключение
Теперь веб-сервер Apache защищён при помощи SSL-сертификата Let’s Encrypt. Не забывайте о том, что клиент Let’s Encrypt до сих пор находится в бета-версии, потому очень важно следить за выходом обновлений и своевременно устанавливать их.