Darslik · 2026-08-16 · ~4 daqiqa o‘qiladi · o'rta
Let's Encrypt bilan HTTPS: o'n daqiqalik ish va bitta muhim timer
Mundarija
Avvalgi qismda sayt 80-portda ochildi, lekin trafik hali ochiq matnda yurmoqda: orada turgan har kim so'rovlarni o'qiy oladi, brauzerlar esa "Not secure" deb turadi. TLS qanday ishlashini nazariy tomondan alohida maqolada yozganman — bugun esa faqat amaliyot: o'n daqiqada sertifikat olamiz va u o'z-o'zidan yangilanib turishini kafolatlaymiz. Aynan shu jarayonni shu saytning o'zida ham o'tkazganman.
certbot: o'rnatish va sertifikat olish#
Let's Encrypt sertifikatlari bilan ishlashning standart asbobi — certbot. Ubuntu'da uni snap orqali o'rnatish tavsiya qilinadi, chunki apt'dagi versiya ancha orqada yuradi:
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot
Sertifikat olishdan oldin ikki narsa tayyor bo'lishi shart: domen A-yozuvi serverga qaragan bo'lishi va 80-port ochiq bo'lishi (Let's Encrypt shu port orqali "bu domen haqiqatan sizning qo'lingizdami" deb tekshiradi — 1-qismdagi ufw sozlamalarida 80 ochiq edi). Endi bitta buyruq:
sudo certbot --nginx -d mysite.uz -d www.mysite.uz
--nginx rejimida certbot hammasini o'zi qiladi: domen egaligini tekshiradi,
sertifikat oladi, nginx konfiguratsiyasiga SSL qatorlarini yozadi va HTTP'dan
HTTPS'ga redirect'ni ham taklif qiladi (rozilik bering). Ish tugagach
konfiguratsiyaga qarasangiz, o'sha faylingizda yangi qatorlar paydo bo'lganini
ko'rasiz:
# certbot qo'shgan qatorlar (qo'lda yozish shart emas edi):
listen 443 ssl;
ssl_certificate /etc/letsencrypt/live/mysite.uz/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/mysite.uz/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
Brauzerda tekshiramiz — qulf paydo bo'ldi. Lekin ish hali tugagani yo'q, eng muhim qismi oldinda.
Yangilanish: 90 kunlik sertifikat va uni unutmaslik san'ati#
Let's Encrypt sertifikati atigi 90 kun yashaydi. Bu ataylab qilingan: qisqa muddat o'g'irlangan sertifikatning zararini cheklaydi va hammani avtomatlashtirishga majbur qiladi. Yaxshiyamki, certbot o'rnatilganda o'zi bilan systemd timer olib keladi:
systemctl list-timers | grep certbot
# certbot.timer — kuniga ikki marta uyg'onib, muddati yaqin sertifikatlarni yangilaydi
Timer bor-yo'qligini ko'rish yetarli emas — yangilanish haqiqatan o'tishini sinab ko'ring:
sudo certbot renew --dry-run
Bu buyruq to'liq yangilanish jarayonini "quruq" o'tkazadi: tekshiruv, yangi sertifikat, nginx reload — faqat haqiqiy sertifikatga tegmasdan. Xatosiz o'tsa, 90 kundan keyin ham hech narsani eslab o'tirmaysiz.
80-portni yopib qo'ymang
HTTPS ishlagach "80 endi keraksiz" degan xayol keladi — va uni firewall'da yopgan odam uch oydan keyin sertifikati yangilanmay qolganini ko'radi, chunki Let's Encrypt tekshiruvi 80-port orqali keladi. Redirect uchun ham, yangilanish uchun ham 80 ochiq qolishi kerak.
Django tomonini HTTPS'ga moslash#
Nginx endi HTTPS'ni ko'taryapti, lekin Django hali eski dunyoda yashayapti. Uchta sozlama qo'shamiz:
# config/settings.py (production)
# nginx X-Forwarded-Proto yuborayotgan edi (3-qism) — endi undan foydalanamiz:
SECURE_PROXY_SSL_HEADER = ("HTTP_X_FORWARDED_PROTO", "https")
# cookie'lar faqat HTTPS orqali yursin
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
# Django 4+ da POST formalar uchun ishonchli manbalar ro'yxati
CSRF_TRUSTED_ORIGINS = ["https://mysite.uz", "https://www.mysite.uz"]
Redirect'ni nginx qilayotgani uchun SECURE_SSL_REDIRECT shart emas —
so'rov Django'ga yetib kelguncha allaqachon HTTPS bo'ladi.
HSTS: brauzerga "faqat HTTPS" deyish#
Hammasi ishlayotganiga bir-ikki kun ishonch hosil qilgach, yana bir qadam tashlash mumkin — HSTS. Bu header brauzerga "bu sayt bilan bundan keyin faqat HTTPS'da gaplash" deydi va birinchi so'rovdagi redirect'ni ham keraksiz qiladi:
# server (443) blokiga:
add_header Strict-Transport-Security "max-age=31536000" always;
HSTS — shoshilmasdan yoqiladigan narsa
max-age bir yil degani: brauzer shu muddat davomida saytga HTTP orqali
kirishga umuman urinmaydi. Agar HTTPS'da biror muammo chiqib qolsa,
"vaqtincha HTTP'ga qaytib turamiz" degan yo'l yopiq bo'ladi. Shuning
uchun avval kichik max-age bilan (masalan 3600) bir hafta sinab, keyin
yillik qiymatga o'ting.
Yakuniy tekshiruv#
# HTTP redirect ishlayaptimi?
curl -I http://mysite.uz/ # 301, Location: https://...
# HTTPS to'g'ri javob beryaptimi?
curl -I https://mysite.uz/ # 200, strict-transport-security ko'rinadi
# sertifikat muddati va kimga berilgani:
echo | openssl s_client -connect mysite.uz:443 2>/dev/null | openssl x509 -noout -dates -subject
Chuqurroq baho kerak bo'lsa, SSL Labs testidan o'tkazing (ssllabs.com) — yuqoridagi sozlamalar bilan A baho odatiy natija.
Sayt endi to'liq zanjirda: firewall, systemd, nginx va TLS. Keyingi qismda serverni o'z-o'ziga xizmat qildirishni boshlaymiz: systemd timerlar bilan muntazam vazifalar va bazani avtomatik backup qilish.