Настройка Linux для использования центра SSL сертификации Lets Encrypt

Домашняя страница: Let’s Encrypt is a free, automated, and open Certificate Authority

Чтобы получить SSL сертификат для вашего домена от Let’s Encrypt, вам необходимо запустить клиентскую часть на вашем сервере.

Пригодны ли сертификаты Let’s Encrypt для других целей, нежели SSL/TLS для сайтов? Сертификаты Let’s Encrypt - обычные сертификаты с подтверждением домена, поэтому они пригодны для любых серверов с доменным именем - web-серверы, почтовые серверы, FTP-серверы и т.д. Но для шифрования электронной почты и подписи исполняемого кода нужны сертификаты иного типа, который Let’s Encrypt пока не предоставляет.

Ограничения Let’s Encrypt:

  1. Основной лимит — количество регистраций сертификатов на один зарегистрированный домен не более 50 в неделю. Под зарегистрированный доменном подразумевается часть домена, который вы приобрели у своего регистратора доменных имен. Например, для имени www.example.com зарегистрированным доменом является example.com. В new.blog.example.co.uk зарегистрированный домен — example.co.uk.
  2. Максимум 300 новых попыток регистрации на аккаунт за 3 часа. Новый регистрация создается каждый раз, когда вы запрашиваете сертификат у Boulder CA, то есть считаются и неудачные попытки.
  3. Продления обрабатываются особым образом: они не засчитываются в ваш лимит сертификатов на зарегистрированный домен, но на них распространяется лимит дубликатов сертификатов, равный 5 в неделю.
  4. Максимум 10 учетных записей на один IP-адрес за 3 часа. Вы можете создать не более 500 учетных записей на диапазон IP-адресов в пределах IPv6/48 за 3 часа.
  5. Можно объединить несколько имен хостов в один SSL сертификат, до 100 имен на сертификат. По соображениям производительности и надежности лучше использовать меньше имен на сертификат, когда это возможно. Сертификат содержащий несколько доменных имен часто называют сертификатом SAN (Subject Alternate Name), сертификатом единой связи (UCC), биржевым сертификатом или multi-domain certificate (НЕ ПУТАТЬ с Wildcard SSL).

Многодоменный (multi domain) SSL-сертификат — это единый сертификат, который можно использовать для защиты нескольких доменов (или субдоменов, если вы указываете их как SAN). С другой стороны, wildcard SSL-сертификат защищает только ваш основной домен и неограниченное количество поддоменов на одном уровне.

Let’s Encrypt предлагает сертификаты с подтверждением домена (Domain Validation, DV), Wildcard SSL. Они не выпускают сертификаты с подтверждением организации (Organization Validation, OV) или сертификаты высокой надёжности (Extended Validation, EV), потому что не могут пока автоматизировать выдачу таких сертификатов.

Обратите внимание!

У всех ведущих хостинг провайдеров на виртуальных тарифах настроен автоматический выпуск бесплатных SSL сертификатов Let’s Encrypt.

Читайте руководство далее, если настраивайте сервер VPS/VDS, используя, например мою статью Чек лист по настройке VPS/VDS, выделенного сервера Linux с нуля.

  1. Бесплатные сертификаты от компании Regery (Реджери) на 90 дней: Sectigo Free SSL и Regery Free SSL с бесплатной помощью по их выпуску. Широкий выбор брендов платных SSL сертификатов: Symantec, Thawte, Sectigo, GeoTrust, RapidSSL.
  2. Бесплатные сертификаты по протоколу ACME выдает норвежский Buypass (услуга BuyPass Go SSL).
  3. Бесплатные сертификаты SSL.com на 90 дней
  4. ZeroSSL предоставляет бесплатный тариф — DV сертификат на 90 дней. Как и Free SSL, заявляют о 99,99% совместимости с серверами, браузерами и устройствами, однако на бесплатном тарифе не поддерживается wildcard.
  5. Free SSL Space - некоммерческая организация, которая также выдает 90-дневные DV сертификаты. Отличается от Let’s Encrypt совместимостью: как заявляет компания, их сертификаты поддерживаются на 99,99% устройств. Нет опции wildcard. Сервис умер, как я понимаю, если ошибаюсь напишите мне!
  6. CloudFlare защищает сайты от DDoS-атак — моментов, когда злоумышленники пытаются перегрузить ваш сайт множеством одновременных запросов, а также ускоряет загрузку. Бесплатный SSL сертификат — приятное дополнение к сервису. CloudFlare предлагает получить SSL сертификат бесплатно и на неопределенный срок на базовом тарифе, который предназначен для личных некоммерческих сайтов. У бесплатного SSL от CloudFlare есть одно «но». Загрузка сайта ускоряется благодаря тому, что сервис кеширует ваш сайт на свои серверы и контент попадает пользователю с них. Общение происходит по цепочке «пользователь — серверы CloudFlare — ваш сервер», и SSL зашифрует только первую связь. На ваш сервер данные будут идти уже открыто. Впрочем, это уже решает самые распространенные проблемы безопасности вроде использования общественного Wi-Fi.
  7. У хостинг-провайдера или регистратора доменных имен вы можете получить бесплатный SSL сертификат. Если вы только собираетесь заводить сайт или ищете новый хостинг — рассмотрите предложения, где бонусом идет сертификат.

