77 votos

Habilitar HTTP Strict Transport Security (HSTS) en IIS 7

¿Cuál es el mejor camino para convertirse en HTTP Strict Transport Security en un servidor web IIS 7?

Puedo sólo a través de la interfaz gráfica de usuario y agregar el correcto encabezado de respuesta HTTP o debo usar appcmd y si es así ¿qué interruptores?

118voto

Doug Wilson Puntos 193

Esto nos permite manejar tanto la redirección HTTP y agregar el Estricto-Transporte-encabezado de Seguridad HTTPS respuestas con un solo sitio de IIS:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <rule name="HTTP to HTTPS redirect" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}"
                        redirectType="Permanent" />
                </rule>
            </rules>
            <outboundRules>
                <rule name="Add Strict-Transport-Security when HTTPS" enabled="true">
                    <match serverVariable="RESPONSE_Strict_Transport_Security"
                        pattern=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="on" ignoreCase="true" />
                    </conditions>
                    <action type="Rewrite" value="max-age=31536000" />
                </rule>
            </outboundRules>
        </rewrite>
    </system.webServer>
</configuration>

40voto

Owen Blacker Puntos 439

Para complementar voretaq7's respuesta, también se puede hacer esto mediante la Web.archivo de configuración - añadir un bloque de la siguiente manera:

<system.webServer>
    <httpProtocol>
        <customHeaders>
            <add name="Strict-Transport-Security" value="max-age=31536000"/>
        </customHeaders>
    </httpProtocol>
</system.webServer>

Obviamente, puede que ya tenga un system.webServer bloque en su Web.config, por lo que añadir esto para que, si es así. Preferimos manejar las cosas en la Web.de configuración en lugar de la interfaz gráfica de usuario, porque significa que los cambios en la configuración pueden ser cometidos a nuestro repositorio Git.

Si usted quería manejar el HTTP-a-SSL redirección, como Greg Askew mencionado, usted puede encontrar que es más fácil de hacer que con un sitio web independiente en IIS. Esta es la forma en que manejamos requerir SSL para algunos sitios de los clientes. Que sitio contiene sólo una redirección HTTP y algunos de revelación de información de errores, todos en la Web.config:

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
  <system.web>
    <httpRuntime requestValidationMode="2.0" enableVersionHeader="false" />
  </system.web>
  <system.webServer>
    <httpRedirect enabled="true" destination="https://www.domain.co.uk/"
      httpResponseStatus="Permanent" />
    <httpProtocol>
      <customHeaders>
        <remove name="X-Powered-By" />
      </customHeaders>
    </httpProtocol>
    <rewrite>
      <outboundRules>
        <rule name="Remove RESPONSE_Server">
          <match serverVariable="RESPONSE_Server" pattern=".+" />
          <action type="Rewrite" value="" />
        </rule>
      </outboundRules>
    </rewrite>
  </system.webServer>
</configuration>

Esta es nuestra solución preferida para un par de razones - tenemos la facilidad de registro redirige el tráfico por separado (como es diferente de registro de IIS), que no implica más que el código en el Mundial.asax.cs (no tenemos ningún código de allí, que es un poco más conveniente para un Umbraco sitio) y, lo más importante, significa que todas las config que se sigue celebrando en nuestro repositorio GIT.

Editado para añadir: Para ser claros, a fin de cumplir con RFC 6797, de la Strict-Transport-Security de encabezado personalizado NO DEBE ser añadido a las solicitudes de HTTP sin cifrar. Para ser RFC6797-compatible, usted DEBE tener dos sitios en IIS, tal como la he descrito después de que el primer bloque de código. Como Chris señala, RFC 6797 incluye:

Un HSTS Host NO DEBE incluir el PTS campo de encabezado en las respuestas HTTP transmitido sobre los no-seguro de transporte.

para el envío de la Strict-Transport-Security cliente encabezado en la respuesta a una solicitud de SSL no no cumplir con la especificación.

17voto

voretaq7 Puntos 63415

IIS tiene la capacidad de agregar encabezados personalizados para las respuestas. Esta parecería ser la forma más fácil de ir sobre ella.

De acuerdo a la documentación en IIS.net puede agregar estos encabezados través del Administrador de IIS:

  • En el panel Conexiones, vaya al sitio, la aplicación o el directorio en el que desea establecer un encabezado HTTP personalizado.
  • En el panel Inicio, haga doble clic en los Encabezados de Respuesta HTTP.
  • En los Encabezados de Respuesta HTTP panel, haga clic en Agregar... en el panel de Acciones.
  • En el Complemento Personalizado Encabezado de Respuesta HTTP cuadro de diálogo, defina el nombre y el valor de su cabecera personalizada y, a continuación, haga clic en ACEPTAR.

9voto

Greg Askew Puntos 17236

Me gustaría utilizar el ejemplo de la Wikipedia enlace que hace referencia y que la actividad se realice en el mundial.asax para el sitio. Esto permite redirigir la petición a una dirección url https, y , a continuación, insertar el encabezado en la respuesta.

Esto es debido a la HSTS encabezado debe ser ignorado si no es en una respuesta https.

protected void Application_BeginRequest()
{
    switch (Request.Url.Scheme)
    {
        case "https":
            Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
            break;
        case "http":
            var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
            Response.Status = "301 Moved Permanently";
            Response.AddHeader("Location", path);
            break;
    }
}

3voto

erbz Puntos 31

Esta parece ser una idea bastante fail safe manera de hacer esto. Añadir este código en el Mundial.asax - el evento Application_BeginRequest un incendio en el Asp.net ciclo vital de la solicitud: http://msdn.microsoft.com/en-us/library/system.web.httpapplication.beginrequest(v=vs.110).aspx

Por la especificación, las solicitudes de http no debe responder con la cabecera, por lo que este código sólo se agrega peticiones https. Max-age es el número de segundos, y es generalmente una buena idea para poner un gran valor en aquí (IE - 31536000 indica que el sitio funcionará SSL sólo para los próximos 365 días)

protected void Application_BeginRequest(Object sender, EventArgs e)
{
  switch (Request.Url.Scheme)
  {
    case "https":
      Response.AddHeader("Strict-Transport-Security", "max-age=31536000");
      break;
    case "http":
      var path = "https://" + Request.Url.Host + Request.Url.PathAndQuery;
      Response.Status = "301 Moved Permanently";
      Response.AddHeader("Location", path);
      break;
  }
}

EnMiMaquinaFunciona.com

EnMiMaquinaFunciona es una comunidad de administradores de sistemas en la que puedes resolver tus problemas y dudas.
Puedes consultar las preguntas de otros sysadmin, hacer tus propias preguntas o resolver las de los demás.

Powered by: