Cómo forzar HTTPS usando una web.archivo de configuración


He buscado en Google y StackOverflow tratando de encontrar una solución a esto, pero todos parecen relacionarse con ASP.NET etc.

Normalmente corro Linux en mis servidores, pero para este cliente estoy usando Windows con IIS 7.5 (y Plesk 10). Esta es la razón por la que estoy poco familiarizado con IIS y web.config archivos. En un archivo .htaccess puede usar condiciones de reescritura para detectar si el protocolo es HTTPS y redirigir en consecuencia. ¿Existe una manera sencilla de lograr esto usando una web.archivo de configuración, o incluso usando el módulo' URL Rewrite ' que he instalado?

No tengo experiencia con ASP.NET entonces, si esto está involucrado en la solución, por favor incluya pasos claros de cómo implementarla.

La razón por la que hago esto con la web.config y no PHP es que me gustaría forzar HTTPS en todos los activos dentro del sitio.

Author: abatishchev, 2012-03-22

8 answers

Necesita el módulo de reescritura de URL, preferiblemente v2 (no tengo v1 instalado, por lo que no puedo garantizar que funcione allí, pero debería hacerlo).

Aquí hay un ejemplo de dicha web.config force forzará HTTPS para TODOS los recursos (usando Redireccionamiento permanente 301):

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <rewrite>
            <rules>
                <clear />
                <rule name="Redirect to https" stopProcessing="true">
                    <match url=".*" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" ignoreCase="true" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

P. S. Esta solución en particular no tiene nada que ver con ASP.NET/PHP o cualquier otra tecnología, ya que se hace utilizando el módulo de reescritura de URL solo is se procesa en uno de los niveles iniciales/inferiores before antes de que se obtenga la solicitud hasta el punto en que tu código se ejecuta.

 348
Author: LazyOne,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-18 11:32:05

Para aquellos que usan ASP.NET MVC. Puedes usar el RequireHttpsAttribute para forzar que todas las respuestas sean HTTPS:

GlobalFilters.Filters.Add(new RequireHttpsAttribute());

Otras cosas que también puede querer hacer para ayudar a proteger su sitio:

  1. Forzar el uso de tokens Anti-Falsificación SSL / TLS:

    AntiForgeryConfig.RequireSsl = true;
    
  2. Requerir Cookies para requerir HTTPS por defecto cambiando la Web.archivo de configuración:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. Use el NWebSec.Owin NuGet paquete y añadir la siguiente línea de código para habilitar Seguridad de Transporte Estricta (HSTS) en todo el sitio. No olvide agregar la directiva de precarga a continuación y enviar su sitio al sitio de precarga HSTS . Más información aquí y aquí. Tenga en cuenta que si no está utilizando OWIN, hay una Web.el método de configuración se puede leer en el sitio NWebSec.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Utilice el NWebSec.Owin NuGet package y agregue la siguiente línea de código para habilitar la fijación de claves públicas (HPKP) en todo el sitio. Mas información aquí y aquí.

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHpkp(options => options
        .Sha256Pins(
            "Base64 encoded SHA-256 hash of your first certificate e.g. cUPcTAZWKaASuYWhhneDttWpY3oBAkE3h2+soZS7sWs=",
            "Base64 encoded SHA-256 hash of your second backup certificate e.g. M8HztCzM3elUxkcjR2S5P4hhyBNf6lHkmjAHKhpGPWE=")
        .MaxAge(days: 30));
    
  5. Incluya el esquema https en cualquier URL utilizada. Content Security Policy (CSP) HTTP header and Subresource Integrity (SRI) do not play nice when you imit the scheme in some browsers. Es mejor ser explícito sobre HTTPS. por ejemplo,

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Utilice el ASP.NET MVC Boilerplate Plantilla de proyecto de Visual Studio para generar un proyecto con todo esto y mucho más incorporado. También puedes ver el código en GitHub .

 70
Author: Muhammad Rehan Saeed,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-12-22 16:52:03

Para aumentar la respuesta de LazyOne, aquí hay una versión anotada de la respuesta.

<rewrite>
  <rules>
     <clear />
     <rule name="Redirect all requests to https" stopProcessing="true">
       <match url="(.*)" />
         <conditions logicalGrouping="MatchAll">
           <add input="{HTTPS}" pattern="off" ignoreCase="true" />
         </conditions>
         <action 
            type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" 
            redirectType="Permanent" appendQueryString="false" />
     </rule>
  </rules>
</rewrite>

Borre todas las demás reglas que ya hayan sido definidas en este servidor. Cree una nueva regla, que llamaremos "Redirigir todas las solicitudes a https". Después de procesar esta regla, ¡no procese más reglas! Coincide con todas las URL entrantes. A continuación, compruebe si todas estas otras condiciones son verdaderas: HTTPS está desactivado. Bueno, eso es solo una condición (pero asegúrese de que es cierto). Si lo es, envíe un 301 Redireccionamiento permanente al cliente en http://www.foobar.com/whatever?else=the#url-contains. ¡No agregue la cadena de consulta al final de eso, porque duplicaría la cadena de consulta!

