Модул 7 · 7.3
https с Let's Encrypt
Модул 7: Домейн, уеб сървър и https · Време за четене: 12 минути
Цел на урока: След този урок ще можете с certbot да заявите безплатен сертификат от Let's Encrypt за nginx, да пренасочите http към https, да проверите автоматичното подновяване и да отстраните най-честите грешки при заявка.
Основни понятия: сертификат, издател на сертификати (CA), ACME, Let's Encrypt, валидиране на домейн, HTTP-01, DNS-01, TLS-ALPN-01, certbot, подновяване, certbot renew --dry-run, срок на валидност, ARI, rate limits, staging, CAA, пренасочване към https
Защо https и какво доказва един сертификат
Без https всичко между браузъра и сървъра минава през мрежата некриптирано: пароли, формуляри, бисквитки. Всеки по пътя (публична Wi-Fi мрежа, хакнат рутер) може да чете или да променя данните. Затова браузърите отбелязват http сайтовете като "не е защитено", а някои функции работят само през https. За трезор за пароли като Vaultwarden (урок 9.4) https дори е задължителен.
https използва TLS и за това Вашият сървър се нуждае от сертификат: доказателство, подписано от издател на сертификати (CA), на когото браузърите имат доверие, че този ключ принадлежи на това име. Обикновеният сертификат доказва само, че заявителят управлява името на домейна (валидиране на домейн). Той не казва нищо за това кои сте Вие или дали сте надеждни.
Let's Encrypt е безплатен CA, който издава само сертификати с валидиран домейн, изцяло автоматично чрез протокола ACME. Програма на Вашия сървър (ACME клиентът) заявява сертификата, доказва, че управлява името, инсталира го и го подновява навреме. В този урок използваме certbot, клиента на EFF. Caddy (урок 7.4) има вграден ACME клиент.
Как доказвате, че управлявате името?
Let's Encrypt познава три вида проверки (challenges):
| Проверка | Как | Порт | Wildcard (*.example.com) |
|---|---|---|---|
| HTTP-01 | поставяне на файл в http://<naam>/.well-known/acme-challenge/ | 80 | не |
| DNS-01 | създаване на TXT запис _acme-challenge.<naam> | няма | да |
| TLS-ALPN-01 | показване на специален сертификат по време на TLS handshake | 443 | не |
За обикновен VPS с уебсайт HTTP-01 е най-лесният вариант. За него е необходимо:
- името да сочи към Вашия сървър с A (и AAAA) запис (урок 7.1);
- порт 80 да е отворен за целия свят, дори ако иначе сайтът Ви използва само https. Let's Encrypt валидира само през порт 80 и от няколко места в интернет; не можете да въведете тези адреси във Вашата защитна стена;
- сървърът Ви да отговаря еднакво през IPv4 и IPv6. Ако името има AAAA запис, Let's Encrypt първо опитва с IPv6. Само ако през IPv6 изобщо няма връзка, преминава към IPv4.
DNS-01 Ви трябва за wildcard сертификат или когато сървърът не е достъпен отвън. Тогава ACME клиентът трябва да може да променя Вашия DNS, обикновено чрез API ключ от Вашия DNS доставчик. Този ключ може да промени целия Ви DNS: пазете го толкова грижливо, колкото и парола.
Инсталиране на certbot
Създателите на certbot препоръчват snap пакета, защото той винаги съдържа най-новата версия. На Debian и Ubuntu може да се инсталира и директно от хранилището с пакети:
anna@web1:~$ sudo apt install certbot python3-certbot-nginxВерсията от дистрибуцията е по-стара, но получава актуализации за сигурност чрез apt (уроци 4.1 и 4.2), а това съответства на останалата част от курса. Изберете един от двата варианта, не и двата: две инсталации си пречат при подновяването.
Заявяване на сертификат
Със сайта от урок 7.2, който вече работи на порт 80:
anna@web1:~$ sudo certbot --nginx -d example.com -d www.example.com
Saving debug log to /var/log/letsencrypt/letsencrypt.log
Enter email address or hit Enter to skip.
(Enter 'c' to cancel):
...
Requesting a certificate for example.com and www.example.com
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at: /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2027-02-07.
These files will be updated when the certificate renews.
Certbot has set up a scheduled task to automatically renew this certificate in the background.
Deploying certificate
Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com(Датата и подробностите са само пример.) Плъгинът --nginx прави три неща: временно подготвя проверката, изтегля сертификата и променя Вашия server block, като добавя блок listen 443 ssl и пренасочване от http към https. Ако предпочитате да направите това сами, използвайте certbot certonly --nginx и добавете редовете в конфигурацията си ръчно.
Няколко неща, на които да обърнете внимание:
- Заявете наведнъж всички имена, които принадлежат на сайта (
-dза всяко име). Всяко име трябва да сочи към сървъра, иначе цялата заявка се проваля. - Частният ключ (
privkey.pem) се намира в/etc/letsencrypt/live/и може да се чете само от root. Не го копирайте на други места и никога не го включвайте в резервно копие, което други могат да четат. - Имейл адресът не е задължителен. От юни 2025 г. Let's Encrypt вече не изпраща имейли, когато сертификатът е пред изтичане. Затова трябва сами да следите дали подновяването е успешно (урок 8.3).
Пренасочване на http към https
След certbot конфигурацията Ви изглежда приблизително така (изчистена; certbot сам добавя коментар # managed by Certbot и понякога редове if):
server {
listen 80;
listen [::]:80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name example.com www.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;
root /var/www/example.com;
...
}Първият блок пренасочва всичко, което идва през http, към същото име и същия път през https, с постоянно пренасочване (301). Файлът за проверката при подновяване продължава да работи: Let's Encrypt следва това пренасочване. Вторият блок е истинският сайт. Ако искате също да пренасочвате www към името без www (или обратното), направете го в отделен блок, така че посетителите да виждат едно постоянно име.
Подновяване: автоматично и с проверка
Сертификатът от Let's Encrypt в момента е валиден 90 дни. Този срок ще се скъсява: Let's Encrypt обяви, че стандартният профил ще издава сертификати за 64 дни от 10 февруари 2027 г. и за 45 дни от 16 февруари 2028 г. Ръчното подновяване следователно не е вариант; то трябва да е автоматично.
При инсталацията certbot създава systemd таймер (или cron ред), който два пъти на ден проверява дали някой сертификат трябва да бъде подновен. Проверете дали той съществува и тествайте подновяването с пробна заявка:
anna@web1:~$ systemctl list-timers 'certbot*'
NEXT LEFT LAST PASSED UNIT ACTIVATES
Mon 2026-11-09 22:41:00 CET 9h left - - certbot.timer certbot.service
anna@web1:~$ sudo certbot renew --dry-run
...
Congratulations, all simulated renewals succeeded:
/etc/letsencrypt/live/example.com/fullchain.pem (success)След подновяването nginx трябва и да зареди новия сертификат. С плъгина за nginx certbot прави това сам; ако използвате certonly, създайте deploy hook, който презарежда nginx, например изпълним скрипт в /etc/letsencrypt/renewal-hooks/deploy/ с systemctl reload nginx.
Добрите ACME клиенти използват ARI (ACME Renewal Information): тогава Let's Encrypt сам съобщава кога трябва да се поднови даден сертификат, например по-рано, ако има проблем с цяла серия сертификати. Затова поддържайте клиента си актуален.
Когато заявката се провали
| Съобщение (съкратено) | Причина | Решение |
|---|---|---|
Timeout during connect (likely firewall problem) | порт 80 е затворен или името сочи към друг адрес | защитна стена (урок 5.2), A/AAAA (урок 7.1) |
Invalid response from http://.../.well-known/acme-challenge/...: 404 | отговаря друг сървър или друг server block, често през IPv6 | listen [::]:80, проверете AAAA записа |
CAA record for example.com prevents issuance | CAA запис разрешава само друг издател | променете CAA (урок 7.1) |
too many certificates already issued | rate limit | изчакайте; тествайте със staging |
Let's Encrypt има rate limits срещу злоупотреби. Най-важните: най-много 50 нови сертификата на регистриран домейн за 7 дни, най-много 5 сертификата за точно един и същ набор от имена за 7 дни и най-много 5 неуспешни валидации на име за час. Ако експериментирате и заявявате отново и отново, бързо ще стигнете до тях. Затова тествайте със средата staging, която има много по-широки граници, но издава сертификати, на които браузърите нямат доверие:
anna@web1:~$ sudo certbot certonly --nginx --staging -d test.example.comАко там всичко работи, заявете истинския сертификат.
На AlmaLinux и Rocky Linux
Там certbot идва от EPEL (dnf install certbot python3-certbot-nginx) или като snap. Плъгинът и командите са същите. Не забравяйте firewalld (--add-service=http --add-service=https) и SELinux, ако сертификатите се намират на необичайно място.
На практика
При хостинг пакет панелът урежда сертификата вместо Вас (при WebOké и при други хостинг компании с DirectAdmin, cPanel или Plesk). На VPS го правите сами, с certbot, Caddy или ACME клиента, който идва с Вашия софтуер. Това важи при всеки доставчик.
Обобщение
- Сертификатът от Let's Encrypt доказва, че управлявате името; certbot го заявява, инсталира и подновява чрез ACME.
- HTTP-01 изисква порт 80 да е отворен за всички и еднакъв отговор през IPv4 и IPv6; DNS-01 е за wildcard сертификати.
certbot --nginx -d ... -d ...урежда сертификата и пренасочването към https; заявявайте всички имена на един сайт наведнъж.- Сертификатите в момента са валидни 90 дни и срокът ще се скъсява; проверете таймера и
certbot renew --dry-runи сами следете датата на изтичане. - Тествайте с
--staging, за да избегнете rate limits; внимавайте с CAA.
Тест (quiz)
Задача
Задача Z7.3: https с валиден сертификат. Заявете сертификат за Вашия сайт (с certbot или Caddy), пренасочете http към https и тествайте подновяването с certbot renew --dry-run (при Caddy: проверете в логовете дали сертификатът е изтеглен). Въведете името на Вашия сайт. Програмата осъществява TLS връзка към порт 443 и проверява дали сертификатът е валиден, подписан от доверен издател и покрива Вашето име, след което заявява http://<naam>/, за да види дали пренасочвате към https. Освен това въвеждате кога изтича Вашият сертификат и как е уредено подновяването при Вас.
Още за четене
- Активиране, подновяване и отстраняване на проблеми със SSL сертификат
- Безплатен DNS курс 5.2: CAA: кой има право да издава сертификати?
- Let's Encrypt, Challenge Types: https://letsencrypt.org/docs/challenge-types/
- Let's Encrypt, Rate Limits: https://letsencrypt.org/docs/rate-limits/
- Let's Encrypt, Decreasing Certificate Lifetimes to 45 Days: https://letsencrypt.org/2025/12/02/from-90-to-45
- Инструкции за Certbot (nginx): https://certbot.eff.org/instructions?ws=nginx&os=snap
