JavaRush /Курси /Модуль 4: FastAPI /Налаштування SSL для безпечного доступу до API

Налаштування SSL для безпечного доступу до API

Модуль 4: FastAPI
Рівень 21 , Лекція 8
Відкрита

Коли ти відправляєш дані через інтернет, вони буквально пролітають повз десятки серверів і мережевих пристроїв. Без шифрування їх можна перехопити — як якби ти відправив важливого листа звичайною листівкою. SSL, а точніше його сучасний варіант TLS, перетворює цю листівку на надійний сейф: ніхто не зможе заглянути всередину, поки не дійде до отримувача.

За допомогою SSL/TLS ти не просто шифруєш дані, а й підтверджуєш, що клієнт спілкується саме з твоїм API, а не з кимось, хто видає себе за нього. Це захищає від підміни даних, крадіжки паролів та інших неприємностей. І не забувай: без SSL більшість браузерів сьогодні відразу показують попередження — і довіра до твого сервісу миттєво падає.


Як SSL/TLS працює у контексті API?

Коли користувач відправляє запит до API через HTTPS (а це "надбудова" над HTTP), браузер або клієнт і сервер виконують кілька етапів:

  1. Рукостискання (Handshake): клієнт і сервер домовляються про методи шифрування і перевіряють сертифікати.
  2. Встановлення захищеного з'єднання: використовується асиметричне шифрування для обміну ключами шифрування.
  3. Шифрування даних: після успішного рукостискання використовується симетричне шифрування для передачі даних.

Протокол SSL/TLS вимагає наявності сертифіката на стороні сервера, який підтверджує, що серверу можна довіряти.


Налаштування SSL/TLS в FastAPI

Крок 1: Встанови uvicorn з підтримкою HTTPS

FastAPI працює поверх ASGI-сервера Uvicorn, який підтримує SSL/TLS. Спочатку переконайся, що використовуєш останню версію Uvicorn:

pip install uvicorn[standard]

Крок 2: Отримай SSL-сертифікат

Для HTTPS-з'єднання тобі потрібен SSL-сертифікат. Є два варіанти:

  1. Безкоштовні сертифікати:
    Найпопулярніший варіант — Let's Encrypt. Це безкоштовно, просто і надійно.
  2. Платні сертифікати:
    Платні сертифікати часто пропонують хостинг-провайдери і вони дають додаткові рівні довіри (наприклад, з зеленою рядком у браузері).

Для тестування або локальної розробки можна створити самопідписаний сертифікат (self-signed certificate). Це не рекомендовано для продакшену.

Створення самопідписаного сертифікату:

openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout server.key -out server.crt
  • -x509: створює самопідписаний сертифікат.
  • -nodes: не запитувати пароль для ключа.
  • -days 365: строк дії сертифіката — 1 рік.
  • -newkey rsa:2048: створити новий ключ довжиною 2048 біт.
  • -keyout server.key: зберегти приватний ключ у server.key.
  • -out server.crt: зберегти сертифікат у server.crt.

Крок 3: Налаштування застосунку FastAPI для HTTPS

Тепер, коли в тебе є сертифікат (server.crt) і приватний ключ (server.key), налаштуй Uvicorn для використання HTTPS.

Створи файл app.py:


from fastapi import FastAPI

app = FastAPI()

@app.get("/")
def read_root():
    return {"message": "Ласкаво просимо до захищеного FastAPI API!"}

Запускай застосунок з SSL-ключами:

uvicorn app:app --host 0.0.0.0 --port 443 --ssl-keyfile server.key --ssl-certfile server.crt

Крок 4: Тестування HTTPS

  1. Відкрий браузер і перейди на https://localhost/. Ти побачиш повідомлення Ласкаво просимо до захищеного FastAPI API!.
  2. Якщо ти використовуєш самопідписаний сертифікат, браузер може попередити про небезпеку з'єднання. Це нормально для localhost і тестування.

Приклади налаштування SSL для продакшену

Якщо ти працюєш у продакшен-середовищі, безпека має критичне значення. Ось кілька порад з налаштування.

Використання Let’s Encrypt у продакшені

Для продакшену найкраще використовувати автоматичний процес генерації сертифікатів за допомогою Let's Encrypt і утиліти Certbot.

Встанови Certbot:


sudo apt update
sudo apt install certbot

Згенеруй сертифікат за допомогою Certbot:


sudo certbot certonly --standalone -d yourdomain.com

Твої сертифікати будуть у директорії /etc/letsencrypt/live/yourdomain.com/:

  • fullchain.pem: сертифікат.
  • privkey.pem: приватний ключ.

Налаштуй Uvicorn для використання цих файлів:


uvicorn app:app --host 0.0.0.0 --port 443 --ssl-keyfile /etc/letsencrypt/live/yourdomain.com/privkey.pem --ssl-certfile /etc/letsencrypt/live/yourdomain.com/fullchain.pem

Використання Nginx для проксування

У продакшені найкраще використовувати веб‑сервер типу Nginx або Apache, щоб обробляти SSL/TLS, а потім проксувати запити до FastAPI.

Встанови Nginx:


sudo apt update
sudo apt install nginx

Створи конфігурацію для твого домену в /etc/nginx/sites-available/yourdomain.com:


server {
    listen 80;
    server_name yourdomain.com;
    return 301 https://$server_name$request_uri;
}

server {
    listen 443 ssl;
    server_name yourdomain.com;

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

    location / {
        proxy_pass http://127.0.0.1:8000;
        proxy_set_header Host $host;
        proxy_set_header X-Real-IP $remote_addr;
        proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
    }
}

Перевір конфігурацію і перезапусти Nginx:


sudo nginx -t
sudo systemctl reload nginx

Тепер твоє API доступне за адресою https://yourdomain.com.


Типові помилки та як їх виправити

  • Помилка: "SSL_ERROR_RX_RECORD_TOO_LONG."
    Ця помилка часто вказує на проблему з портом або неправильними сертифікатами. Переконайся, що застосунок запускається на порту 443 з коректними сертифікатами.
  • Помилка: "NET::ERR_CERT_AUTHORITY_INVALID."
    Самопідписані сертифікати викликають такі попередження. Для продакшену використовуй сертифікати від Let’s Encrypt.
  • Помилка: "502 Bad Gateway" з Nginx.
    Переконайся, що FastAPI запущений на правильному хості і порті, вказаному в proxy_pass.

Підсумкові поради

  • Ніколи не відправляй дані без SSL/TLS у продакшені.
  • Використовуй автоматичне оновлення сертифікатів (наприклад, через Certbot), щоб продовжувати їхню дію.
  • Тестуй застосунок з HTTPS перед виходом у продакшен, щоб уникнути несподіваних проблем.
Коментарі
ЩОБ ПОДИВИТИСЯ ВСІ КОМЕНТАРІ АБО ЗАЛИШИТИ КОМЕНТАР,
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