2012-08-07 24 views
5

Quiero proxy el encabezado de solicitud 'HTTP_X_SSL_CLIENT_S_DN' a través de nginx.¿Cómo proxy el encabezado http_x_ssl_client_s_dn?

Aquí está nuestra estructura de red del servidor.

[front server:443] <---> [nginx proxy:8004] <---> [application server:8008] 
(client cert auth) 

Cuando probé dos servidores ([servidor frontal] y [servidor de aplicaciones]), funcionó correctamente. El encabezado 'HTTP_X_SSL_CLIENT_S_DN' se pasó al servidor de aplicaciones.

Luego, agregando el servidor [nginx proxy], el encabezado 'HTTP_X_SSL_CLIENT_S_DN' no se pasó al servidor de aplicaciones.

Mi nginx config está debajo.

server { 
    listen 8004; 
    index index.html; 

    location/{ 
     proxy_pass_header Server; 
     proxy_pass_header X-Scheme; 
     proxy_set_header Host $http_host; 
     proxy_set_header X-Real-IP $remote_addr; 
     proxy_pass http://app-server/; 

# TODO: to proxy 'HTTP_X_SSL_CLIENT_S_DN' 
# failed settings 
#  proxy_pass_request_headers on; # not worked (default: on) 
#  proxy_pass_header X-SSL-Client-S-DN; # none 
#  proxy_pass_header X_SSL_CLIENT_S_DN; # none 
#  proxy_pass_header HTTP_X_SSL_CLIENT_S_DN; # none 
#  proxy_pass_header HTTP-X-SSL-CLIENT-S-DN; # none 
#  proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn; # none 
#  proxy_set_header X_SSL_Client_S_DN $x_ssl_client_s_dn; # none 
#  proxy_set_header X-SSL-Client-S-DN $http_ssl_client_s_dn; # none 
#  proxy_set_header X-SSL-Client-S-DN $http_x_ssl_client_s_dn; # none 
    } 
} 

upstream app-server { 
    server 127.0.0.1:8008; 
} 

Cualquier ayuda se ha aplicado.

Respuesta

2

Tuve el mismo problema con nginx como proxy eliminó el campo X_REQUESTED_WITH de la solicitud. Por defecto, nginx marca los encabezados con guiones bajos como no válidos e ignora los encabezados no válidos.

Puede usar las directivas nginx para permitir guiones bajos en los encabezados con underscores_in_headers on; o no ignorar el encabezado no válido con ignore_invalid_headers off;.

En mi caso concreto utilicé las solicitudes python como cliente, django como servidor y nginx como proxy y resolví mi problema al que renombré X_REQUESTED_WITH como X-REQUESTED-WITH. (Django agrega automáticamente 'HTTP_' del inicio de nombres de encabezado X antes de hacer la cabecera disponible en request.META.)

import requests 
headers = {'X-REQUESTED-WITH':'XMLHttpRequest'} 
r = requests.post(url, data=payload, headers=headers) 
+0

Gracias eli_mach. Tu sugerencia tiene valor para probar. Probaré tu sugerencia de lator, pero he perdido mi entorno de prueba. – superdaigo

+0

Estoy usando django también. – superdaigo

5

En primer lugar, asegúrese de que ha configurado nginx.conf para verificar los certificados de cliente! Tenía exactamente el mismo problema que describiste.

server { 
    # ... 
    ssl_client_certificate /srv/ssl/self.crt; 
    ssl_verify_depth  1; 
    ssl_verify_client on; 
    # ... 
    location @app { # I'm using nginx+unicorn, don't blindly copy this! :) 
    # ... 
    proxy_set_header X-SSL-Client-Serial $ssl_client_serial; 
    proxy_set_header X-SSL-Client-Verify $ssl_client_verify; 
    proxy_set_header X-SSL-Client-S-DN $ssl_client_s_dn; 
    # ... 
} 

Para probar esto, necesitará una clave de cliente separada y un certificado que se haya firmado utilizando el certificado de autoridad raíz. Las credenciales del cliente comienzan con "mí" y mis credenciales de autoridad raíz comienzan con "self" en los siguientes comandos.

  1. Generar una clave privada para el cliente.

    openssl genrsa -out me.key 1024 
    
  2. Solicite que la auto-CA firme.

    openssl req -new -key me.key -out me.csr 
    
  3. Registre la solicitud utilizando la autoautorización de CA para crear un certificado.

    openssl x509 -req -days 365 -in me.csr -CA self.crt -CAkey self.key -set_serial 01 -out me.crt 
    
  4. Pruebe su nueva llave.

    curl -v -s -k --key me.key --cert me.crt https://fort-awesome-o 
    
  5. Crédito adicional: genere un certificado que pueda ser importado a su navegador.

    openssl pkcs12 -export -in me.crt -inkey me.key -certfile self.crt -out me.p12 
    

Tengo una sencilla aplicación web Sinatra que vuelca el entorno HTTP y veo lo siguiente:

"HTTP_X_SSL_CLIENT_SERIAL" => "01", "HTTP_X_SSL_CLIENT_VERIFY" => "éxito", "HTTP_X_SSL_CLIENT_S_DN" => "/ C = US/ST = Maryland/L = Annapolis/O = Fort Kickass/CN = Jonathan Morton/[email protected]"

Cuestiones relacionadas