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": "Welcome to the secure 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/. Вы увидите сообщение Welcome to the secure 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 до выхода в продакшен, чтобы избежать неожиданных проблем.
1
Задача
Модуль 4: FastAPI, 21 уровень, 8 лекция
Недоступна
Создание самоподписанного SSL-сертификата
Создание самоподписанного SSL-сертификата
1
Задача
Модуль 4: FastAPI, 21 уровень, 8 лекция
Недоступна
С использованием Let’s Encrypt
С использованием Let’s Encrypt
Комментарии
ЧТОБЫ ПОСМОТРЕТЬ ВСЕ КОММЕНТАРИИ ИЛИ ОСТАВИТЬ КОММЕНТАРИЙ,
ПЕРЕЙДИТЕ В ПОЛНУЮ ВЕРСИЮ