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



我正在运行一个带有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_procol"、"REQUEstrongCHEME"、"HTTPS"、"REMOTE_ADDR","REMOTE_PORT"、"SERVER_PORT","SERVER_NAME"、"HTTP_CONTENT_TYPE","HTTP_CACHE_CONTROL"、"HTTP_POSTMAN_TOKEN"、"https_USER_AGENT","HTTP_ACCEPT"、"HTTP_HOST"、"https_ACCEPT_ENCODING","HTTP_CONTENT_LENGTH","HTTP_CONNECTION","wsgi.input",'wsgi.file_wrapper','wsgi.version','wsgi.errors','wsgi.run_once',"wsgi.多线程"、"wsgi.multiprocess"、"wsgi.url_scheme","uwsgi.version"、"uwsgi.node"、"werkzeug.request"](

显然,这是由于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

最新更新