So erzwingen Sie HTTPS mithilfe einer web.config-Datei

220

Ich habe in Google und StackOverflow nach einer Lösung gesucht, aber alle scheinen sich auf ASP.NET usw. zu beziehen.

Normalerweise führe ich Linux auf meinen Servern aus, aber für diesen einen Client verwende ich Windows mit IIS 7.5 (und Plesk 10). Dies ist der Grund, warum ich mit IIS- und web.config- Dateien etwas nicht vertraut bin . In einer .htaccessDatei können Sie mithilfe von Umschreibbedingungen feststellen, ob das Protokoll HTTPS ist, und entsprechend umleiten. Gibt es eine einfache Möglichkeit , dies mithilfe einer web.config-Datei oder sogar mithilfe des von mir installierten Moduls ' URL Rewrite ' zu erreichen ?

Ich habe keine Erfahrung mit ASP.NET. Wenn dies in die Lösung involviert ist, geben Sie bitte klare Schritte zur Implementierung an.

Der Grund für mich, dies mit der web.config und nicht mit PHP zu tun, ist, dass ich HTTPS für alle Assets auf der Site erzwingen möchte.

Ben Carey
quelle

Antworten:

427

Sie benötigen das URL Rewrite-Modul, vorzugsweise v2 (ich habe kein v1 installiert, kann also nicht garantieren, dass es dort funktioniert, sollte es aber).

Hier ist ein Beispiel für eine solche web.config - sie erzwingt HTTPS für ALLE Ressourcen (unter Verwendung von 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 Diese spezielle Lösung hat nichts mit ASP.NET/PHP oder einer anderen Technologie zu tun, da sie nur mit dem URL-Umschreibemodul ausgeführt wird - sie wird auf einer der anfänglichen / unteren Ebenen verarbeitet -, bevor die Anforderung den Punkt erreicht, an dem Ihr Code vorliegt wird ausgeführt.

LazyOne
quelle
6
@ BenCarey Sie sollten sich auch den Strict-Transport-SecurityHeader ansehen : en.wikipedia.org/wiki/HTTP_Strict_Transport_Security
LazyOne
22
Ich empfehle, die Umleitung so zu ändern, dass die Abfragezeichenfolge nicht angehängt wird, da sie bereits Teil von {REQUEST_URI} ist (andernfalls werden die Parameter zweimal hinzugefügt). <action type="Redirect" url="https://{HTTP_HOST}{REQUEST_URI}" redirectType="Permanent" appendQueryString="false" />
Franzo
6
Das funktioniert aber leider auch auf localhost. Um dies zu vermeiden, können Sie dies zu <Bedingungen> hinzufügen: <add input = "{HTTP_HOST}" pattern = "localhost" negate = "true" />
wezzix
5
Mit AWS Elastic Beanstalk gab mir diese Methode 302 zu viele Weiterleitungen, bis ich modifizierte: <match url=".*"/>zu<match url="http://*.*" />
Kevin R.
1
@Sam Vielleicht haben Sie kein URL Rewrite-Modul installiert? Es wird standardmäßig nicht mit IIS geliefert und muss separat installiert werden. ZB docs.microsoft.com/en-us/iis/extensions/url-rewrite-module/…
LazyOne
80

Für Benutzer von ASP.NET MVC. Sie können das RequireHttpsAttribute verwenden, um zu erzwingen, dass alle Antworten HTTPS sind:

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

Möglicherweise möchten Sie auch andere Maßnahmen ergreifen, um Ihre Website zu schützen:

  1. Anti-Fälschungs-Token zur Verwendung von SSL / TLS erzwingen:

    AntiForgeryConfig.RequireSsl = true;
  2. Cookies müssen standardmäßig HTTPS erfordern, indem Sie die Datei Web.config ändern:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. Verwenden Sie das NWebSec.Owin NuGet-Paket und fügen Sie die folgende Codezeile hinzu, um die strikte Transportsicherheit (HSTS) auf der gesamten Site zu aktivieren. Vergessen Sie nicht, die unten stehende Preload-Direktive hinzuzufügen und Ihre Site an die HSTS Preload-Site zu senden . Weitere Informationen hier und hier . Beachten Sie, dass es eine Web.config-Methode gibt, die Sie auf der NWebSec- Site nachlesen können, wenn Sie OWIN nicht verwenden .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Verwenden Sie das NWebSec.Owin NuGet-Paket und fügen Sie die folgende Codezeile hinzu, um das Anheften von öffentlichen Schlüsseln (Public Key Pinning, HPKP) auf der gesamten Site zu aktivieren. Weitere Informationen hier und hier .

    // 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. Fügen Sie das https-Schema in die verwendeten URLs ein. Der HTTP-Header für Content Security Policy (CSP) und die Subresource Integrity (SRI) funktionieren nicht gut, wenn Sie das Schema in einigen Browsern imitieren. Es ist besser, explizit über HTTPS zu sprechen. z.B

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Verwenden Sie die Visual Studio-Projektvorlage von ASP.NET MVC Boilerplate , um ein Projekt mit all dem und vielem mehr zu generieren. Sie können den Code auch auf GitHub anzeigen .

Muhammad Rehan Saeed
quelle
4
Die Frage fragt nach ASP.NET, enthält jedoch keine Angaben zu WebForms oder MVC. Daher habe ich eine umfassende Antwort für diejenigen gegeben, die MVC verwenden (das die Datei Web.config nicht verwendet, um HTTPS zu erzwingen) und dennoch ... heruntergestimmt haben.
Muhammad Rehan Saeed
6
a) Die Lösung funktioniert, aber die Dinge haben sich geändert. Diese prominente, hoch bewertete Frage verdient eine aktualisierte Antwort unter Verwendung der in MVC integrierten Funktionen. b) Die Antwort versucht, alle Grundlagen abzudecken. Die Frage ist nicht einfach. Das Aktivieren von HTTPS über eine gesamte Site erfordert viel mehr als das Ändern einer web.config-Datei. Leser werden möglicherweise in die Irre geführt, wenn sie glauben, dass das Ändern einer Web.config-Datei alles ist, was erforderlich ist. Sicherheit ist schwer genug, da es keine unvollständigen / veralteten Antworten gibt.
Muhammad Rehan Saeed
11
Meiner Meinung nach ist dies eine ausgezeichnete und wertvolle Antwort. Wenn jemand das Thema googelt und auf diese Frage verwiesen wird, bin ich froh, dass Ihre Antwort hier ist.
Präsident James K. Polk
1
@ MuhammadRehanSaeed Netter Beitrag. Vielleicht SRI zu Ihrer Liste hinzufügen? scotthelme.co.uk/subresource-integrity
Nathan
1
@ MuhammadRehanSaeed true - Ich denke, Ihre Überschrift "Andere Dinge, die Sie möglicherweise auch tun möchten, um Ihre Website zu sichern" hat mich dazu gebracht, daran zu denken :)
Nathan
14

