Что заставило бы сервер Gunicorn, на котором запущено приложение Flask, сообщать об ошибке "sslv3 alert certificate unknown" в браузере, когда сервер Apache, на котором запущено приложение WSGI, использует точно такой же сертификат на на той же машине, не сообщает о проблемах?
Служба Gunicorn размещается в домене https://mysub.example.com:1234 , а служба Apache размещается на стандартном порту 80 по адресу https://mysub.example.com .
Обе службы размещаются на одном физическом сервере и загружают подстановочный SSL-сертификат, расположенный в / etc / ssl / certs
.
Журналы из Gunicorn / Flask не обеспечивают особой обратной связи и просто показывают:
[2021-06-23 12:55:34 -0500] [2320785] [DEBUG] Error processing SSL request.
[2021-06-23 12:55:34 -0500] [2320785] [DEBUG] Invalid request from ip=123.45.678.90: [SSL: SSLV3_ALERT_CERTIFICATE_UNKNOWN] sslv3 alert certificate unknown (_ssl.c:2633)
Сервер Gunicorn запускается через Supervisor с пользователем www-data
командой:
/usr/local/alphabuyer/.env/bin/gunicorn --certfile=/etc/ssl/certs/example.com.crt --keyfile=/etc/ssl/certs/example.com.key --bind 0.0.0.0:1234 server:app
Между тем, настройки SSL для конфигурации Apache:
SSLEngine On
SSLCertificateFile /etc/ssl/certs/example.com.crt
SSLCertificateKeyFile /etc/ssl/certs/example.com.key
SSLCACertificateFile /etc/ssl/certs/example.com.intermediate.crt
SSLProtocol all
SSLCipherSuite HIGH:MEDIUM
Я проверил разрешения в / etc / ssl / certs
, и они кажутся правильными. Все принадлежит пользователю www-data
изменено на 600.
Я не вижу причин, по которым сертификат будет правильно обслуживаться Apache, а не Gunicorn. Сообщение об ошибке предполагает, что это не обязательно что-то, что обслуживает Gunicorn, а ошибка или какая-то поддерживаемая функция с запросом, который делает браузер.Что мне здесь не хватает?
Моя проблема была, по сути, дубликатом этого вопроса , а основная причина заключалась в том, что мои клиентские сертификаты устарели.
Этот ответ решил мою проблему, обновив мой локальный пакет ca-сертификатов
.
Gunicorn (и практически все остальное, что делает TLS кроме Apache) ожидает, что ваш сертификат TLS будет скомпонован с промежуточными сертификатами в одном файле.
Создайте конкатенированный файл:
cat /etc/ssl/certs/example.com.crt /etc/ssl/certs/example.com.intermediate.crt > /etc/ssl/certs/example.com.chain.crt
Теперь используйте его в командной строке.
.... --certfile=/etc/ssl/certs/example.com.chain.crt ....