Capturar e encaminhar atributos do certificado PKI estendido (por exemplo, UPN) usando haproxy

1

Estou tentando extrair um atributo de um certificado de cliente em um cenário de autenticação mútua e defini-lo como um cabeçalho HTTP na solicitação para o back-end. Veja fig 1 abaixo.

fig1
  [user with correct certificate]
                 |
                 | 1. presents cert with normal v1 attributes
                 | has additional "extension" attributes
                 | incl. "Subject Alt Name" which contains
                 | "User Principal Name" ( UPN looks like an email addr) 
                 |
     [example.com:443 haproxy] --app1 / app2 CNAMEd to example.com 
                 |
                 | 2. read Subject Alternative Name
                 | 3. regex or parse out UPN
                 | 4. set REMOTE_USER header to be UPN
                 | 5. pass to backend(s)
                 |
       ┌------------------┬
       |                  |   
       |                  |   
       |                  |   
       |                  |   
       V                  V                 
 [app1svr:80]       [app2svr:80]    

Normalmente, é fácil, basta puxar o atributo desejado usando a funcionalidade incorporada da seguinte forma:

frontend https
 bind *:443 name https ssl crt ./server.pem ca-file ./ca.crt verify required

 http-request set-header X-SSL-Client-DN        %{+Q}[ssl_c_s_dn]
 http-request set-header X-SSL-Client-CN        %{+Q}[ssl_c_s_dn(cn)]
 http-request set-header X-SSL-Issuer           %{+Q}[ssl_c_i_dn]
 http-request set-header X-SSL-Client-NotBefore %{+Q}[ssl_c_notbefore]
 http-request set-header X-SSL-Client-NotAfter  %{+Q}[ssl_c_notafter]

 default_backend app1svr

backend app1svr
 server app1 app1svr.example.com:80

backend app2svr
 server app2 app2svr.example.com:80

Lista de atributos aqui: link

Infelizmente, falta na lista de atributos qualquer um dos atributos de extensão COMMON, como:

  • Nome alternativo do assunto
    • Nome do RFC822
    • Outro nome
      • nome principal
  • Pontos de distribuição de CRL

Não consigo descobrir o caminho certo para acessar esses atributos. Olhando para o código (abaixo da linha 5815) link ele não parece ser < em> apenas um problema de documentação.

Alguma ideia aqui? (problema possivelmente relacionado): link

    
por MattPark 14.06.2016 / 17:27

1 resposta

0

Como HAProxy versão 1.5.14 (consulte link ) HAProxy envia o certificado completo no atributo ssl_c_der.

Então, se você colocar as seguintes linhas no arquivo de configuração haproxy

http-request set-header X-SSL-ClientCert-Base64          %{+Q}[ssl_c_der,base64]

então você pode ler todo o certificado do cliente lendo o cabeçalho X-SSL-ClientCert-Base64.

    
por 31.08.2016 / 13:38