Gunicorn/Flask 拒绝与 Apache 兼容的相同 SSL 证书

Gunicorn/Flask 拒绝与 Apache 兼容的相同 SSL 证书

当运行 WSGI 应用程序的 Apache 服务器(在同一台机器上使用完全相同的证书)没有报告任何问题时,为什么运行 Flask 应用程序的 Gunicorn 服务器会在浏览器中报告“sslv3 警报证书未知”错误?

Gunicorn 服务由域托管https://mysub.example.com:1234Apache 服务从标准端口 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

同时,Apache 配置的 SSL 设置是:

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-datachmoded 为 600 的用户所有。

我看不出 Apache 能正确提供证书而 Gunicorn 却不能提供证书的任何原因。错误消息表明这不一定是 Gunicorn 提供的任何东西,而是浏览器发出的请求中的错误或某些支持的功能。我在这里遗漏了什么?

答案1

Gunicorn(以及几乎所有其他支持 TLS 的东西除了Apache 软件基金会 (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 ....

答案2

我的问题基本上是这个问题,根本原因是我的客户端证书已过期。

这个答案通过更新本地ca-certificates包解决了我的问题。

相关内容