Към съдържанието

Настройки за бисквитки

Изберете кои видове бисквитки разрешавате. Можете да промените избора си по всяко време чрез „Настройки за бисквитки“ в долната част на всяка страница. Декларация за поверителност

Необходими

Винаги включени

Нужни са за вход, за запазване на количката и на Вашите избори. Те са винаги включени.

Кои бисквитки?
  • weboke_sessie, weboke_klant, weboke_remember: Вашата сесия и оставането в акаунта
  • weboke_basket: Вашата количка
  • wkBtwIncl: показване на цените с или без ДДС
  • wok_cookies: Вашият избор за бисквитките, 12 месеца

Измерват коя реклама води до посещение или поръчка, за да не плащаме за реклами без резултат.

Кои бисквитки?
  • Google Ads чрез Google Tag Manager (_gcl_au, _gcl_aw), до 90 дни
  • OpenAI Ads, реклами в ChatGPT
  • wok_aff: кой партньор Ви е препратил към нас (партньорска програма), 60 дни

4,6

Държава и език

Всяка държава има собствен сайт, с цените и ДДС на тази държава.

Преглед

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 handshake443не

За обикновен 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, често през IPv6listen [::]:80, проверете AAAA записа
CAA record for example.com prevents issuanceCAA запис разрешава само друг издателпроменете CAA (урок 7.1)
too many certificates already issuedrate 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)

1. Вашият сайт трябва да е достъпен само през https. Можете ли тогава да затворите порт 80 в защитната стена, ако използвате HTTP-01?



2. Искате сертификат за *.example.com. Коя проверка Ви трябва?



3. Заявката се проваля с 404 за файла на проверката, а curl http://example.com/ през IPv4 показва Вашия сайт. Коя е най-вероятната причина?



4. Защо автоматичното подновяване е по-важно от всякога?



5. Експериментирате и днес вече четири пъти сте заявили един и същ сертификат. Какво правите за следващия опит?



Задача

Задача Z7.3: https с валиден сертификат. Заявете сертификат за Вашия сайт (с certbot или Caddy), пренасочете http към https и тествайте подновяването с certbot renew --dry-run (при Caddy: проверете в логовете дали сертификатът е изтеглен). Въведете името на Вашия сайт. Програмата осъществява TLS връзка към порт 443 и проверява дали сертификатът е валиден, подписан от доверен издател и покрива Вашето име, след което заявява http://<naam>/, за да види дали пренасочвате към https. Освен това въвеждате кога изтича Вашият сертификат и как е уредено подновяването при Вас.

Задача Z7.3: https с валиден сертификат

Само за регистрирани курсисти. Отваряме https://<naam>/ и http://<naam>/ като браузър, от нашия уеб сървър.




Това, което въвеждате, и резултатите от проверката не се съхраняват. Браузърът Ви запомня отговорите и дали сте изпълнили задачата. Ако сте влезли, запазваме само дали задачата е била (почти) правилна в Моите курсове; и там можете да го изтриете.

Още за четене

Моля, изчакайте…

Настройте домейните си

За всеки домейн настройте сървърите за имена, връзката с хостинга и кой ще бъде собственикът.

Домейните Ви се зареждат…