Certbot - это ACME (Automated Certificate Management Environment) - клиент для автоматического создания и установки сертификатов, без остановки web- сервера. Существуют множество других клиентов, кроме certbot , которые поддерживает ACMEv2, например acme.sh.

Инсталляция Certbot

Используйте генератор инструкций, чтобы найти пользовательские команды для установки Certbot в среде вашего сервера. Достаточно просто выбрать программное обеспечение (веб-сервер) и операционную систему вашего сервера. Посмотреть варианты установки certbot для любой ОС и веб-сервера!

Настроим поддержку SSL в Apache с настройками HTTPS по умолчанию, для этого нужно включить модуль ssl:

sudo a2enmod ssl
sudo a2ensite default-ssl
sudo systemctl restart apache2

Проверить текущие настройки виртуальных хостов командой apachectl с ключом S. Вы должны увидеть как минимум 2 виртуальных хоста по умолчанию.

# apachectl -S

Ставим пакеты Certbot с поддержкой Nginx

apt install certbot python3-certbot-nginx

Теперь Certbot установлен на сервере.

Чтобы автоматически получить и настроить SSL для вашего веб-сервера, Certbot должен найти корректный виртуальный хост в ваших файлах конфигурации Apache, Nginx. Имена доменов ваших серверов будут получены из директив ServerName и ServerAlias, определенных в блоке конфигурации VirtualHost.

  • Вывести информацию об установленных SSL ключах
certbot certificates

Как не странно процедура создания виртуального домена веб сервера Apache всегда вызывает вопросы. Но с другой стороны эта тривиальная задача в интернете описана с гигантским количество ошибок.

Ниже я описываю, как создать виртуальный домен Apache с поддержкой HTTP и HTTPS и установить права на директории.

sudo mkdir /var/www/your_domain
sudo chown -R $USER:$USER /var/www/your_domain

Надеюсь вы не трогали значение umask, тогда выполните команду

sudo chmod -R 755 /var/www/your_domain

Создайте пустой index.html любым известным вам способом, например используя Горячие клавиши текстового редактора Nano.

sudo nano /var/www/your_domain/index.html

Теперь необходимо создать конфигурационный файл виртуального хоста с правильными директивами, не надо менять файл /etc/apache2/sites-available/000-default.conf, нужно создать новый. В в одном и том же файле описываем виртуальных хост для HTTP (порт 80) и HTTPS (порт 443), пути к SSL сертификатам копируем из файла default-ssl.conf. SSL сертификаты нужно указать, в дальнейшем они будут автоматически заменены программой certbot.

sudo nano /etc/apache2/sites-available/your_domain.conf

с таким содержимым

<VirtualHost *:80>
    ServerAdmin webmaster@localhost
    ServerName your_domain
    ServerAlias www.your_domain
    DocumentRoot /var/www/your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>
<VirtualHost *:443>
    SSLEngine on
    SSLCertificateFile      /etc/ssl/certs/ssl-cert-snakeoil.pem
    SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key
    ServerAdmin   webmaster@localhost
    DocumentRoot /var/www/your_domain
    ServerName your_domain
    ErrorLog ${APACHE_LOG_DIR}/error.log
    CustomLog ${APACHE_LOG_DIR}/access.log combined
