Pregunta:
Actualmente estoy implementando https
en nuestro entorno de producción, pero me estoy rascando la cabeza por una pequeña cosa aquí.
SSL termina en el balanceador de carga y el flujo en nuestra pila es básicamente así:
Producción : Navegador <- https
-> Balanceador de carga <- http
-> Apache <- http
-> Balanceador de carga <- http
-> Tomcat
Prueba : Navegador <- https
-> nginx <- http
-> Balanceador de carga <- http
-> Tomcat
Cuando accedo a nuestra página de inicio de sesión a través de HTTPS:
Solicitar encabezados
POST /login/form HTTP/1.1
Host: www.example.org
Connection: keep-alive
Content-Length: 74
Cache-Control: max-age=0
Origin: https://www.example.org
Content-Type: application/x-www-form-urlencoded
Referer: https://www.example.org/login
Accept-Encoding: gzip,deflate,sdch
Accept-Language: nb,en-US;q=0.8,en;q=0.6
Encabezados de respuesta
HTTP/1.1 302 Moved Temporarily
Server: nginx
Date: Fri, 17 Jan 2014 11:16:50 GMT
Content-Length: 0
Connection: keep-alive
Set-Cookie: FOO=example
Location: http://www.example.org/portal
Strict-Transport-Security: max-age=31536000
Hablé con un desarrollador y me dijo lo siguiente:
En el código hay algo como request.sendRedirect ("/ portal") y Tomcat hace el resto.
Puedo reproducir el problema en el entorno de prueba, aunque una pila un poco diferente.
Mis preguntas:
- ¿Por qué obtengo
http
como esquema en el encabezado deLocation
cuando la solicitud original del navegador se realizó conhttps
? - ¿Es esto un problema de Apache mod_rewrite / mod_proxy o nginx?
- ¿Es esto un problema con Tomcat?
Respuesta:
Obtiene http en los encabezados de respuesta porque la solicitud que llega a Apache es HTTP: el SSL se ha eliminado en el equilibrador de carga. Entonces, por lo que ve Apache, es solo una solicitud HTTP.
Puede solucionar esto configurando
ServerName https://www.example.org
en la configuración de host global o virtual. Esto anulará el esquema http predeterminado para que Apache envíe la respuesta que desee. La documentación de ServerName menciona esto.