Безплатні сертифікати 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 - Отримайте сертифікат і встановіть його у вебсервер. Виконайте
sudo certbot --nginxдля Nginx абоsudo certbot --apacheдля 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)
Універсальний сертифікат (*.example.com) охоплює всі піддомени одним сертифікатом, і отримати його можна лише з перевіркою DNS-01. Ця перевірка не використовує порт 80. Вона просить додати запис TXT у DNS вашого домену. Для цього вашому DNS-провайдеру потрібен API, а ключ API ви зберігаєте на сервері. У документації Let's Encrypt зберігання таких ключів на вебсервері названо ризикованим. Якщо універсальний сертифікат вам не потрібен, простіше отримувати сертифікати для окремих доменів через 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
Коментарів поки немає
Поділіться своєю думкою першим.
Будь ласка, увійдіть або зареєструйтеся, щоб залишити коментар.