Создание сертификата 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: , , , , ,

1 комментарий

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