Nginx

SSL/HTTPS sozlash

Bugungi kunda har bir jiddiy sayt HTTPS orqali ishlashi shart. Bu ma'lumotni shifrlaydi va foydalanuvchi ishonchini oshiradi. Ushbu darsda nima uchun HTTPS zarurligini, bepul sertifikat olishni (Let's Encrypt / certbot), Nginx'da SSL sozlashni va HTTP'dan HTTPS'ga yo'naltirishni batafsil o'rganamiz.

Nega HTTPS kerak?

HTTP โ€” oddiy, shifrlanmagan protokol. Uning kamchiligi: brauzer bilan server o'rtasidagi ma'lumot ochiq (matn ko'rinishida) uzatiladi. Buni yo'ldagi har qanday oraliq (masalan, ochiq Wi-Fi tarmog'idagi hujumchi) o'qishi mumkin โ€” parollar, kredit karta ma'lumotlari va h.k.

HTTPS (HTTP + TLS/SSL shifrlash) esa bu muammoni hal qiladi:

HTTPS ishlashi uchun serverga SSL sertifikat kerak. Bu โ€” ishonchli tashkilot (Certificate Authority, CA) tomonidan berilgan raqamli hujjat bo'lib, saytingiz haqiqiyligini tasdiqlaydi.

Let's Encrypt va certbot

Ilgari SSL sertifikatlar pullik edi. Endi Let's Encrypt degan bepul, avtomatlashtirilgan sertifikat markazi mavjud. Uni ishlatishning eng oson yo'li โ€” certbot vositasi. Certbot sertifikatni oladi, Nginx config'ini avtomatik sozlaydi va sertifikatni yangilab turadi.

Certbot'ni o'rnatish (Ubuntu misolida):

sudo apt update
sudo apt install certbot python3-certbot-nginx

Bu yerda python3-certbot-nginx โ€” certbot'ning Nginx bilan avtomatik ishlash uchun qo'shimchasi (plugin).

certbot --nginx bilan avtomatik sozlash

Eng oson usul โ€” certbot'ga hamma ishni topshirish. U sertifikatni oladi va Nginx config'ini o'zi tahrirlaydi:

sudo certbot --nginx -d mysite.com -d www.mysite.com

Bu buyruq bajarilishida certbot quyidagilarni qiladi:

  1. Let's Encrypt'dan mysite.com va www.mysite.com uchun sertifikat so'raydi;
  2. Domen haqiqatan ham sizga tegishli ekanini tekshiradi;
  3. Sertifikat fayllarini serverga saqlaydi;
  4. Nginx config'iga listen 443 ssl va sertifikat yo'llarini avtomatik qo'shadi;
  5. HTTP'dan HTTPS'ga yo'naltirishni sozlashni taklif qiladi;
  6. Nginx'ni qayta yuklaydi.
Ko'p hollarda certbot --nginx yetarli โ€” u hammasini o'zi bajaradi. Lekin nima sodir bo'layotganini tushunish uchun quyida qo'lda sozlashni ham ko'rib chiqamiz.

Sertifikatni qo'lda sozlash

Certbot sertifikat olgach, uni olganda fayllar odatda /etc/letsencrypt/live/mysite.com/ papkasida saqlanadi. Nginx config'ida ularni quyidagicha ko'rsatamiz:

server {
    listen 443 ssl;
    server_name mysite.com www.mysite.com;

    ssl_certificate     /etc/letsencrypt/live/mysite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem;

    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Asosiy direktivalar:

privkey.pem โ€” sizning maxfiy kalitingiz. U hech qachon ommaga oshkor bo'lmasligi kerak. Agar kimdir uni qo'lga kiritsa, u sizning nomingizdan shifrlangan trafikni o'qiy oladi. Fayl ruxsatlari faqat root uchun ochiq bo'lishi shart.

HTTP'dan HTTPS'ga yo'naltirish

Sayt HTTPS'da ishlashi kerak bo'lsa ham, kimdir hali ham http://mysite.com (80-port) ga kirishi mumkin. Bunday so'rovlarni avtomatik ravishda HTTPS'ga yo'naltirish (redirect) kerak. Buning uchun alohida server bloki yaratamiz:

# 80-portdagi (HTTP) barcha so'rovlarni HTTPS'ga yo'naltirish
server {
    listen 80;
    server_name mysite.com www.mysite.com;

    return 301 https://$host$request_uri;
}

# asosiy HTTPS server
server {
    listen 443 ssl;
    server_name mysite.com www.mysite.com;

    ssl_certificate     /etc/letsencrypt/live/mysite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem;

    root /var/www/mysite;
    index index.html;

    location / {
        try_files $uri $uri/ =404;
    }
}

Yo'naltirish qatorini batafsil ko'raylik:

return 301 https://$host$request_uri;

Natijada foydalanuvchi http://mysite.com/blog ga kirsa, avtomatik ravishda https://mysite.com/blog ga o'tkaziladi โ€” aynan o'sha sahifaga, lekin xavfsiz protokolda.

return 301 โ€” doimiy yo'naltirish; brauzer va qidiruv tizimlari buni eslab qoladi. Vaqtinchalik yo'naltirish uchun 302 ishlatiladi, lekin HTTP→HTTPS uchun doim 301 to'g'ri variant.

Qo'shimcha SSL sozlamalari

Xavfsizlikni oshirish uchun ba'zi qo'shimcha direktivalar tavsiya etiladi (certbot ularni ko'pincha o'zi qo'shadi):

server {
    listen 443 ssl;
    server_name mysite.com;

    ssl_certificate     /etc/letsencrypt/live/mysite.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/mysite.com/privkey.pem;

    # faqat zamonaviy, xavfsiz protokollarga ruxsat
    ssl_protocols TLSv1.2 TLSv1.3;

    # server tanlagan shifrlash usulini afzal ko'rish
    ssl_prefer_server_ciphers on;

    # SSL sessiyalarini keshlash (tezlik uchun)
    ssl_session_cache shared:SSL:10m;
    ssl_session_timeout 10m;
}

Sertifikatni avtomatik yangilash

Let's Encrypt sertifikatlari 90 kun amal qiladi. Ularni muntazam yangilab turish kerak. Certbot buni avtomatlashtiradi โ€” u odatda tizimga rejalashtirilgan vazifa (timer/cron) o'rnatadi. Yangilashni sinab ko'rish uchun:

sudo certbot renew --dry-run

--dry-run โ€” haqiqiy yangilamasdan, jarayonni sinovdan o'tkazadi. Agar bu buyruq xatosiz ishlasa, avtomatik yangilash ham to'g'ri ishlaydi degani. Muddati yaqinlashgan sertifikatlarni haqiqatan yangilash uchun oddiy sudo certbot renew ishlatiladi.

Sertifikat yangilangach, Nginx yangi sertifikatni o'qishi uchun qayta yuklanishi kerak. Certbot buni odatda avtomatik bajaradi, lekin qo'lda yangilaganda sudo nginx -s reload ni unutmang.

Xulosa