Maintenant que Let's Encrypt est disponible, et fonctionne bien, nous n'avons plus d'excuse pour ne pas chiffrer nos sites webs. Pour ceux qui l'auraient loupé, la procédure pour activer https sur IIS est dispo dans un précédent article.

Aujourd'hui il est temps d'oublier http pour de bon. Nous allons voir comment configurer IIS pour rediriger correctement nos visiteurs.

Redirection HTTP vers HTTPS

Normalement, une fois configuré correctement, votre site IIS a 2 bindings : un en http, et un en https, pour le même nom d'hôte.

La première chose à faire, la plus évidente, est de faire une redirection de chaque requête http vers la même requête https. Pour faire ça, on va utiliser le module URL Rewrite.

Une fois le module installé, ajoutez un fichier de configuration web.config -ou modifiez l'existant- et ajoutez dans la section configuration/system.webServer :

<rewrite>
    <rules>
        <rule name="http to https" stopProcessing="true">
            <match url="(.*)" />
            <conditions>
                <add input="{HTTPS}" pattern="off" />
            </conditions>
            <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
        </rule>
    </rules>
</rewrite>

La règle est en 3 parties :

  • match : on utilise (.*) pour intercepter toutes les urls
  • conditions : on ajoute une condition, la requête ne doit pas être https (on ne veut rediriger que les requêtes http)
  • action : on définit l'url de redirection

Et ça suffit, à partir de maintenant toutes les requêtes http seront redirigées (code http 301 - redirection permanente) vers la page https correspondante. Attention, à vous maintenant de faire attention à ne plus avoir de liens internes http dans votre site, sous peine de doubler toutes les requêtes.

HSTS : pour informer le navigateur de n'utiliser que https

Cette redirection que nous avons mis en place nous permets de nous assurer que le site web ne sera accessible que en https. Mais on a un petit soucis : on a une première requête de redirection qui est faite en http. On aura donc cette requête inutile à chaque fois, si votre visiteur a mis votre site en favoris avec l'adresse http.

Pour éviter ça, il existe un moyen de dire au navigateur de se connecter systématiquement en https pour le domaine. Il suffit d'ajouter un en-tête HTTP Strict Transport Security (HSTS) à la requête.

Transport-Security: "max-age=31536000"

Ce simple en-tête permet de dire au navigateur de pas faire de requête http sur le domaine pendant x secondes (ici 31536000, soit un an), et d'appeller la requête en https à la place. Vous pouvez aussi activer HSTS pour le domaine en cours et pour les sous-domaine, en ajoutant includeSubDomains

Transport-Security: "max-age=31536000; includeSubDomains"

Pour activer cet en-tête dans IIS, il suffit de modifier le fichier web.config: pour ajouter un customHeader, toujours dans dans la section configuration/system.webServer :

<httpProtocol>
    <customHeaders>
        <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/>
    </customHeaders>
</httpProtocol>

Attention, même si cet en-tête est défini ici pour être envoyé systématiquement, il ne sera pris en compte par le navigateur que s'il est défini dans une requête https. C'est pour ça que la redirection qu'on a définie reste indispensable.

Maintenant tout est en place, IIS est configuré pour rediriger correctement les requêtes http vers https, et demander au navigateur de ne plus faire de requête http. Voici donc toute la configuration à ajouter à votre web.config :

<?xml version="1.0" encoding="UTF-8"?>
<configuration>
    <system.webServer>
        <httpProtocol>
            <customHeaders>
                <add name="Strict-Transport-Security" value="max-age=31536000; includeSubDomains"/>
            </customHeaders>
        </httpProtocol>
        <rewrite>
            <rules>
                <rule name="http to https" stopProcessing="true">
                    <match url="(.*)" />
                    <conditions>
                        <add input="{HTTPS}" pattern="off" />
                    </conditions>
                    <action type="Redirect" url="https://{HTTP_HOST}/{R:1}" />
                </rule>
            </rules>
        </rewrite>
    </system.webServer>
</configuration>

Précharger son site dans le navigateur

Ce dernier point est vraiment facultatif, mais si vous voulez vraiment ne plus recevoir la moindre requête http sur votre serveur, il faudra passer par là. Il est possible de s'enregistrer directement dans les navigateurs pour que hsts soit activé, avant même que l'utilisateur n'ait visité votre site. Pour s'ajouter à la liste des sites webs https only, directement dans le code source des navigateurs, il faudra vous enregistrer sur cette page.

Attention, pour pouvoir vous enregistrer, il y a plusieurs contraintes :

  • Vous devez avoir activé https, et avoir un certificat valide
  • Toutes les requêtes http doivent être redirigées en https
  • https doit être activé pour le domaine ET tous ses sous-domaines

Il faut aussi que l'en-tête HSTS contienne includeSubDomains et preload, pour certifier que la demande d'intégration à la liste preload vienne bien du propriétaire du site.

Transport-Security: "max-age=31536000; includeSubDomains, preload"

Voilà, tout est bon ? Si vous êtes sûr de vous, vous pouvez vous lancer. Sachez juste que l'ajout à la liste peut prendre plusieurs semaines - la validation est faite manuellement, et l'acceptation n'est pas garantie. Faites aussi très attention : vous pouvez essayer de sortir de la liste, mais ça peut aussi être très long. Si pour une raison quelconque vous ne pouvez plus faire de https sur ce domaine, votre site sera totalement inaccessible.