Домашняя страница: 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:
Многодоменный (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 с нуля.
Certbot - это ACME (Automated Certificate Management Environment) - клиент для автоматического создания и установки сертификатов, без остановки web- сервера. Существуют множество других клиентов, кроме certbot , которые поддерживает ACMEv2, например acme.sh.
Инсталляция 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.
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:
Поздравляю ваш сайт защищен!
Сертификаты 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.
*.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 написан на чистом bash, а оригинальный certbot на Синтаксис Python.
Преимущества acme.sh:
Установка 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