web-dev-qa-db-fra.com

Comment forcer HTTPS à l'aide d'un fichier web.config

J'ai cherché sur Google et StackOverflow en essayant de trouver une solution à ce problème, mais ils semblent tous se rapporter à ASP.NET, etc.

J'utilise généralement Linux sur mes serveurs, mais j'utilise Windows avec IIS 7.5 (et Plesk 10) pour ce client. C’est la raison pour laquelle je suis peu familier avec les fichiers IIS et web.config. Dans un fichier .htaccess, vous pouvez utiliser des conditions de réécriture pour détecter si le protocole est HTTPS et rediriger en conséquence. Existe-t-il un moyen simple pour y parvenir à l'aide d'un fichier web.config ou même à l'aide du module 'URL Rewrite' que j'ai installé?

J'ai pas d'expérience avec ASP.NET donc si cela est impliqué dans la solution, veuillez inclure des étapes claires sur la manière de les implémenter.

Si je fais cela avec web.config et not PHP, c’est que j’aimerais forcer HTTPS sur tous les éléments du site.

185
Ben Carey

Vous avez besoin du module URL Rewrite, de préférence v2 (je n’ai pas installé v1, je ne peux donc pas garantir que cela fonctionnera là-bas, mais cela devrait être le cas).

Voici un exemple de ce type web.config - il forcera HTTPS pour TOUTES les ressources (en utilisant la redirection 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. Cette solution particulière n'a rien à voir avec ASP.NET/PHP ou toute autre technologie, car elle utilise uniquement le module de réécriture d'URL - elle est traitée à l'un des niveaux initial/inférieur - avant que la requête parvienne au pointez où votre code est exécuté.

372
LazyOne

Pour ceux qui utilisent ASP.NET MVC. Vous pouvez utiliser RequireHttpsAttribute pour forcer toutes les réponses à être HTTPS:

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

Vous pouvez également souhaiter prendre d'autres mesures pour sécuriser votre site:

  1. Forcer les jetons anti-contrefaçon à utiliser SSL/TLS:

    AntiForgeryConfig.RequireSsl = true;
    
  2. Exiger que les cookies requièrent HTTPS par défaut en modifiant le fichier Web.config:

    <system.web>
        <httpCookies httpOnlyCookies="true" requireSSL="true" />
    </system.web>
    
  3. Utilisez le package NuGet NWebSec.Owin et ajoutez la ligne de code suivante pour activer la sécurité du transport strict (HSTS) sur le site. N'oubliez pas d'ajouter la directive de préchargement ci-dessous et de soumettre votre site au site de préchargement HSTS . Plus d'informations ici et ici . Notez que si vous n'utilisez pas OWIN, il existe une méthode Web.config que vous pouvez consulter sur le site NWebSec .

    // app is your OWIN IAppBuilder app in Startup.cs
    app.UseHsts(options => options.MaxAge(days: 720).Preload());
    
  4. Utilisez le package NWebSec.Owin NuGet et ajoutez la ligne de code suivante pour activer l'identification de clé publique (HPKP) sur l'ensemble du site. Plus d'informations ici et ici .

    // 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. Incluez le schéma https dans toutes les URL utilisées. _ { Politique de sécurité du contenu (CSP) } _ L'en-tête HTTP et Intégrité de la sous-source (SRI) } ne sont pas lisibles lorsque vous modifiez le schéma dans certains navigateurs. Il vaut mieux être explicite à propos de HTTPS. par exemple.

    <script src="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.4/bootstrap.min.js">
    </script>
    
  6. Utilisez le modèle de projet ASP.NET MVC Boilerplate Visual Studio pour générer un projet avec tout cela et bien plus intégré. Vous pouvez également afficher le code sur GitHub .

71

Pour augmenter la réponse de LazyOne, voici une version annotée de la réponse.

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

Effacez toutes les autres règles qui ont peut-être déjà été définies sur ce serveur. Créez une nouvelle règle, que nous nommerons "Rediriger toutes les demandes vers https". Après avoir traité cette règle, ne traitez plus de règles! Correspond à toutes les URL entrantes. Vérifiez ensuite si toutes ces autres conditions sont vraies: HTTPS est désactivé. Eh bien, ce n'est qu'une condition (mais assurez-vous que c'est vrai). Si tel est le cas, envoyez une redirection permanente 301 au client à l'adresse http://www.foobar.com/whatever?else=the#url-contains. N'ajoutez pas la chaîne de requête à la fin, car cela dupliquerait la chaîne de requête! 

C'est ce que signifient les propriétés, les attributs et certaines des valeurs.

  • clear supprime toutes les règles de serveur dont nous pourrions hériter autrement.
  • rule définit une règle.
    • name un nom arbitraire (bien que unique) pour la règle. 
    • stopProcessing indique si la requête doit être immédiatement transmise au pipeline de requêtes IIS ou si elle doit d'abord traiter des règles supplémentaires. 
  • match quand exécuter cette règle .
    • url un modèle par rapport auquel évaluer l'URL
  • conditions des conditions supplémentaires sur le moment d'exécution de cette règle; les conditions ne sont traitées que s'il existe d'abord une correspondance .
    • logicalGrouping si toutes les conditions doivent être vraies (MatchAll) ou si l'une quelconque des conditions doit être vraie (MatchAny); semblable à ET vs OU. 
  • add ajoute une condition à remplir.
    • input l'entrée qu'une condition évalue; les entrées peuvent être des variables de serveur. 
    • pattern le standard par rapport auquel évaluer l'entrée. 
    • ignoreCase si la capitalisation compte ou non. 
  • action que faire si la match et sa conditions sont toutes vraies .
    • type peut généralement être redirect (côté client) ou rewrite (côté serveur). 
    • url ce qu'il faut produire à la suite de cette règle; dans ce cas, concatérez https:// avec deux variables de serveur.
    • redirectType quelle redirection HTTP utiliser; celui-ci est un 301 permanent. 
    • appendQueryString s'il faut ou non ajouter la chaîne de requête à la fin de la url résultante; dans ce cas, nous le définissons sur false, car le {REQUEST_URI} l'inclut déjà.

Les variables du serveur sont 

  • {HTTPS} qui est soit OFF ou ON
  • {HTTP_Host} est www.mysite.com, et 
  • {REQUEST_URI} inclut le reste de l'URI, par exemple. /home?key=value
    • le navigateur gère le #fragment (voir le commentaire de LazyOne).

Voir aussi: https://www.iis.net/learn/extensions/url-rewrite-module/url-rewrite-module-configuration-reference

11
Shaun Luttin

La réponse acceptée n'a pas fonctionné pour moi . J'ai suivi les étapes sur ce blog .

Un point clé qui me manquait était que je devais télécharger et installer l'URL Rewrite Tool for IIS. Je l'ai trouvé ici . Le résultat était le suivant. 

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

Je n'ai pas été autorisé à installer l'URL Rewrite dans mon environnement.

J'ai donc trouvé un autre chemin. 

Ajouter ceci à mon web.config ajoutait l’erreur de réécriture et travaillait sur 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>

Ensuite, suivez les conseils ici: https://www.sslshopper.com/iis7-redirect-http-to-https.html

J'ai créé le fichier HTML qui effectue la redirection (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>

J'espère que quelqu'un trouvera cela utile, car je ne pourrais pas trouver toutes les pièces au même endroit ailleurs. 

0
Spencer Sullivan

L'excellente bibliothèque NWebsec peut mettre à niveau vos demandes de HTTP à HTTPS en utilisant sa balise upgrade-insecure-requests dans le Web.config:

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