Настройка Django и MinIO с использованием HTTPS на одном сервере
Я установил MinIO в качестве хранилища объектов моего приложения Django и интегрировал функциональность этого модуля на том же сервере. Я следовал инструкции в django-minio-backend
, но получил следующую ошибку.
urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='subdomain.domain.org', port=9000): Max retries exceeded with url: /django-backend-dev-public (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)')))
Несколько контекстных вопросов для среды установки:
На сервере установлена операционная система
.Ubuntu
22.04 LTS. ВерсияMinIO
- 2024-08-03T04-33-23Z. ВерсияDjango
- 5.0.6Настройка MinIO отлично работала, когда я настроил ее на использование незащищенных соединений (http), а Django запускался на сервере без защиты. Веб-приложение Django могло загружать файлы и изображения на сервер MinIO без каких-либо проблем.
Ошибка началась, когда я обновил настройки MinIO, чтобы он работал только с защищенными соединениями. В WebUI сервер прекрасно загружается по протоколу https (т.е. я могу войти в консоль, используя https://subdomain.domain.org:9000)
Безопасная настройка осуществляется путем привязки MinIO к папке SSL сертификатов на сервере (/opt/minio/certs), которая содержит
.public.crt
иprivate.key
Соответствующие строки для настройки MinIO для моего веб-приложения Django в файле settings.py выглядят следующим образом:
ALLOWED_HOSTS = [
'localhost',
'127.0.0.1',
'subdomain.domain.org'
]
CSRF_TRUSTED_ORIGINS = [
'https://subdomain.domain.org',
'https://127.0.0.1',
'https://localhost'
]
CSRF_ALLOWED_ORIGINS = ["https://subdomain.domain.org", "https://localhost"]
CORS_ORIGINS_WHITELIST = ["https://subdomain.domain.org", "https://localhost"]
INTERNAL_IPS = ['127.0.0.1', 'localhost', 'subdomain.domain.org']
MINIO_CONSISTENCY_CHECK_ON_START = True
MINIO_ENDPOINT = 'subdomain.domain.org:9000'
MINIO_EXTERNAL_ENDPOINT = 'subdomain.domain.org:9000'
MINIO_EXTERNAL_ENDPOINT_USE_HTTPS = True
MINIO_REGION = 'eu-west-1' # Default is set to None, current is Ireland
MINIO_ACCESS_KEY = 'XXXXXX'
MINIO_SECRET_KEY = 'YYYYY'
MINIO_USE_HTTPS = True
MINIO_URL_EXPIRY_HOURS = timedelta(
days=1) # Default is 7 days (longest) if not defined
MINIO_PRIVATE_BUCKETS = ['django-backend-dev-private', ]
MINIO_PUBLIC_BUCKETS = ['django-backend-dev-public', ]
MINIO_POLICY_HOOKS: List[Tuple[str, dict]] = []
MINIO_MEDIA_FILES_BUCKET = 'bridge-media-files-bucket'
MINIO_PRIVATE_BUCKETS.append(MINIO_MEDIA_FILES_BUCKET)
MINIO_STATIC_FILES_BUCKET = 'bridge-static-files-bucket'
MINIO_PRIVATE_BUCKETS.append(MINIO_STATIC_FILES_BUCKET)
MINIO_BUCKET_CHECK_ON_SAVE = True
# SSL
SECURE_PROXY_SSL_HEADER = ('HTTP_X_FORWARDED_PROTO', 'https')
SECURE_SSL_REDIRECT = True
SECURE_HSTS_SECONDS = 31536000 # 1 year
SECURE_HSTS_INCLUDE_SUBDOMAINS = True
SECURE_HSTS_PRELOAD = True
SESSION_COOKIE_SECURE = True
CSRF_COOKIE_SECURE = True
У кого-нибудь может возникнуть идея, почему безопасная конфигурация выдает ошибку urllib3.exceptions.MaxRetryError: HTTPSConnectionPool(host='subdomain.domain.org', port=9000): Max retries exceeded with url: /django-backend-dev-public (Caused by SSLError(SSLCertVerificationError(1, '[SSL: CERTIFICATE_VERIFY_FAILED] certificate verify failed: unable to get local issuer certificate (_ssl.c:1006)')))