Создание сертификата Let’s Encrypt для Apache в Debian 8
Данное руководство поможет настроить TLS/SSL сертификат Let’s Encrypt для Apache на сервере Debian 8 и автоматизировать его обновление.
SSL-сертификаты необходимы веб-серверам для шифрования трафика между сервером и клиентом, что повышает безопасность данных пользователей и приложения. Сервис Let’s Encrypt позволяет быстро и просто получить такой сертификат.
Требования
- Предварительно настроенный сервер Debian 8 (инструкции по настройке – в этой статье).
- Пользователь с доступом к sudo.
- Доменное имя (в руководстве используются условные домены example.com и www.example.com).
- Запись А, связывающая домен с внешним IP-адресом сервера. Она необходима для того, чтобы Let’s Encrypt мог проверить доменное имя (в руководстве используется два домена, нужно создать запись А для каждого из них).
1: Установка клиента certbot
Сначала нужно установить certbot. Это клиент Let’s Encrypt, который позволяет получить SSL-сертификат.
Пакета certbot нет в официальном репозитории Debian 8. Загрузить пакет certbot можно из backports-репозитория Jessie.
Добавьте этот репозиторий:
echo 'deb http://ftp.debian.org/debian jessie-backports main' | sudo tee /etc/apt/sources.list.d/backports.list
Обновите индекс пакетов:
sudo apt-get update
Теперь можно установить пакет python-certbot-apache.
Примечание: Backports-репозитории не рекомендуется использовать для общесистемных обновлений. Устанавливайте только необходимые вам пакеты. Backports-пакеты менее совместимы, чем пакеты из основных репозиториев.
Чтобы избежать случайной установки или обновления пакетов из backports-репозитория, используйте флаг –t перед именем репозитория.
sudo apt-get install certbot -t jessie-backports
Клиент certbot готов к работе.
2: Настройка Apache
Домены, для которых предназначен сертификат, можно передать утилите certbot в качестве аргументов. Однако certbot также может прочитать их в конфигурационном файле Apache. Для этого укажите домен в директиве ServerName, а поддомен – в ServerAlias.
Если сервер Apache не был установлен ранее, он был включен в установку пакета python-certbot-apache. Откройте виртуальный хост по умолчанию:
sudo nano /etc/apache2/sites-available/000-default.conf
Добавьте в файл директиву ServerName и укажите в ней доменное имя. Альтернативные или дополнительные домены, которые должен обслуживать сервер, нужно добавить в директиву ServerAlias.
Настройки выглядят примерно так:
<VirtualHost *:80>
. . .
ServerName example.com
ServerAlias www.example.com
. . .
</VirtualHost>
Чтобы сохранить и закрыть файл, нажмите CTRL+X, Y и Enter.
Проверьте файл на наличие ошибок:
sudo apache2ctl configtest
Команда должна вернуть:
Syntax OK
Если в файле обнаружены ошибки, исправьте их. Затем перезапустите веб-сервер:
sudo systemctl restart apache2
3: Настройка брандмауэра
Если вы включили брандмауэр, нужно разблокировать трафик SSL.
Примечание: Если брандмауэр отключен, можете пропустить этот раздел.
Брандмауэр UFW
Чтобы просмотреть текущие правила UFW, введите:
sudo ufw status
Если список правил выглядит так, то брандмауэр пропускает только трафик HTTP:
Status: active
To Action From
-- ------ ----
SSH ALLOW Anywhere
SSH (v6) ALLOW Anywhere (v6)
Чтобы разблокировать трафик HTTPS, включите поддержку профиля WWW Full.
sudo ufw allow 'WWW Full'
Теперь список правил выглядит так:
sudo ufw status
Status: active
To Action From
-- ------ ----
SSH ALLOW Anywhere
WWW Full ALLOW Anywhere
SSH (v6) ALLOW Anywhere (v6)
WWW Full (v6) ALLOW Anywhere (v6)
Теперь брандмауэр поддерживает трафик HTTPS.
Брандмауэр iptables
Чтобы просмотреть текущий набор правил iptables, введите:
sudo iptables -S
На экране появится список правил. Например:
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Какие правила нужно добавить, чтобы настроить поддержку SSL, зависит от текущих правил брандмауэра. Если вы используете базовый набор правил, используйте такое правило:
sudo iptables -I INPUT -p tcp --dport 443 -j ACCEPT
Просмотрите правила. Теперь они выглядят так:
sudo iptables -S
-P INPUT DROP
-P FORWARD ACCEPT
-P OUTPUT ACCEPT
-A INPUT -p tcp -m tcp --dport 443 -j ACCEPT
-A INPUT -i lo -j ACCEPT
-A INPUT -m conntrack --ctstate RELATED,ESTABLISHED -j ACCEPT
-A INPUT -p tcp -m tcp --dport 22 -j ACCEPT
-A INPUT -p tcp -m tcp --dport 80 -j ACCEPT
Если правила iptables загружаются автоматически вместе с сервером, добавьте в эту настройку и новое правило.
4: Создание SSL-сертификата
Сгенерируйте SSL-сертификат для Apache при помощи загруженного клиента Let’s Encrypt. Это довольно просто. Клиент автоматически получит и установит сертификат SSL, валидный для доменов, указанных в конфигурационном файле Apache
Чтобы запустить интерактивную установку и получить сертификат для всех этих доменов, запустите следующую команду:
sudo certbot --apache
Утилита certbot прочитает настройки Apache, найдёт все необходимые домены и создаст сертификат для них. Позже вы сможете удалить некоторые домены из списка, и сертификат не будет распространяться на них.
Клиент предоставит пошаговые инструкции по настройке сертификата. Программа предложит указать адрес электронной почты (на случай если ключ будет утерян).
Также можно включить доступ http и https или настроить переадресацию всех запросов на https.
Примечание: Переадресация трафика на https рекомендуется в большинстве случаев.
После завершения установки сертификат будет помещен в /etc/letsencrypt/live. Проверьте состояние SSL-сертификата с помощью следующей ссылки:
https://www.ssllabs.com/ssltest/analyze.html?d=example.com&latest
Примечание: Замените example.com своим доменом.
Проверка может занять несколько минут. Вы получите доступ к сайту по https.
5: Автоматическое обновление
Сертификаты Let’s Encrypt действительны в течение 90 дней, но обновление рекомендуется выполнять заранее (например, через 60 дней использования сертификата). Клиент Let’s Encrypt предоставляет команду renew, которая проверяет текущий сертификат и обновляет его, если до даты его истечения остаётся меньше 30 дней.
Чтобы настроить обновление для всех существующих доменов, запустите:
sudo certbot renew
Поскольку сертификат был получен только что, команда не станет обновлять его. Она просто сообщит, что данный сертификат пока что не нуждается в обновлении.
Saving debug log to /var/log/letsencrypt/letsencrypt.log
-------------------------------------------------------------------------------
Processing /etc/letsencrypt/renewal/example.com.conf
-------------------------------------------------------------------------------
Cert not yet due for renewal
The following certs are not due for renewal yet:
/etc/letsencrypt/live/example.com/fullchain.pem (skipped)
No renewals were attempted.
Обратите внимание: если вы создали один сертификат для нескольких доменов, в выводе команды будет указан только базовый домен, однако обновление будет действительно для всех доменов и поддоменов.
Чтобы обеспечить своевременное обновление сертификата, настройте демон cron для автоматического запуска команды renew раз в неделю или каждый день.
Отредактируйте crontab и создайте новую запись для команды renew. Чтобы отредактировать crontab пользователя root, введите:
sudo crontab -e
Команда предложит выбрать редактор:
no crontab for root - using an empty one
Select an editor. To change later, run 'select-editor'.
1. /bin/nano <---- самый простой
2. /usr/bin/vim.basic
3. /usr/bin/vim.tiny
Choose 1-3 [1]:
Чтобы принять редактор по умолчанию (nano), нажмите Enter.
Добавьте в конец таблицы следующую запись:
. . .
30 2 * * 1 /usr/bin/certbot renew >> /var/log/le-renew.log
Сохраните и закройте файл. Это создаст новый процесс cron, который будет выполнять команду letsencrypt-auto renew каждый понедельник в 2.3о ночи. Вывод этой команды будет помещён в /var/log/le-renewal.log.
Читайте также: Автоматизация задач с помощью Cron
Теперь веб-сервер Apache защищен при помощи SSL-сертификата Let’s Encrypt. Больше полезной информации (в том числе обновления) можно найти в блоге Let’s Encrypt.
Tags: Apache, Certbot, Debian 8, Let's Encrypt, SSL, TLS
1 комментарий
Thanks a lot for the great article! It was really helpful!