当运行 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-data
chmoded 为 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 ....