</VirtualHost>

Включим созданные виртуальный хост

sudo a2ensite

В выводе это команды вы увидите список всех ваших виртуальных хостов, выделите нужный мышкой и через пробел введите все нужные или сразу укажите нужный хост, набрав команду

sudo a2ensite your_domain.conf

Если нужно, можно отключить хост по умолчанию, но я так не делаю. Для отключения введите команду:

sudo a2dissite 000-default.conf

Обязательно перегружаем Apache, чтобы он подхватил наши изменения

sudo systemctl reload apache2

Введите следующую команду:

sudo certbot --apache

Скрипт certbot предложит вам ответить на ряд вопросов, чтобы настроить сертификат SSL:

  1. Введите действующий адрес электронной почты, которая будет использоваться для уведомлений о продлении и безопасности: жмем Enter.
  2. Подтвердите согласие с условиями обслуживания Let’s Encrypt: ведите А.
  3. Запрос на рассылку писем - нажмите Y (пусть спама в вашей жизни будет больше8-)), можете отказать и выбрать N
  4. Наконец, на этом этапе вас спросят для каких доменов вы хотите получить SSL сертификат. Если хотите активировать HTTPS для всех указанных доменных имен (рекомендуется), то можно оставить командную строку пустой и нажать ENTER, чтобы продолжить. В противном случае выберите домены, для которых вы хотите активировать HTTPS, указав все подходящие номера через запятую и/или пробелы, и нажмите ENTER.
  5. Далее вам будет предложено выбрать, перенаправлять трафик HTTP на HTTPS или нет. На практике это означает, что те, кто посещает ваш веб-сайт через незашифрованные каналы (HTTP), будут автоматически перенаправляться на адрес HTTPS вашего веб-сайта. Выберите 2, чтобы активировать перенаправление, или 1, если хотите сохранить и HTTP, и HTTPS в качестве отдельных методов доступа к вашему веб-сайту.

Поздравляю ваш сайт защищен!

Сертификаты Let’s Encrypt действительны только в течение 90 дней. Установленный нами пакет certbot выполняет это автоматически, добавляя таймер systemd, который будет запускаться два раза в день и автоматически продлевать все сертификаты, истекающие менее, чем через 30 дней.

Вы можете запросить статус таймера с помощью команды systemctl:

systemctl status certbot.timer

Output
● certbot.timer - Run certbot twice daily
     Loaded: loaded (/lib/systemd/system/certbot.timer; enabled; vendor preset: enabled)
     Active: active (waiting) since Mon 2020-05-04 20:04:36 UTC; 2 weeks 1 days ago
    Trigger: Thu 2020-05-21 05:22:32 UTC; 9h left
   Triggers: ● certbot.service

Чтобы протестировать процесс обновления, можно сделать запуск «вхолостую» с помощью certbot:

certbot renew --dry-run

Если ошибок нет, все нормально. Certbot будет продлевать ваши сертификаты, когда это потребуется, и перезагружать Nginx для активации изменений. Если процесс автоматического обновления когда-нибудь не выполнится, то Let’s Encrypt отправит сообщение на указанный вами адрес электронной почты с предупреждением о том, что срок действия сертификата подходит к концу.

Логи перевыпуска SSL сертификатов Let’s Encrypt обычно находятся в этой папке /var/log/letsencrypt/.

Для версий скаченных с GitHub, понадобится другая настройка автоматического обновления.

Не забудьте настроить cron: в первом letsencrypt будет запускаться каждый понедельник 5 часов утра только для обновления устаревших SSL сертификатов. Во втором варианте также указывается nginx перечитать конфигурацию, потому что Nginx автоматически не увидит изменения файлов сертификатов.

sudo crontab -e
0 5 * * 1 /usr/bin/letsencrypt renew
 
15 1 * * * /usr/bin/certbot renew --post-hook "systemctl reload nginx"

Let’s Encrypt начал выдавать Wildcard сертификаты c 14 марта 2018 года.

