Назад | Перейти на главную страницу

Захват и пересылка расширенных атрибутов сертификата PKI (например, UPN) с помощью haproxy

Я пытаюсь извлечь атрибут из клиентского сертификата в сценарии взаимной проверки подлинности и установить его как HTTP-заголовок в запросе на бэкэнд. Видеть fig 1 ниже.

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]    

Обычно это просто, вы просто извлекаете нужный атрибут, используя встроенные функции, например:

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

Список атрибутов здесь: https://cbonte.github.io/haproxy-dconv/configuration-1.5.html#7.3.4

К сожалению, в списке атрибутов отсутствуют какие-либо ОБЩИЕ атрибуты расширения, такие как:

Кажется, я не могу понять, как правильно получить доступ к этим атрибутам. Глядя на код (под строкой 5815) https://github.com/haproxy/haproxy/blob/master/src/ssl_sock.c это не похоже просто проблема с документацией.

Есть мысли здесь? (возможно, связанная проблема): https://stackoverflow.com/questions/22966461/reading-an-othername-value-from-a-subjectaltname-certificate-extension

Как HAProxy версии 1.5.14 (см. http://www.haproxy.org/news.html) HAProxy отправляет весь сертификат в атрибуте ssl_c_der.

Итак, если вы поместите следующие строки в файл конфигурации haproxy

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

тогда вы можете прочитать весь сертификат клиента, прочитав заголовок X-SSL-ClientCert-Base64.