Настройка 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:
- Основной лимит — количество регистраций сертификатов на один зарегистрированный домен не более 50 в неделю. Под зарегистрированный доменном подразумевается часть домена, который вы приобрели у своего регистратора доменных имен. Например, для имени www.example.com зарегистрированным доменом является example.com. В new.blog.example.co.uk зарегистрированный домен — example.co.uk.
- Максимум 300 новых попыток регистрации на аккаунт за 3 часа. Новый регистрация создается каждый раз, когда вы запрашиваете сертификат у Boulder CA, то есть считаются и неудачные попытки.
- Продления обрабатываются особым образом: они не засчитываются в ваш лимит сертификатов на зарегистрированный домен, но на них распространяется лимит дубликатов сертификатов, равный 5 в неделю.
- Максимум 10 учетных записей на один IP-адрес за 3 часа. Вы можете создать не более 500 учетных записей на диапазон IP-адресов в пределах IPv6/48 за 3 часа.
- Можно объединить несколько имен хостов в один 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 с нуля.
Альтернатива Let’s Encrypt или Где получить SSL сертификат бесплатно
- Бесплатные сертификаты от компании Regery (Реджери) на 90 дней: Sectigo Free SSL и Regery Free SSL с бесплатной помощью по их выпуску. Широкий выбор брендов платных SSL сертификатов: Symantec, Thawte, Sectigo, GeoTrust, RapidSSL.
- Бесплатные сертификаты по протоколу ACME выдает норвежский Buypass (услуга BuyPass Go SSL).
- Бесплатные сертификаты SSL.com на 90 дней
- ZeroSSL предоставляет бесплатный тариф — DV сертификат на 90 дней. Как и Free SSL, заявляют о 99,99% совместимости с серверами, браузерами и устройствами, однако на бесплатном тарифе не поддерживается wildcard.
- Free SSL Space - некоммерческая организация, которая также выдает 90-дневные DV сертификаты. Отличается от Let’s Encrypt совместимостью: как заявляет компания, их сертификаты поддерживаются на 99,99% устройств. Нет опции wildcard. Сервис умер, как я понимаю, если ошибаюсь напишите мне!
- CloudFlare защищает сайты от DDoS-атак — моментов, когда злоумышленники пытаются перегрузить ваш сайт множеством одновременных запросов, а также ускоряет загрузку. Бесплатный SSL сертификат — приятное дополнение к сервису. CloudFlare предлагает получить SSL сертификат бесплатно и на неопределенный срок на базовом тарифе, который предназначен для личных некоммерческих сайтов. У бесплатного SSL от CloudFlare есть одно «но». Загрузка сайта ускоряется благодаря тому, что сервис кеширует ваш сайт на свои серверы и контент попадает пользователю с них. Общение происходит по цепочке «пользователь — серверы CloudFlare — ваш сервер», и SSL зашифрует только первую связь. На ваш сервер данные будут идти уже открыто. Впрочем, это уже решает самые распространенные проблемы безопасности вроде использования общественного Wi-Fi.
- У хостинг-провайдера или регистратора доменных имен вы можете получить бесплатный SSL сертификат. Если вы только собираетесь заводить сайт или ищете новый хостинг — рассмотрите предложения, где бонусом идет сертификат.
Шаг 1: Инсталляция Certbot в Ubuntu с поддержкой Apache
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
- Вывести информацию об установленных SSL ключах
certbot certificates
Шаг 2: Как создать виртуальный домен Apache с поддержкой HTTP и HTTPS
Как не странно процедура создания виртуального домена веб сервера 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
Шаг 3: Получение сертификата SSL
Введите следующую команду:
sudo certbot --apache
Скрипт certbot предложит вам ответить на ряд вопросов, чтобы настроить сертификат SSL:
- Введите действующий адрес электронной почты, которая будет использоваться для уведомлений о продлении и безопасности: жмем Enter.
- Подтвердите согласие с условиями обслуживания Let’s Encrypt: ведите А.
- Запрос на рассылку писем - нажмите Y (пусть спама в вашей жизни будет больше), можете отказать и выбрать N
- Наконец, на этом этапе вас спросят для каких доменов вы хотите получить SSL сертификат. Если хотите активировать HTTPS для всех указанных доменных имен (рекомендуется), то можно оставить командную строку пустой и нажать ENTER, чтобы продолжить. В противном случае выберите домены, для которых вы хотите активировать HTTPS, указав все подходящие номера через запятую и/или пробелы, и нажмите ENTER.
- Далее вам будет предложено выбрать, перенаправлять трафик HTTP на HTTPS или нет. На практике это означает, что те, кто посещает ваш веб-сайт через незашифрованные каналы (HTTP), будут автоматически перенаправляться на адрес HTTPS вашего веб-сайта. Выберите 2, чтобы активировать перенаправление, или 1, если хотите сохранить и HTTP, и HTTPS в качестве отдельных методов доступа к вашему веб-сайту.
Поздравляю ваш сайт защищен!
Шаг 4: Автоматический перевыпуск сертификата 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"
Шаг 5: Получение сертификата Wildcard SSL
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 с определенным значением.- Прежде чем получить 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 написан на чистом 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
📌 Для тестирования скриптов, установщиков VPN, Python ботов рекомендуем использовать надежные VPS на короткий срок. Если вам нужна помощь с более сложными задачами, вы можете найти фрилансера, который поможет с настройкой. Узнайте больше о быстрой аренде VPS для экспериментов и о фриланс-бирже для настройки VPS, WordPress. 📌
💥 Подпишись в Телеграм 💥 и задай вопрос по сайтам и хостингам бесплатно!7 Самых Популярных Статей
- Как запустить скрипты и веб-приложения на Python
- Что такое страны TIER 1,2,3
- 7 способов сравнения файлов по содержимому в Windows или Linux
- Установка и тестирование веб-панели HestiaCP
- Китайский VPN Shadowsocks простая установка и настройка
- top, htop, atop определение загрузки ОС (Load average, LA)
- Использование rsync в примерах