Il y a déjà un an, j'avais fait un article expliquant comment activer HTTPS sur IIS. Il est temps aujourd'hui d'en faire une nouvelle version, car depuis quelques jours est arrivé Let's Encrypt.

Let's Encrypt est une nouvelle autorité de certification qui fournit gratuitement, et de manière totalement automatisée, des certificats pour sécuriser les sites internet. Chaque certificat est valide pour un seul sous-domaine, et pour une durée de 90 jours. Mais la création et le renouvellement étant automatisés, ce n'est pas vraiment un problème. Si par contre vous avez besoin de certificats plus avancés (wildcards, vérification de l'identité), il faudra aller voir une autre autorité de certification.

Fonctionnement : la théorie

Avant de délivrer un certificat, l'autorité de certification doit vérifier que le demandeur est bien propriétaire du nom de domaine. Cela peut se faire par l'envoi d'un e-mail, ou l'ajout d'une entrée dns. Let's Encrypt fait cette vérification automatiquement en proposant un outil à installer sur le serveur, qui va créer un fichier dans le site web, et en voyant s'il est bien accessible : si c'est bon, on sait que le domaine est valide.

Une fois le domaine validé, ce même outil va faire tout le nécessaire : créer une Cert Request, l'envoyer à Let's Encrypt, récupérer le certificat, et configurer le serveur web. Puis s'enregistrer sur le serveur pour refaire tout ça avant que le certificat n'expire 3 mois plus tard.

Cet outil a été créé par Let's Encrypt, mais il n'existe pas de version officielle pour IIS. Heureusement, il en existe des versions non-officielles, qui marchent plutot bien.

Le client Let's Encrypt pour IIS

Il existe plusieurs clients pour Windows, j'en ai choisi un simple à utiliser : letsencrypt-win-simple.

Téléchargez la dernière release, et dézippez la sur votre serveur. Attention à l'endroit où vous le mettez, il faudra laisser l'exécutable en place, car il sera appelé régulièrement pour gérer les renouvellements des certificats. Lancez letsencrypt.exe avec les droits administrateurs ; il va se connecter à votre IIS pour voir les sites actifs.

Scanning IIS 7 Site Bindings for Hosts
 1: IIS blog.adhess.net (C:\inetpub\wwwroot\redirblog)
 2: IIS blog.lacasa.fr (C:\inetpub\wwwroot\blog)
 3: IIS www.lacasa.fr (C:\inetpub\wwwroot\www)
 
 M: Generate a certificate manually.
 A: Get certificates for all hosts
 Q: Quit
Which host do you want to get a certificate for:

Choisissez le numéro correspondant au domaine pour lequel vous voulez créer le certificat, ou 'A' pour tous les faire. Vous pouvez aussi faire 'M' pour en créer un manuellement, mais IIS ne se mettra pas à jour.

Attention, dans la version actuelle, la validation peut ne pas fonctionner correctement à cause de la gestion des fichiers statiques dans IIS. Le message d'erreur suivant apparait :

This could be caused by IIS not being setup to handle extensionless static
files. Here's how to fix that:
1. In IIS manager goto Site/Server->Handler Mappings->View Ordered List
2. Move the StaticFile mapping above the ExtensionlessUrlHandler mappings.
(like this http://i.stack.imgur.com/nkvrL.png)"

Si vous avez ce message, vous pouvez suivre les indications pour corriger le problème, mais ça risque d'empêcher le fonctionnement des applications ASP.NET MVC. Le bug est connu et sera probablement corrigé dans les prochains jours - en attendant la version corrigée peut être téléchargée ici : [https://github.com/glacasa/letsencrypt-win-simple/releases/tag/v1.7.1]

Une fois que c'est fait, une tâche planifiée s'est enregistrée, qui va vérifier chaque jour si il est temps de renouveler un certificat. Vous n'avez plus rien à faire.

Désactivation de SSL, et activation de TLS

J'en parlais dans mon article de l'an dernier, et c'est toujours d'actualité : si vous ne l'avez pas encore fait sur votre serveur, il vous faut activer TLS et désactiver SSL, pour des raisons de sécurité. Ces protocoles ne sont pas liés à Let's Encrypt, et sont gérés par Windows. Il faut modifier certaines clés de registre, il vous suffit de taper les lignes suivantes dans dans une invite de commande avec les droits administrateurs :

REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\SSL 2.0\Server" /v Enabled /t REG_DWORD /d 0 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\SSL 2.0\Client" /v Enabled /t REG_DWORD /d 0 /f

REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\SSL 3.0\Server" /v Enabled /t REG_DWORD /d 0 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\SSL 3.0\Client" /v Enabled /t REG_DWORD /d 0 /f

REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.0\Server" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.0\Server" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.0\Client" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.0\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f

REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.1\Server" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.1\Server" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.1\Client" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.1\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f

REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.2\Server" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.2\Server" /v DisabledByDefault /t REG_DWORD /d 0 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.2\Client" /v Enabled /t REG_DWORD /d 1 /f
REG ADD "HKLM\System\CurrentControlSet\Control\SecurityProviders\SChannel\Protocols\TLS 1.2\Client" /v DisabledByDefault /t REG_DWORD /d 0 /f

Ceci n'a besoin d'être fait qu'une seule fois sur votre serveur - jusqu'à la prochaine faille de sécurité d'un de ces protocoles.