Um die Antwort von LazyOne zu ergänzen, finden Sie hier eine kommentierte Version der Antwort.

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

Löschen Sie alle anderen Regeln, die möglicherweise bereits auf diesem Server definiert wurden. Erstellen Sie eine neue Regel mit dem Namen "Alle Anforderungen an https umleiten". Verarbeiten Sie nach der Verarbeitung dieser Regel keine weiteren Regeln! Stimmen Sie mit allen eingehenden URLs überein. Überprüfen Sie dann, ob alle diese anderen Bedingungen erfüllt sind: HTTPS ist ausgeschaltet. Nun, das ist nur eine Bedingung (aber stellen Sie sicher, dass es wahr ist). Wenn dies der Fall ist, senden Sie eine permanente 301-Weiterleitung an den Client unter http://www.foobar.com/whatever?else=the#url-contains. Fügen Sie die Abfragezeichenfolge nicht am Ende hinzu, da dies die Abfragezeichenfolge duplizieren würde!

Dies ist, was die Eigenschaften, Attribute und einige der Werte bedeuten.

  • clear entfernt alle Serverregeln, die wir sonst möglicherweise erben würden.
  • Regel definiert eine Regel.
    • Benennen Sie einen beliebigen (wenn auch eindeutigen) Namen für die Regel.
    • stopProcessing, ob die Anforderung sofort an die IIS-Anforderungspipeline weitergeleitet oder zuerst zusätzliche Regeln verarbeitet werden sollen.
  • stimmen überein, wann diese Regel ausgeführt werden soll.
    • URL ein Muster, anhand dessen die URL ausgewertet werden soll
  • Bedingungen zusätzliche Bedingungen, wann diese Regel ausgeführt werden soll; Bedingungen werden nur verarbeitet, wenn zuerst eine Übereinstimmung vorliegt.
    • logische Gruppierung, ob alle Bedingungen wahr sein müssen ( MatchAll) oder eine der Bedingungen wahr sein muss ( MatchAny); ähnlich wie AND vs OR.
  • add fügt eine Bedingung hinzu, die erfüllt sein muss.
    • Geben Sie die Eingabe ein, die eine Bedingung auswertet. Eingabe können Servervariablen sein.
    • Muster des Standards, anhand dessen die Eingabe bewertet werden soll.
    • ignoreCase, ob die Großschreibung wichtig ist oder nicht.
  • Aktion, was zu tun ist, wenn das matchund das conditionsalles wahr sind.
    • Typ kann im Allgemeinen redirect(clientseitig) oder rewrite(serverseitig) sein.
    • URL, was als Ergebnis dieser Regel zu produzieren ist; In diesem Fall verketten Sie https://mit zwei Servervariablen.
    • redirectType, welche HTTP-Umleitung verwendet werden soll; Dieser ist ein 301 Permanent.
    • appendQueryString, ob die Abfragezeichenfolge am Ende der Resultierenden hinzugefügt werden soll urloder nicht; In diesem Fall setzen wir es auf false, da es {REQUEST_URI}bereits enthalten ist.

