将$ ssl_client_s_dn从Nginx / uwsgi传递到flask应用

时间:2018-11-01 16:28:29

标签: python nginx flask uwsgi client-certificates

我正在使用uWSGInginx,并且基本映像为tiangolo/uwsgi-nginx-flask的Python Web服务器。

如果存在我的客户证书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参数,但是找不到方法。

从周围看,我发现它应该位于request.environ的{​​{1}}对象中,但是在打印环境内容时我看不到任何这样的键。

作为参考,flask在通过邮递员发送请求时返回以下内容:

  

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 个答案:

答案 0 :(得分:0)

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