不使用Nginx时如何向uWSGI传递请求头?
移除Nginx后uWSGI+Connexion SSL认证失效的解决办法
问题背景
之前通过Nginx反向代理uWSGI,利用uwsgi_param配置传递X.509证书相关请求头(如X-Ssl-Client-Dn)给Connexion框架,实现SSL客户端认证。移除Nginx直接用uWSGI对外服务后,SSL认证完全失效,排查发现核心原因是Connexion无法获取到处理证书授权所需的X-Ssl-Client-Dn请求头。
尝试给uWSGI添加--ssl-verify-depth 2参数时,启动报错unable to load configuration from 2;移除该参数后uWSGI能正常启动,但请求头传递的问题仍未解决。
错误根源
- 参数格式错误:
--ssl-verify-depth参数需要用等号和值绑定(如--ssl-verify-depth=2),空格分隔会被uWSGI误判为配置文件路径,导致启动失败。 - uWSGI默认不注入证书请求头:即使SSL验证配置正确,uWSGI不会自动将客户端证书的DN等信息添加到HTTP请求头中,这才是Connexion无法获取认证信息的根本原因。
解决步骤
1. 修正uWSGI启动参数格式
将--ssl-verify-depth 2改为--ssl-verify-depth=2,避免启动报错。
2. 配置uWSGI自动注入证书请求头
使用uWSGI的route-run指令,将内置的证书变量注入到请求头中,模拟Nginx的uwsgi_param效果:
命令行启动示例
uwsgi --https 0.0.0.0:443,server.crt,server.key,ca.crt \ --ssl-verify-client=required \ --ssl-verify-depth=2 \ --route-run 'addheader X-Ssl-Client-Dn ${ssl_client_dn}' \ --route-run 'addheader X-Ssl-Client-Verify ${ssl_client_verify}' \ # 其他原有uWSGI参数(如模块、进程数等)
INI配置文件示例
[uwsgi] https = 0.0.0.0:443,server.crt,server.key,ca.crt ssl-verify-client = required ssl-verify-depth = 2 # 注入证书DN和验证结果到请求头 route-run = addheader X-Ssl-Client-Dn ${ssl_client_dn} route-run = addheader X-Ssl-Client-Verify ${ssl_client_verify} # 原有配置 module = your_connexion_app:app processes = 4 threads = 2
3. 保持Connexion端逻辑不变
Connexion框架的认证逻辑无需修改,依然从请求头中读取X-Ssl-Client-Dn即可,和Nginx代理时的处理逻辑一致。
验证方法
用带客户端证书的curl命令测试:
curl -E client.crt --key client.key --cacert ca.crt https://your-server-domain/api/your-endpoint
在Connexion的接口处理函数中打印请求头,确认X-Ssl-Client-Dn存在且值与客户端证书的DN一致。
内容的提问来源于stack exchange,提问作者Goran K.
相关产品推荐
相关产品推荐

