Mi aplicación web se ejecuta en un número diferente de hosts que controlo. Para evitar la necesidad de cambiar la configuración de Apache de cada vhost, agrego la mayor parte de la configuración usando archivos .htaccess en mi repositorio para que la configuración básica de cada host sea solo un par de líneas. Esto también hace posible cambiar la configuración al implementar una nueva versión. Actualmente, .htaccess (des) establece encabezados, hace algo de magia de reescritura y controla el almacenamiento en caché del UA.
Quiero habilitar HSTS en la aplicación usando .htaccess. Simplemente configurar el encabezado es fácil:
Header always set Strict-Transport-Security "max-age=31536000"
Pero la especificación establece claramente: "Un host HSTS NO DEBE incluir el campo de encabezado STS en las respuestas HTTP transmitidas por transporte no seguro". Entonces no quiero enviar el encabezado cuando lo envío a través de conexiones HTTP. Consulte http://tools.ietf.org/html/draft-ietf-websec-strict-transport-sec-14 .
Traté de configurar el encabezado usando variables de entorno, pero me quedé atascado allí. ¿Alguien que sepa cómo hacer eso?
fuente
Respuestas:
Aparentemente, hay una variable de entorno HTTPS disponible que se puede usar fácilmente. Para personas con la misma pregunta:
fuente
.htaccess
archivo."expr=%{HTTPS} == 'on'"
funcionó. Entonces toda la línea esHeader always set Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" "expr=%{HTTPS} == 'on'"
. ¿Quizás sea por laalways
palabra clave?HTTPS
var env en la condiciónenv=HTTPS
es diferente a la var del servidor que comúnmente vemos en las condiciones mod_rewrite (y Apache expr) como%{HTTPS}
. Dado que esta es una variable env , depende del entorno, es decir. configuración del servidor. A veces, nunca se establece. A veces se le asigna el mismo valor que laHTTPS
var del servidor (por lo que siempre se establece en "off" o "on", ¡y la condición siempreenv=HTTPS
es verdadera! Simplemente prueba si la var env está configurada, no que esté "on" .) Se recomienda usar Apache expr como sugiere @ AdrianFöder en Apache 2.4+env=HTTPS
Para aprovechar la respuesta de nielsr, utilicé lo siguiente en .htaccess para cumplir con las recomendaciones de implementación segura en https://hstspreload.org que codificará el dominio en el navegador Chrome. Tenga en cuenta que esto impondrá HSTS en sus subdominios y que la inclusión en la lista de precarga no se puede deshacer fácilmente, por lo que rtfm.
fuente
Puede usar esto y ponerlo en su archivo htaccess para cumplir con https://hstspreload.org . ponga esto en su archivo .htaccess.
primero, hará la redirección de no https a https. y redirigir https no www a www https con encabezado HSTS.
( http://example.com -> https://example.com -> https://www.example.com - con encabezado HSTS)
Probado y cumple con https://hstspreload.org
fuente
Para
httpd.conf
(si tiene acceso para editar esto) puede usarNOTA: Debe configurarlo solo en HTTPS vhost y no puede estar en http vhost.
¿Cuándo debería y no debería utilizar archivos .htaccess?
fuente
Otra alternativa más es establecer siempre el encabezado y eliminarlo condicionalmente para conexiones que no sean ssl:
Esto tiene la ventaja de que la
Header
directiva se puede utilizar tanto con laenv
condición como con laearly
bandera. Con una solaHeader
directiva,env
yearly
no se pueden usar juntas, son mutuamente excluyentes (consulte la documentación oficial: https://httpd.apache.org/docs/current/mod/mod_headers.html#header ).fuente