Come forzare HTTPS utilizzando un file web.config


220

Ho cercato su Google e StackOverflow cercando di trovare una soluzione a questo, ma sembrano tutti correlati ad ASP.NET ecc.

Di solito eseguo Linux sui miei server ma per questo client sto usando Windows con IIS 7.5 (e Plesk 10). Questo è il motivo per cui non ho familiarità con i file IIS e web.config . In un .htaccessfile è possibile utilizzare le condizioni di riscrittura per rilevare se il protocollo è HTTPS e reindirizzare di conseguenza. Esiste un modo semplice per ottenere ciò utilizzando un file web.config o persino utilizzando il modulo " Riscrittura URL " che ho installato?

Non ho esperienza con ASP.NET, quindi se questo è coinvolto nella soluzione, si prega di includere passaggi chiari su come implementare.

Il motivo per cui lo faccio con web.config e non con PHP è che vorrei forzare HTTPS su tutte le risorse all'interno del sito.



Risposte:


427

È necessario il modulo di riscrittura URL, preferibilmente v2 (non ho installato v1, quindi non posso garantire che funzionerà lì, ma dovrebbe).

Ecco un esempio di tale web.config: imporrà HTTPS per TUTTE le risorse (usando 301 Permanent Redirect):

<?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>

PS Questa particolare soluzione non ha nulla a che fare con ASP.NET/PHP o qualsiasi altra tecnologia poiché viene eseguita utilizzando solo il modulo di riscrittura degli URL - viene elaborata a uno dei livelli iniziale / inferiore - prima che la richiesta arrivi al punto in cui il codice viene eseguito.


6
@BenCarey Dovresti anche guardare l' Strict-Transport-Securityintestazione: en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne

22
Consiglio di modificare il reindirizzamento in modo che non aggiunga la stringa di query poiché fa già parte di {REQUEST_URI} (altrimenti i parametri vengono aggiunti due volte). <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
franzo,

6
Funziona, ma sfortunatamente anche su localhost. Per evitarlo puoi aggiungerlo a <condizioni>: <add input = "{HTTP_HOST}" pattern = "localhost" negate = "true" />
wezzix

5
Usando AWS Elastic beanstalk, questo metodo mi stava dando 302 Troppi reindirizzamenti fino a quando non ho modificato: <match url=".*"/>a<match url="http://*.*" />
Kevin R.

1
@Sam Forse non hai installato il modulo URL Rewrite? Non viene fornito con IIS per impostazione predefinita, deve essere installato separatamente. Ad esempio docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…
LazyOne,

80

Per coloro che utilizzano ASP.NET MVC. È possibile utilizzare RequireHttpsAttribute per forzare tutte le risposte a essere HTTPS:

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

Altre cose che potresti voler fare anche per proteggere il tuo sito:

  1. Forza token anti-contraffazione per utilizzare SSL / TLS:

    AntiForgeryConfig.RequireSsl = true;
  2. Richiedi i cookie per richiedere HTTPS per impostazione predefinita modificando il file Web.config:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
  3. Utilizzare il pacchetto NuGet NWebSec.Owin e aggiungere la seguente riga di codice per abilitare Strict Transport Security (HSTS) in tutto il sito. Non dimenticare di aggiungere la direttiva Preload di seguito e inviare il tuo sito al sito HSTS Preload . Maggiori informazioni qui e qui . Si noti che se non si utilizza OWIN, esiste un metodo Web.config che è possibile leggere sul sito NWebSec .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
  4. Utilizzare il pacchetto NuGet NWebSec.Owin e aggiungere la seguente riga di codice per abilitare Pinning chiave pubblica (HPKP) in tutto il sito. Maggiori informazioni qui e qui .

    // 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. Includi lo schema https negli URL utilizzati. L' intestazione HTTP e l'Integrità delle risorse secondarie (SRI) di Content Security Policy (CSP) non funzionano bene quando si imita lo schema in alcuni browser. È meglio essere espliciti su HTTPS. per esempio

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
  6. Utilizzare il modello di progetto ASP.NET MVC Boilerplate Visual Studio per generare un progetto con tutto questo e molto altro ancora incorporato. È inoltre possibile visualizzare il codice su GitHub .


4
La domanda chiede ASP.NET ma non indica WebForms o MVC, quindi ho dato una risposta esaustiva a coloro che usano MVC (che non usa il file Web.config per forzare HTTPS) eppure ... hanno effettuato il downgrade.
Muhammad Rehan Saeed,

6
a) La soluzione funziona ma le cose sono cambiate, questa importante domanda merita una risposta aggiornata utilizzando ciò che è integrato in MVC. b) La risposta cerca di coprire tutte le basi. La domanda non è semplice, abilitare HTTPS su un intero sito richiede molto più che cambiare un file web.config. I lettori possono essere indotti in errore a pensare che cambiare un file Web.config sia tutto ciò che serve. La sicurezza è abbastanza difficile in quanto è senza risposte incomplete / obsolete.
Muhammad Rehan Saeed,

11
Secondo me questa è una risposta eccellente e preziosa. Quando qualcuno cerca su Google l'argomento ed è diretto a questa domanda, sono contento che la tua risposta sia qui.
Presidente James K. Polk,

1
@MuhammadRehanSaeed Bel post. Forse aggiungi SRI al tuo elenco? scotthelme.co.uk/subresource-integrity
Nathan

1
@MuhammadRehanSaeed true - Immagino che la tua rubrica "Altre cose che potresti voler fare anche per proteggere il tuo sito" mi abbia fatto pensare :)
Nathan,

14

Per aumentare la risposta di LazyOne, ecco una versione annotata della risposta.

<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>

