it-swarm.com.de

So erzwingen Sie HTTPS mithilfe einer web.config-Datei

Ich habe nach Google und StackOverflow gesucht, um eine Lösung für dieses Problem zu finden, 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). Aus diesem Grund bin ich etwas unbekannt mit IIS und web.config -Dateien. In einer .htaccess-Datei können Sie die Umschreibungsbedingungen verwenden, um zu ermitteln, ob das Protokoll HTTPS ist, und entsprechend umzuleiten. Gibt es einen einfachen Weg, um dies mit einer web.config-Datei oder sogar mit dem Modul 'URL Rewrite' zu erreichen, das ich installiert habe?

Ich habe keine Erfahrung mit ASP.NET. Wenn dies also an der Lösung beteiligt ist, geben Sie bitte klare Schritte zur Implementierung an.

Der Grund, warum ich dies mit der web.config und nicht PHP mache, ist, dass ich HTTPS für alle Assets innerhalb der Site erzwingen möchte.

185
Ben Carey

Sie benötigen ein URL-Rewrite-Modul, vorzugsweise v2 (ich habe keine v1 installiert, daher kann ich nicht garantieren, dass es dort funktioniert, aber es sollte funktionieren).

Hier ein Beispiel für eine solche web.config - es wird HTTPS für ALLE Ressourcen erzwungen (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>

P.S. .__ Diese spezielle Lösung hat nichts mit ASP.NET/PHP oder einer anderen Technologie zu tun, da nur das Modul zum Umschreiben von URLs verwendet wird - es wird auf einer der anfänglichen/niedrigeren Ebenen verarbeitet, bevor die Anforderung an das Punkt, an dem Ihr Code ausgeführt wird.

372
LazyOne

Für diejenigen, die ASP.NET MVC verwenden. Mit dem RequireHttpsAttribute können Sie alle Antworten als HTTPS erzwingen:

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

Möglicherweise möchten Sie auch andere Dinge tun, um Ihre Website zu schützen:

  1. Anti-Forgery-Token zur Verwendung von SSL/TLS erzwingen:

    AntiForgeryConfig.RequireSsl = true;
    
  2. Erfordern Cookies, um standardmäßig HTTPS anzufordern, indem Sie die Datei Web.config ändern:

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

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Verwenden Sie das NuWeb-Paket NWebSec.Owin und fügen Sie die folgende Codezeile hinzu, um das Public Key Pinning (HPKP) für den gesamten Standort 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 eine beliebige URL ein. Content Security Policy (CSP) HTTP-Header und Subresource Integrity (SRI) spielen Nice nicht, wenn Sie das Schema in einigen Browsern nachahmen. 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 Projektvorlage " ASP.NET MVC Boilerplate Visual Studio", um ein Projekt mit all dem und vielem mehr zu erstellen. Sie können den Code auch unter GitHub anzeigen.

71

Um die Antwort von LazyOne zu erweitern, ist 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, die als "Alle Anfragen an https umleiten" bezeichnet wird. Verarbeiten Sie nach der Bearbeitung dieser Regel keine weiteren Regeln mehr! Passen Sie alle eingehenden URLs an. Prüfen Sie dann, ob alle anderen Bedingungen erfüllt sind: HTTPS ist deaktiviert. Nun, das ist nur eine Bedingung (aber stellen Sie sicher, dass es wahr ist). Wenn dies der Fall ist, senden Sie eine 301 Dauerumleitung an den Client unter http://www.foobar.com/whatever?else=the#url-contains zurück. Fügen Sie die Abfragezeichenfolge nicht am Ende hinzu, da dies die Abfragezeichenfolge duplizieren würde! 

Dies bedeuten die Eigenschaften, Attribute und einige der Werte.

  • clear entfernt alle Serverregeln, die wir ansonsten erben könnten.
  • rule definiert eine Regel.
    • name ein beliebiger (wenn auch eindeutiger) Name für die Regel. 
    • stopProcessing ob die Anforderung sofort an die Anforderungspipeline IIS weitergeleitet werden soll oder zuerst zusätzliche Regeln verarbeitet werden soll. 
  • match, wann diese Regel ausgeführt werden soll .
    • url ein Muster, anhand dessen die URL ausgewertet werden soll
  • conditions zusätzliche Bedingungen, wann diese Regel ausgeführt werden soll; Bedingungen werden nur dann verarbeitet, wenn zuerst eine Übereinstimmung vorliegt .
    • logicGrouping, ob alle Bedingungen wahr sein müssen (MatchAll) oder eine der Bedingungen muss wahr sein (MatchAny); ähnlich wie AND vs OR. 
  • add fügt eine Bedingung hinzu, die erfüllt sein muss.
    • input die Eingabe, die eine Bedingung auswertet; Die Eingabe kann Servervariable sein. 
    • pattern der Standard, anhand dessen die Eingabe ausgewertet werden soll. 
    • ignoreCase, ob die Großschreibung von Belang ist oder nicht. 
  • action was zu tun ist, wenn die match und ihre conditions alle wahr sind .
    • type kann im Allgemeinen redirect (clientseitig) oder rewrite (serverseitig) sein. 
    • url was als Ergebnis dieser Regel produziert werden soll; Verketten Sie in diesem Fall https:// mit zwei Servervariablen.
    • redirectType welche HTTP-Weiterleitung verwendet werden soll; dies ist eine 301 Permanent. 
    • appendQueryString Gibt an, ob die Abfragezeichenfolge am Ende der resultierenden url hinzugefügt werden soll oder nicht. In diesem Fall setzen wir es auf false, da der {REQUEST_URI} es bereits enthält.

Die Servervariablen sind 

  • {HTTPS}, der entweder OFF oder ON ist. 
  • {HTTP_Host} ist www.mysite.com und 
  • {REQUEST_URI} enthält den Rest der URI, z. /home?key=value
    • der Browser behandelt den #fragment (siehe Kommentar von LazyOne).

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

11
Shaun Luttin

Die akzeptierte Antwort hat bei mir nicht funktioniert. Ich folgte den Schritten auf diesem Blog .

Ein wichtiger Punkt, der mir fehlte, war, dass ich das URL Rewrite Tool für IIS herunterladen und installieren musste. Ich fand es hier . 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>
5
Eric
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);
1
Oracular Man

Es war mir nicht gestattet, URL Rewrite in meiner Umgebung zu installieren.

Also habe ich einen anderen Weg gefunden. 

Das Hinzufügen zu meiner web.config fügte den Fehler umschreiben hinzu und arbeitete an 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>

Folgen Sie dann den Ratschlägen hier: https://www.sslshopper.com/iis7-redirect-http-to-https.html

Ich habe die HTML-Datei erstellt, die die Weiterleitung 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, das findet jemand nützlich, da ich nicht alle Teile an einem anderen Ort finden konnte. 

0

Die ausgezeichnete NWebsec - Bibliothek kann Ihre Anforderungen mithilfe des upgrade-insecure-requests-Tags innerhalb von Web.config von HTTP auf HTTPS aktualisieren

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