Proxy reverso Nginx passa pelo certificado do cliente

3

Estou tentando configurar um balanceador de carga por meio de um proxy reverso Nginx. Meu aplicativo usa certificados de cliente para autenticar clientes. Eu gostaria que meu proxy reverso enviasse o certificado de cliente para meus servidores de back-end. Eu adicionei esta linha à configuração do meu proxy reverso para armazenar as informações do certificado do cliente em um cabeçalho HTTP personalizado:

proxy_set_header X-SSL-CERT $ssl_client_cert

No entanto, $ssl_client_cert usa várias linhas para armazenar o certificado e meu servidor nginx de backend não reconhece isso corretamente como um cabeçalho HTTP. Qual é a melhor maneira de obter meus certificados de cliente?

Esta pergunta foi feita em 2013 neste fórum, mas até agora nenhuma solução real: link

Obrigado!

    
por Hidde 09.07.2016 / 17:52

4 respostas

4

Então eu encontrei uma solução. Eu removo todas as novas linhas no certificado e as envio como um único cabeçalho HTTP do proxy para o back-end, semelhante ao explicado aqui:

link

No meu back-end eu reconstruo o certificado adicionando uma nova linha a cada 64 caracteres. O código atualizado para o proxy reverso é o seguinte e funciona até 26 linhas:

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;
   }
}

(note que eu removi a variável começando com um número) Embora esta solução não seja a ideal, funciona para mim neste momento. Outra solução seria enviar apenas as informações do DN do certificado, que é uma única linha. Isso não funciona para mim no momento, já que não armazenei todos os DNs no meu banco de dados.

    
por 10.07.2016 / 15:40
1

Eu vejo 2 soluções aqui:

  1. Ative o script LUA e reformate a sequência em um formato no-end-of-line.
  2. Use o plug-in Set Misc e use base64_encode nessa variável.
por 09.07.2016 / 18:06
1

Parece que as versões mais recentes do nginx alteram todos os \n para \t para você na variável $ssl_client_cert . A variável $ssl_client_raw_cert está disponível se você não quiser que a transformação seja aplicada.

Veja: link

    
por 15.08.2017 / 00:28
0

Aqui está a solução LUA que funcionou para mim:

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;

Além disso, se você usar o Ubuntu, o nginx-extra tem o plugin LUA por padrão, portanto não há necessidade de configuração adicional: link

    
por 28.08.2017 / 11:04