Wildcard SSL/TLS позволяет использовать неограниченное количество поддоменов одного и того же домена (не путать с SAN). Любой полный домен, соответствующий * .yourdomain.com (где * может быть любым словом, а yourdomain.com - ваш домен), будет защищен цифровым сертификатом SSL с подстановочными знаками. Например, dieg.info, www.dieg.info, mail.dieg.info и любая другая комбинация dieg.info будет защищена сертификатом с подстановочными знаками, выданным * .dieg.info.

TXT запись в DNS нужно менять каждые 90 дней

Получение wildcard сертификата сейчас возможно только через DNS challenge (проверка DNS-01), где необходимо создать TXT запись вида _acme-challenge.example.com с определенным значением.
  1. Прежде чем получить Wildcard SSL сертификат, нужно убедиться, что наш сервер отвечает на запросы на нескольких поддоменах. Обычно это достигается путем настройки записи DNS с подстановочными знаками, которая выглядит примерно так:
    *.example.com. 3600 IN  A 185.253.219.218

    Подстановочный знак * рассматривается как замена для любого имени хоста. Этот пример записи DNS будет соответствовать one.example.com и two.example.com. Он не будет соответствовать простому example.com и не будет соответствовать one.two.example.com, потому что подстановочный знак * будет расширяться только до одного имени хоста, а не до нескольких уровней имен.

Запускаем команду для создания нового SSL сертификата:

certbot certonly \
  --agree-tos \
  --email info@hoster.tips \
  --manual \
  --preferred-challenges=dns \
  -d example.com \
  -d *.example.com \
  --server https://acme-v02.api.letsencrypt.org/directory

После выполнения команды вы получите запись TXT, которую необходимо добавить на свой DNS-сервер. Записи будут выглядеть следующим образом:

Please deploy a DNS TXT record under the name 
_acme-challenge.example.com with the following value: 
 
HejzlvXokaKoAq_xnr5LTplWbKYNScVH-ASy1vMYMGE
Before continuing, verify the record is deployed. 

Убедившись, что запись добавлена, нажмите Enter, чтобы получить SSL. Для Nginx конфиг будет примерно таким, обратите внимание на редирект с 80 порта

server { 
 listen 80; 
 listen [::]:80; 
 server_name *.example.com; 
 return 301 https://$host$request_uri; 
} 
 
server { 
 listen 443 ssl; 
 server_name *.example.com; 
 ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem; 
 ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem; 
 include /etc/letsencrypt/options-ssl-nginx.conf; 
 ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; 
 root /var/www/example.com; 
 index index.html; 
 location / { 
   try_files $uri $uri/ =404; 
 } 
}

Не забываем что команду создание сертификата нужен будет обновить через 3 месяца (срок жизни SSL), так же нужно будет обновлять DNS запись.

ACME.sh альтернатива скрипту certbot

На использование acme.sh меня сподвигнул сисадмин Сергей Деревянко. Респект и мое уважение.

Скрипт acme.sh написан на чистом bash, а оригинальный certbot на Синтаксис Python.

Преимущества acme.sh:

  • acme.sh автоматически поддерживает валидацию через DNS, поддерживает много API различных провайдеров, включая Yandex pdd.yandex.ru. Скрипт сам проверяет ваши права на домен добавляя специальную TXT запись в вашу зону (если есть API у вашего провайдера) и генерирует нужные сертификаты.
  • Поддержка docker-а «из коробки», есть уже готовый контейнер от авторов скрипта.
  • Добавляет себя в cron для автоматического обновления сертификатов по таймеру.
  • acme.sh скрипт может выполнить заданную команду после обновления сертификатов — очевидным применением является отправка команды веб-серверу на перезагрузку ключей. Есть ещё хуки для выполнения до и после запуска скрипта.
  • Есть функции для автоматической загрузки ключей в различные хостинговые панели (типа cPanel)

Установка acme.sh

curl https://get.acme.sh | sh

В cron на каждой ноде создаем правило:

55 0 * * 6 "/root/.acme.sh"/acme.sh --cron --force --home "/root/.acme.sh" > /dev/null

ACME.sh: Lets Encrypt Wildcard SSL вручную

PQ VPS сервера в 28+ странах.