Esto es lo que significan las propiedades, atributos y algunos de los valores.

  • clear elimina todas las reglas de servidor que de otro modo podríamos heredar.
  • rule define una regla.
    • name un nombre arbitrario (aunque único) para la regla.
    • stopProcessing whether para enviar la solicitud inmediatamente a la canalización de solicitudes de IIS o primero para procesar reglas adicionales.
  • coincide con cuándo ejecutar esta regla.
    • url un patrón para evaluar la URL
  • condiciones condiciones adicionales sobre cuándo ejecutar esta regla; las condiciones se procesan solo si primero hay una coincidencia.
    • logicalGrouping si todas las condiciones deben ser verdaderas (MatchAll) o cualquiera de las condiciones debe ser verdadera (MatchAny); similar a AND vs OR.
  • add añade una condición que debe cumplirse.
    • input la entrada que una condición está evaluando; la entrada puede ser variables de servidor.
    • pattern el estándar contra el cual evaluar la entrada.
    • ignoreCase si la capitalización importa o no.
  • acción ¿qué hacer si el match y su conditions son todas verdad.
    • el tipo generalmente puede ser redirect (del lado del cliente) o rewrite (del lado del servidor).
    • url qué producir como resultado de esta regla; en este caso, concatenar https:// con dos variables de servidor.
    • redirectType qué redireccionamiento HTTP usar; este es un 301 Permanente.
    • appendQueryString si desea agregar la cadena de consulta al final de la resultante url o no; en este caso, vamos a falso, porque el {REQUEST_URI} ya lo incluye.

Las variables del servidor son

  • {HTTPS} que es OFF o ON.
  • {HTTP_HOST} es www.mysite.com, y
  • {REQUEST_URI} incluye el resto del URI, por ejemplo, /home?key=value
    • el navegador maneja el #fragment (ver comentario de LazyOne).

Véase también: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

 11
Author: Shaun Luttin,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-01-18 17:08:20

La respuesta aceptada no funcionó para mí. Seguí los pasos en este blog .

Un punto clave que me faltaba era que necesitaba descargar e instalar la herramienta de reescritura de URL para IIS. Lo encontré aquí. el resultado fue El siguiente.

<rewrite>
        <rules>
            <remove name="Http to Https" />
            <rule name="Http to Https" enabled="true" patternSyntax="Wildcard" stopProcessing="true">
                <match url="*" />
                <conditions>
                    <add input="{HTTPS}" pattern="off" />
                </conditions>
                <serverVariables />
                <action type="Redirect" url="https://{HTTPS_HOST}{REQUEST_URI}" />
            </rule>
        </rules>
    </rewrite>
 3
Author: Steady,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-04-05 06:40:53

La excelente biblioteca NWebsec puede actualizar sus solicitudes de HTTP a HTTPS utilizando su etiqueta upgrade-insecure-requests dentro de la Web.config:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>
 0
Author: WhatIsHeDoing,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2016-07-06 09:59:14

No se me permitió instalar la reescritura de URL en mi entorno.

Así que encontré otro camino.

Añadiendo esto a mi web.config agregó la reescritura del error y trabajó en IIS 7.5

<system.webServer>
    <httpErrors errorMode="Custom" defaultResponseMode="File" defaultPath="C:\WebSites\yoursite\" >    
    <remove statusCode="403" subStatusCode="4" />
    <error statusCode="403" subStatusCode="4" responseMode="File" path="redirectToHttps.html" />
</httpErrors>

Entonces, siguiendo el consejo aquí: https://www.sslshopper.com/iis7-redirect-http-to-https.html

He creado el archivo html que hace la redirección (redirectToHttps.html):

<html>
<head><title>Redirecting...</title></head>
<script language="JavaScript">
function redirectHttpToHttps()
{
    var httpURL= window.location.hostname + window.location.pathname + window.location.search;
    var httpsURL= "https://" + httpURL;
    window.location = httpsURL;
}
redirectHttpToHttps();
</script>
<body>
</body>
</html>

Espero que alguien encuentre esto útil ya que no pude encontrar todas las piezas en un solo lugar en cualquier otro lugar.

 0
Author: Spencer Sullivan,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2017-06-27 17:52:27
In Dot Net Core, follow the instructions at https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

***In your startup.cs add the following,***

// Requires using Microsoft.AspNetCore.Mvc;
public void ConfigureServices(IServiceCollection services)
{
    services.Configure<MvcOptions>(options =>
    {
        options.Filters.Add(new RequireHttpsAttribute());
    });`enter code here`

***To redirect Http to Https, add the following in the startup.cs***

// Requires using Microsoft.AspNetCore.Rewrite;
public void Configure(IApplicationBuilder app, IHostingEnvironment env, ILoggerFactory loggerFactory)
{
    loggerFactory.AddConsole(Configuration.GetSection("Logging"));
    loggerFactory.AddDebug();

    var options = new RewriteOptions()
       .AddRedirectToHttps();

    app.UseRewriter(options);
 0
Author: Oracular Man,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2018-04-03 20:11:23

Una forma sencilla es decirle a IIS que envíe su archivo de error personalizado para solicitudes HTTP. El archivo puede contener una redirección meta, una redirección JavaScript e instrucciones con enlace, etc... Es importante destacar que aún puede marcar "Requerir SSL" para el sitio (o carpeta) y esto funcionará.

</configuration>
</system.webServer>
    <httpErrors>
        <clear/>
        <!--redirect if connected without SSL-->
        <error statusCode="403" subStatusCode="4" path="errors\403.4_requiressl.html" responseMode="File"/>
    </httpErrors>
</system.webServer>
</configuration>
 -6
Author: redirect,
Warning: date(): Invalid date.timezone value 'Europe/Kyiv', we selected the timezone 'UTC' for now. in /var/www/agent_stack/data/www/ajaxhispano.com/template/agent.layouts/content.php on line 61
2015-03-16 20:33:56