Бесплатные сертификаты HTTPS от Let's Encrypt
Let's Encrypt — центр сертификации, выдающий бесплатные сертификаты HTTPS для вашего домена. На VPS сертификат можно получить несколькими командами через Certbot или вообще без команд через Caddy, и оба продлевают его сами. Условий два: домен должен указывать на IP-адрес вашего сервера, а порты 80 и 443 должны быть открыты снаружи.
Зачем нужен HTTPS?
HTTPS шифрует трафик между браузером и сервером. Посторонние в сети не смогут прочитать пароль в форме входа или данные заказа. На сайтах без HTTPS браузеры могут показывать предупреждение «небезопасно». Сертификат Let's Encrypt бесплатен, так что причин обходиться без HTTPS не осталось.
Прежде чем начать
- A-запись домена должна указывать на IP-адрес вашего сервера. Чтобы проверить, выполните
dig +short example.com. В выводе должен быть IP-адрес вашего сервера. - Порты 80 и 443 должны быть открыты, потому что проверка идёт по порту 80 (HTTP-01). Если вы используете ufw, выполните
sudo ufw allow 80/tcpиsudo ufw allow 443/tcp. Если у сервера есть отдельный брандмауэр в панели, проверьте правила и там. - Если у домена есть запись AAAA (IPv6), она тоже должна указывать на этот сервер. Если нет, удалите запись.
- Ваш веб-сервер должен работать и знать этот домен.
Установка и проверка через Certbot на Nginx или Apache
Официальная инструкция Certbot рекомендует пакет snap. Убедитесь, что на сервере установлен snapd (в Ubuntu он обычно есть), и удалите старый Certbot, установленный через apt.
- Установите Certbot:
sudo snap install --classic certbot - Сделайте команду доступной везде:
sudo ln -s /snap/bin/certbot /usr/local/bin/certbot - Получите сертификат и установите его в веб-сервер. Для Nginx выполните
sudo certbot --nginx, для Apache —sudo certbot --apache. - Ответьте на вопросы: ваш адрес электронной почты, для каких доменов нужен сертификат и нужно ли перенаправлять HTTP на HTTPS.
- Проверьте продление:
sudo certbot renew --dry-run
Если вам нужно только получить сертификат, а настроить всё остальное самостоятельно, выполните sudo certbot certonly --nginx. Пакет Certbot сам добавляет запланированное задание (cron или таймер systemd), его видно в выводе systemctl list-timers. sudo certbot certificates выводит ваши сертификаты и сроки их действия. Certbot продлевает сертификат, когда срок его действия подходит к концу, и вам ничего делать не нужно. Но продление всё же может однажды не сработать (например, из-за правила брандмауэра), поэтому время от времени запускайте --dry-run.
Чтобы проверить сертификат, сначала посмотрите на значок замка в адресной строке браузера. Чтобы увидеть срок действия командой, выполните:
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates
Строка notAfter в выводе — срок действия сертификата. Если вы не используете перенаправление, которое добавляет Certbot, настройте перенаправление HTTP на HTTPS сами. В Nginx добавьте строку return 301 https://$host$request_uri; в блок server, слушающий порт 80.
С Caddy и без команд
Если вы используете Caddy, ничего дополнительно ставить не нужно. Для домена из своей конфигурации Caddy сам получает сертификат от Let's Encrypt или ZeroSSL, продлевает его и перенаправляет HTTP на HTTPS. По официальной документации, A- и AAAA-записи домена должны указывать на сервер, порты 80 и 443 должны быть доступны снаружи, а папка данных Caddy должна быть постоянной и доступной для записи. Если вы запускаете Caddy в Docker, смонтируйте эту папку на том. Иначе при удалении контейнера сертификаты пропадут, а повторный запрос может упереться в лимит.
Wildcard-сертификаты
Wildcard-сертификат (*.example.com) покрывает все поддомены одним сертификатом, и получить его можно только через проверку DNS-01. Эта проверка не использует порт 80. Она просит вас добавить TXT-запись в DNS домена. Для этого у вашего DNS-провайдера должен быть API, а ключ API вы храните на сервере. В документации Let's Encrypt хранение таких ключей на веб-сервере названо рискованным. Если wildcard не нужен, проще получать сертификаты для отдельных доменов через HTTP-01, при этом хранить ключ DNS не нужно.
Типичные ошибки
| Симптом | Вероятная причина | Решение |
|---|---|---|
| Проверка не проходит, домен не найден | A-запись указывает на неверный IP или ещё не распространилась | Проверьте IP командой dig +short example.com и подождите |
| Тайм-аут | Порт 80 закрыт | Откройте 80 в ufw и в брандмауэре панели, если он у вас есть |
| Проверка то проходит, то нет | Запись AAAA указывает на другой сервер | Исправьте или удалите запись AAAA |
| Ошибка превышения лимита | Слишком много попыток | Для тестов используйте --dry-run и смотрите лимиты на официальной странице |
| Продление не выполняется | Нет запланированного задания, или веб-сервер блокирует порт 80 | sudo certbot renew --dry-run покажет ошибку |
В сообщении об ошибке обычно сказано, какая проверка не прошла и к какому адресу на вашем сервере пытался обратиться Let's Encrypt. Читайте сообщение как есть. Ответ часто лежит прямо там.
Согласно официальной странице Let's Encrypt, действует лимит 5 сертификатов в неделю для одного и того же набора доменных имён и 5 неудачных проверок в час для одного и того же доменного имени. Поэтому, пока экспериментируете, используйте --dry-run. Он пробует продление в тестовой среде и не тратит ваш настоящий лимит.
На готовых приложениях Seturack
Готовые приложения (WordPress, Nextcloud и другие) открываются по HTTPS на адресе sslip.io, построенном из вашего IP-адреса, поэтому доменное имя не нужно. Когда вы подключаете собственный домен, Caddy получает сертификат заново, и ничего дополнительно ставить не нужно. Шаги, как сообщить о домене Caddy и приложению, описаны в этой справочной статье.
Комментарии0
Комментариев пока нет
Поделитесь своим мнением первым.
Пожалуйста, войдите или зарегистрируйтесь, чтобы оставить комментарий.