Nginx反向代理通过客户端证书

我正尝试通过Nginx反向代理设置负载均衡器。 我的应用程序使用客户端证书来validation客户端。 我想我的反向代理将客户端证书转发到我的后端服务器。 我已将此行添加到反向代理的configuration中,以将客户端证书信息存储在自定义HTTP标头中:

proxy_set_header X-SSL-CERT $ssl_client_cert 

但是, $ssl_client_cert使用多行来存储证书,而我的后端nginx服务器无法正确识别为一个HTTP头。 什么是最好的方式来实现我的客户证书?

这个问题已经在2013年被问到了这个论坛上,但到目前为止还没有真正的解决scheme: https : //forum.nginx.org/read.php?2,236546,236546

谢谢!

所以我find了一个解决scheme。 我删除证书中的所有换行符,并将它们作为单个HTTP头从代理发送到后端,类似于此处所述:

https://forum.nginx.org/read.php?2,236546,236546

在我的后端,我通过每64个字符添加一个换行来重build证书。 反向代理的更新代码如下,最多可处理26行:

 map $ssl_client_raw_cert $a { "~^(-.*-\n)(?<st>[^\n]+)\n((?<b>[^\n]+)\n)?((?<c>[^\n]+)\n)?((?<d>[^\n]+)\n)?((?<e>[^\n]+)\n)?((?<f>[^\n]+)\n)?((?<g>[^\n]+)\n)?((?<h>[^\n]+)\n)?((?<i>[^\n]+)\n)?((?<j>[^\n]+)\n)?((?<k>[^\n]+)\n)?((?<l>[^\n]+)\n)?((?<m>[^\n]+)\n)?((?<n>[^\n]+)\n)?((?<o>[^\n]+)\n)?((?<p>[^\n]+)\n)?((?<q>[^\n]+)\n)?((?<r>[^\n]+)\n)?((?<s>[^\n]+)\n)?((?<t>[^\n]+)\n)?((?<v>[^\n]+)\n)?((?<u>[^\n]+)\n)?((?<w>[^\n]+)\n)?((?<x>[^\n]+)\n)?((?<y>[^\n]+)\n)?((?<z>[^\n]+)\n)?(-.*-)$" $st; } server { location / { proxy_set_header X-cert $a$b$c$d$e$f$g$h$i$j$k$l$m$n$o$p$q$r$s$t$v$u$w$x$y$z; proxy_pass http://localhost:8000; } } 

(注意,我已经删除了以数字开头的variables)虽然这个解决scheme不是很理想,但是这个时候对我来说还是有效的。 另一个解决scheme是只发送证书的DN信息,这是一个单一的行。 这对我来说现在不适用,因为我没有在我的数据库中存储每个DN。

我在这里看到2个解决scheme

  1. 启用LUA脚本并以无行尾格式重新格式化string。
  2. 使用Set Misc插件并在该variables上使用base64_encode。

看起来新版本的nginx在variables$ssl_client_cert \n全部更改为\t 。 如果您不希望应用该转换,则variables$ssl_client_raw_cert可用。

请参阅: http : //nginx.org/en/docs/http/ngx_http_ssl_module.html#variables

这是我工作的LUA解决scheme:

 set_by_lua $client_cert "return ngx.var.ssl_client_raw_cert and ngx.var.ssl_client_raw_cert:gsub('\\n',' ') or nil"; proxy_set_header X-SSL-CERT $client_cert; 

另外,如果你使用Ubuntu,默认情况下nginx-extra有LUA插件,所以不需要额外的configuration: https : //stackoverflow.com/questions/22193852/running-lua-in-nginx-config