Cancella tutte le altre regole che potrebbero essere già state definite su questo server. Crea una nuova regola, che chiameremo "Reindirizza tutte le richieste a https". Dopo aver elaborato questa regola, non elaborare più regole! Abbina tutti gli URL in arrivo. Quindi controlla se tutte queste altre condizioni sono vere: HTTPS è DISATTIVATO. Bene, questa è solo una condizione (ma assicurati che sia vera). In tal caso, inviare un reindirizzamento permanente 301 al client all'indirizzo http://www.foobar.com/whatever?else=the#url-contains. Non aggiungere la stringa di query alla fine, perché duplicerebbe la stringa di query!

Questo è ciò che significano le proprietà, gli attributi e alcuni dei valori.

  • clear rimuove tutte le regole del server che altrimenti potremmo ereditare.
  • regola definisce una regola.
    • nominare un nome arbitrario (sebbene univoco) per la regola.
    • stopProcessing se inoltrare immediatamente la richiesta alla pipeline di richieste IIS o prima elaborare ulteriori regole.
  • abbina quando eseguire questa regola.
    • url uno schema in base al quale valutare l'URL
  • condizioni condizioni aggiuntive su quando eseguire questa regola; le condizioni vengono elaborate solo se esiste prima una corrispondenza.
    • logicalGrouping se tutte le condizioni devono essere true ( MatchAll) o una qualsiasi delle condizioni deve essere true ( MatchAny); simile a AND vs OR.
  • aggiungi aggiunge una condizione che deve essere soddisfatta.
    • inserire l'input che sta valutando una condizione; l'input può essere variabili del server.
    • tracciare lo standard rispetto al quale valutare l'input.
    • ignoreCase se le maiuscole sono importanti o meno.
  • azione cosa fare se il matche il suo conditionssono tutti veri.
    • il tipo può essere generalmente redirect(lato client) o rewrite(lato server).
    • url cosa produrre a seguito di questa regola; in questo caso, concatenare https://con due variabili del server.
    • redirect Digita quale reindirizzamento HTTP utilizzare; questo è un 301 permanente.
    • appendQueryString se aggiungere o meno la stringa di query alla fine del risultante url; in questo caso, lo stiamo impostando su false, perché lo {REQUEST_URI}include già.

Le variabili del server sono

  • {HTTPS}che è o OFFo ON.
  • {HTTP_HOST}è www.mysite.come
  • {REQUEST_URI} include il resto dell'URI, ad es /home?key=value
    • il browser gestisce il #fragment(vedi commento da LazyOne).

Vedi anche: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference


1
Una nota però: frammentare la parte dell'URL (da /home?key=value#fragment) non è impostata sul server dai browser poiché intendeva essere utilizzata localmente.
LazyOne, il

@LazyOne Question. Stiamo utilizzando il web.config sopra riportato per reindirizzare da greenearth.game/about#foo a HTTPS. Il passaggio a HTTPS include il frammento #foo. Dato che la parte #foo non viene inviata al server, come la include il reindirizzamento?
Shaun Luttin,

È gestito dal browser. Basta aprire la scheda di rete in Google Chrome (o simile in Firefox ecc.) E vedere quale URL è effettivamente richiesto (ad es. Per la http://www.example.com/members#oopsrichiesta verrà inviata a http://www.example.com/memberscui verrà reindirizzato alla versione HTTPS su https://www.example.com/members- il browser fa il resto)
LazyOne

@LazyOne Grazie per quello. Se ricordo bene, ci sono alcuni bug di WebKit che impediscono al frammento di essere incluso nei reindirizzamenti. Quindi, questo ha senso. bugs.webkit.org/show_bug.cgi?id=24175
Shaun Luttin,

1
en.wikipedia.org/wiki/Fragment_identifier - "I client non devono inviare frammenti URI ai server quando recuperano un documento e senza aiuto da un'applicazione locale (vedi sotto) i frammenti non partecipano ai reindirizzamenti HTTP" - solo per essere chiari nel caso avessi frainteso il tuo ultimo commento.
LazyOne,

6

La risposta accettata non ha funzionato per me. Ho seguito i passaggi su questo blog .

Un punto chiave che mancava per me era che dovevo scaricare e installare l'URL Rewrite Tool per IIS. L'ho trovato qui . Il risultato è stato il seguente.

<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>

1

In .Net Core, seguire le istruzioni all'indirizzo https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

Nel tuo startup.cs aggiungi quanto segue:

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

Per reindirizzare Http su Https, aggiungere quanto segue in 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

L'eccellente libreria NWebsec può aggiornare le tue richieste da HTTP a HTTPS usando il suo upgrade-insecure-requeststag all'interno di Web.config:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>

0

Non mi era permesso installare URL Rewrite nel mio ambiente, quindi ho trovato un altro percorso.

L'aggiunta di questo al mio web.config ha aggiunto l'errore riscrivere e ha funzionato su 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>

Quindi, seguendo i consigli qui: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Ho creato il file html che esegue il reindirizzamento (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>

Spero che qualcuno lo trovi utile perché non sono riuscito a trovare tutti i pezzi in un posto altrove.


-7

Un modo semplice è dire a IIS di inviare il file di errore personalizzato per le richieste HTTP. Il file può quindi contenere un meta reindirizzamento, un reindirizzamento JavaScript e istruzioni con collegamento, ecc. È importante sottolineare che è ancora possibile controllare "Richiedi SSL" per il sito (o la cartella) e funzionerà.

</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>

Perché il downvote? Funziona e risponde alla domanda.
reindirizzare il

14
Questo è un voto negativo perché stai dicendo a Google che il tuo file non è stato trovato e quindi stai utilizzando JavaScript per reindirizzare, che in genere è semplicemente male.
Thomas Bennett,
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.