如何通过两个服务器nginx传递客户端证书?

时间:2015-09-04 17:20:53

标签: ssl nginx proxy reverse-proxy client-certificates

我有理由在应用程序服务器之前使用两个nginx服务器。 两个nginx服务器都使用SSL连接。 Nginx1 (SSL 443 and ssl_verify_client on) -> Nginx2 (SSL 443) -> App (9000)

在第一个Nginx1服务器上,我使用选项:proxy_set_header client_cert $ssl_client_cert; 在第二台服务器Nginx2上,我使用选项:underscores_in_headers on;

问题是第二个Nginx2服务器只发送了证书的第一行 - “----- BEGIN CERTIFICATE -----”。

如何将客户端证书传递给应用程序服务器?

2 个答案:

答案 0 :(得分:0)

Nginx终止SSL没有异常,所以如果你想要这个配置 - 你需要再次拥有SSL配置并在服务器上保存证书(这里是relevant SO answer)或基于Nginx support discussion来在TCP模式下使用HAProxy。这是sample configuration文章。

答案 1 :(得分:0)

我找到了代理客户端证书的解决方法

# NGINX1
...
map $ssl_client_raw_cert $a {
    "~^(-.*-\n)(?<1st>[^\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)?((?<ab>[^\n]+)\n)?((?<ac>[^\n]+)\n)?((?<ad>[^\n]+)\n)?((?<ae>[^\n]+)\n)?((?<af>[^\n]+)\n)?((?<ag>[^\n]+)\n)?((?<ah>[^\n]+)\n)?((?<ai>[^\n]+)\n)?((?<aj>[^\n]+)\n)?((?<ak>[^\n]+)\n)?((?<al>[^\n]+)\n)?((?<am>[^\n]+)\n)?((?<an>[^\n]+)\n)?((?<ao>[^\n]+)\n)?((?<ap>[^\n]+)\n)?((?<aq>[^\n]+)\n)?((?<ar>[^\n]+)\n)?((?<as>[^\n]+)\n)?((?<at>[^\n]+)\n)?((?<av>[^\n]+)\n)?((?<au>[^\n]+)\n)?((?<aw>[^\n]+)\n)?((?<ax>[^\n]+)\n)?((?<ay>[^\n]+)\n)?((?<az>[^\n]+)\n)*(-.*-)$"
    $1st;
}
server {
...
  location  / {
  ...
    proxy_set_header client_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$ab$ac$ad$ae$af$ag$ah$ai$aj$ak$al$am$an$ao$ap$aq$ar$as$at$av$au$aw$ax$ay$az;
  ...
  }
  ...
}



# NGINX 2

server {
   ...
   underscores_in_headers on;
   ...
   location  / {
        proxy_pass_request_headers      on;
        proxy_pass http://app:9000/;
   }
   ...
}