将 $ssl_client_s_dn 从 nginx/uwsgi 传递到烧瓶应用程序

Posted

技术标签:

【中文标题】将 $ssl_client_s_dn 从 nginx/uwsgi 传递到烧瓶应用程序【英文标题】:Pass $ssl_client_s_dn from nginx/uwsgi to flask app 【发布时间】:2019-04-05 22:07:40 【问题描述】:

我正在运行一个带有uWSGInginx 的Python Web 服务器,其基本映像为tiangolo/uwsgi-nginx-flask

如果存在,我想传递我的客户端证书 DN。为此,我定义了以下nginx.conf

uwsgi_read_timeout 300;

ssl_certificate     /app/cert.pem;
ssl_certificate_key /app/key.pem;
ssl_password_file   /app/password.pass;

ssl_client_certificate  /app/client-ca.crt;
ssl_verify_client optional;
ssl_verify_depth 2;

include uwsgi_params;
uwsgi_param HTTP_X_DN $ssl_client_s_dn;

我希望我的 Flask 代码接收 HTTP_X_DN 参数,但找不到方法。

环顾四周,我发现它应该驻留在flaskrequest.environ 对象中,但是在打印环境内容时我没有看到任何这样的键。

作为参考,request.environ.keys() 通过 Postman 发送请求时返回以下内容:

dict_keys(['QUERY_STRING', 'REQUEST_METHOD', 'CONTENT_TYPE', 'CONTENT_LENGTH'、'REQUEST_URI'、'PATH_INFO'、'DOCUMENT_ROOT'、 'SERVER_PROTOCOL'、'REQUEST_SCHEME'、'HTTPS'、'REMOTE_ADDR'、 'REMOTE_PORT'、'SERVER_PORT'、'SERVER_NAME'、'HTTP_CONTENT_TYPE'、 'HTTP_CACHE_CONTROL'、'HTTP_POSTMAN_TOKEN'、'HTTP_USER_AGENT'、 'HTTP_ACCEPT'、'HTTP_HOST'、'HTTP_ACCEPT_ENCODING'、 'HTTP_CONTENT_LENGTH'、'HTTP_CONNECTION'、'wsgi.input'、 'wsgi.file_wrapper', 'wsgi.version', 'wsgi.errors', 'wsgi.run_once', 'wsgi.multithread', 'wsgi.multiprocess', 'wsgi.url_scheme', 'uwsgi.version', 'uwsgi.node', 'werkzeug.request'])

【问题讨论】:

【参考方案1】:

这显然是由于 docker 镜像暴露的配置限制造成的。

见https://github.com/tiangolo/uwsgi-nginx-flask-docker/issues/103

您现在可以完全覆盖nginx.conf,而之前我只覆盖了app.conf

无论如何,这是一个效果最好的小解决方法,请将其添加到/app/prestart.sh

#!/usr/bin/env bash
ex -sc '%s/include uwsgi_params;/include uwsgi_params; uwsgi_param SSL_CLIENT_S_DN $ssl_client_s_dn;/g|x' /etc/nginx/conf.d/nginx.conf

【讨论】:

以上是关于将 $ssl_client_s_dn 从 nginx/uwsgi 传递到烧瓶应用程序的主要内容,如果未能解决你的问题,请参考以下文章

ngin隐藏版本号

Ngins 配置常用八大实例

ubuntu Ngin Install

shell编写 ngin启动脚本

ngin负载均衡集群

用shell写ngin启动脚本