Die Servervariablen sind

  • {HTTPS}das ist entweder OFFoder ON.
  • {HTTP_HOST}ist www.mysite.comund
  • {REQUEST_URI} schließt den Rest der URI ein, z /home?key=value
    • Der Browser kümmert sich um das #fragment(siehe Kommentar von LazyOne).

Siehe auch: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

Shaun Luttin
quelle
1
Ein Hinweis: Der fragmentierte Teil der URL (von /home?key=value#fragment) wird von Browsern nicht auf den Server festgelegt, da er lokal verwendet werden soll.
LazyOne
@ LazyOne Frage. Wir verwenden die obige web.config erfolgreich, um von greenearth.game/about#foo zu HTTPS umzuleiten . Der Wechsel zu HTTPS enthält das # foo-Fragment. Wie schließt die Umleitung den # foo-Teil ein, der nicht an den Server gesendet wird?
Shaun Luttin
Es wird vom Browser verwaltet. Öffnen Sie einfach die Registerkarte "Netzwerk" in Google Chrome (oder ähnlichem in Firefox usw.) und sehen Sie, welche URL tatsächlich angefordert wird (z. B. http://www.example.com/members#oopswird eine Anfrage gesendet, an http://www.example.com/membersdie dann die HTTPS-Version weitergeleitet wird https://www.example.com/members- Browser erledigt den Rest)
LazyOne
@LazyOne Danke dafür. Wenn ich mich richtig erinnere, gibt es einige WebKit-Fehler, die verhindern, dass das Fragment in Weiterleitungen enthalten ist. Das macht also Sinn. bugs.webkit.org/show_bug.cgi?id=24175
Shaun Luttin
1
en.wikipedia.org/wiki/Fragment_identifier - "Clients dürfen beim Abrufen eines Dokuments keine URI-Fragmente an Server senden und ohne Hilfe einer lokalen Anwendung (siehe unten) nehmen Fragmente nicht an HTTP-Umleitungen teil" - Nur um klar zu sein, falls ich Ihren letzten Kommentar falsch verstanden habe.
LazyOne
6

Die akzeptierte Antwort hat bei mir nicht funktioniert. Ich habe die Schritte in diesem Blog befolgt .

Ein wichtiger Punkt, der mir fehlte, war, dass ich das URL Rewrite Tool für IIS herunterladen und installieren musste. Ich habe es hier gefunden . Das Ergebnis war das Folgende.

<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>
Eric
quelle
1

Befolgen Sie in .Net Core die Anweisungen unter https://docs.microsoft.com/en-us/aspnet/core/security/enforcing-ssl

Fügen Sie in Ihrer startup.cs Folgendes hinzu:

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

Fügen Sie in der Datei startup.cs Folgendes hinzu, um Http zu Https umzuleiten

// 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);
Oracular Man
quelle
0

Die ausgezeichnete NWebsec- Bibliothek kann Ihre Anforderungen von HTTP auf HTTPS aktualisieren, indem sie das folgende upgrade-insecure-requestsTag verwendet Web.config:

<nwebsec>
  <httpHeaderSecurityModule>
    <securityHttpHeaders>
      <content-Security-Policy enabled="true">
        <upgrade-insecure-requests enabled="true"  />
      </content-Security-Policy>
    </securityHttpHeaders>
  </httpHeaderSecurityModule>
</nwebsec>
Was macht er
quelle
0

Ich durfte URL Rewrite nicht in meiner Umgebung installieren, daher habe ich einen anderen Pfad gefunden.

Durch Hinzufügen zu meiner web.config wurde der Fehler beim Umschreiben hinzugefügt und an IIS 7.5 gearbeitet:

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

Befolgen Sie dann die Anweisungen hier: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Ich habe die HTML-Datei erstellt, die die Umleitung ausführt (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>

Ich hoffe, jemand findet das nützlich, da ich nicht alle Teile an einem anderen Ort finden konnte.

Spencer Sullivan
quelle
-7

Eine einfache Möglichkeit besteht darin, IIS anzuweisen, Ihre benutzerdefinierte Fehlerdatei für HTTP-Anforderungen zu senden. Die Datei kann dann eine Meta-Weiterleitung, eine JavaScript-Umleitung und Anweisungen mit Link usw. enthalten. Wichtig ist, dass Sie weiterhin "SSL erforderlich" für die Site (oder den Ordner) aktivieren können. Dies funktioniert.

</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>
umleiten
quelle
Warum ist die Abstimmung? Es funktioniert und beantwortet die Frage.
Weiterleitung
14
Dies ist eine Abwertung, da Sie Google mitteilen, dass Ihre Datei nicht gefunden wurde, und dann JavaScript zum Umleiten verwenden, was normalerweise nur schlecht ist.
Thomas Bennett