Коли ти відправляєш дані через інтернет, вони буквально пролітають повз десятки серверів і мережевих пристроїв. Без шифрування їх можна перехопити — як якби ти відправив важливого листа звичайною листівкою. SSL, а точніше його сучасний варіант TLS, перетворює цю листівку на надійний сейф: ніхто не зможе заглянути всередину, поки не дійде до отримувача.
За допомогою SSL/TLS ти не просто шифруєш дані, а й підтверджуєш, що клієнт спілкується саме з твоїм API, а не з кимось, хто видає себе за нього. Це захищає від підміни даних, крадіжки паролів та інших неприємностей. І не забувай: без SSL більшість браузерів сьогодні відразу показують попередження — і довіра до твого сервісу миттєво падає.
Як SSL/TLS працює у контексті API?
Коли користувач відправляє запит до API через HTTPS (а це "надбудова" над HTTP), браузер або клієнт і сервер виконують кілька етапів:
- Рукостискання (Handshake): клієнт і сервер домовляються про методи шифрування і перевіряють сертифікати.
- Встановлення захищеного з'єднання: використовується асиметричне шифрування для обміну ключами шифрування.
- Шифрування даних: після успішного рукостискання використовується симетричне шифрування для передачі даних.
Протокол SSL/TLS вимагає наявності сертифіката на стороні сервера, який підтверджує, що серверу можна довіряти.
Налаштування SSL/TLS в FastAPI
Крок 1: Встанови uvicorn з підтримкою HTTPS
FastAPI працює поверх ASGI-сервера Uvicorn, який підтримує SSL/TLS. Спочатку переконайся, що використовуєш останню версію Uvicorn:
pip install uvicorn[standard]
Крок 2: Отримай SSL-сертифікат
Для HTTPS-з'єднання тобі потрібен SSL-сертифікат. Є два варіанти:
- Безкоштовні сертифікати:
Найпопулярніший варіант — Let's Encrypt. Це безкоштовно, просто і надійно. - Платні сертифікати:
Платні сертифікати часто пропонують хостинг-провайдери і вони дають додаткові рівні довіри (наприклад, з зеленою рядком у браузері).
Для тестування або локальної розробки можна створити самопідписаний сертифікат (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
- Відкрий браузер і перейди на
https://localhost/. Ти побачиш повідомленняЛаскаво просимо до захищеного FastAPI API!. - Якщо ти використовуєш самопідписаний сертифікат, браузер може попередити про небезпеку з'єднання. Це нормально для 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 перед виходом у продакшен, щоб уникнути несподіваних проблем.
ПЕРЕЙДІТЬ В ПОВНУ ВЕРСІЮ