Powershell : désactivation de TLS 1.0 et 1.1, activation de TLS 1.2

En lien direct avec le billet d'hier, j'ai donc concocté un script permettant d'automatiser les modifications requises en base de registre pour l'activation de TLS 1.2 au profit de TLS 1.0 et 1.1.

Naturellement, le script est à exécuter avec un compte d'utilisateur ayant les droits d'écrire en base de registre.

echo "This script will create or write over some registry keys related to TLS 1.0, TLS 1.1 and TLS 1.2 - make sure to be aware of the effect of those modifications."
$continue = Read-Host "Are you sure you want to execute this script ? Type 'Y' to continue or any other character to abort"
if ($continue -ne 'Y') {break}
$pathtls10 = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.0"
$pathtls11 = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.1"
$pathtls12 = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\TLS 1.2"
$pathprtcl = "HKLM:\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols\"
echo "Creating TLS keys..."
New-Item -Path $pathprtcl -Name "TLS 1.0" -Force | Out-Null
New-Item -Path $pathprtcl -Name "TLS 1.1" -Force | Out-Null
New-Item -Path $pathprtcl -Name "TLS 1.2" -Force | Out-Null
New-Item -Path $pathtls10 -Name "Server" -Force | Out-Null
New-Item -Path $pathtls10 -Name "Client" -Force | Out-Null
New-Item -Path $pathtls11 -Name "Server" -Force | Out-Null
New-Item -Path $pathtls11 -Name "Client" -Force | Out-Null
New-Item -Path $pathtls12 -Name "Server" -Force | Out-Null
New-Item -Path $pathtls12 -Name "Client" -Force | Out-Null
echo "Adding DWORD properties..."
New-ItemProperty -Path $pathtls10Client -PropertyType DWORD -Name "DisabledByDefault" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls10Server -PropertyType DWORD -Name "DisabledByDefault" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls11Client -PropertyType DWORD -Name "DisabledByDefault" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls11Server -PropertyType DWORD -Name "DisabledByDefault" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls12Client -PropertyType DWORD -Name "DisabledByDefault" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls12Server -PropertyType DWORD -Name "DisabledByDefault" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls10Client -PropertyType DWORD -Name "Enabled" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls10Server -PropertyType DWORD -Name "Enabled" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls11Client -PropertyType DWORD -Name "Enabled" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls11Server -PropertyType DWORD -Name "Enabled" -Value "0x00000000" -Force | Out-Null
New-ItemProperty -Path $pathtls12Client -PropertyType DWORD -Name "Enabled" -Value "0x00000001" -Force | Out-Null
New-ItemProperty -Path $pathtls12Server -PropertyType DWORD -Name "Enabled" -Value "0x00000001" -Force | Out-Null
echo "Done."
$reboot = Read-Host "Server has to reboot in order to apply the modifications made. Type 'Y' if you want to start a reboot countdown of 2 minutes."
if ($reboot -ne 'Y') {break}
shutdown -r -t 120
echo "Server will reboot in 2 minutes."

Si jamais l'accès Terminal Server est impossible au redémarrage, il faut contrôler les réglages de sécurité du serveur RDP et être sûr que le KB3080079 est installé si l'OS est Windows Server 2008 R2. Tout est expliqué dans l'article que j'ai publié hier sur les manipulations d'origine.

Désactivation de TLS 1.0, TLS 1.1 et activation de TLS 1.2 sur Windows Server 2008 R2 et +

Il a été décidé par les responsables d'une plateforme sur laquelle je suis intervenu ce jour de la désactivation de TLS 1.0 et 1.1 au profit de 1.2 sur un serveur Windows 2008 R2 utilisant IIS 7. Je vais donc décrire dans cet article les modifications qui sont à réaliser en base de registre - je pense réaliser par la suite un script permettant l'automatisation de la création et peuplement de ces clefs.

En préalable, il est important de vérifier que le KB 3080079 soit installé sur le serveur si 2008 R2, sans quoi une fois la désactivation de TLS 1.0 effective il ne sera plus possible d'accéder en Remote Desktop sur le serveur. Je renvoie à cette page pour plus d'informations.

J'ai réalisé une archive ZIP des clefs de registre évoquées dans ce billet sur mon miroir de téléchargement.

Dans la base de registre, on ira jusqu'à la clef suivante :
HKLM\SYSTEM\CurrentControlSet\Control\SecurityProviders\SCHANNEL\Protocols

Une fois dans cette clef, il suffira de créer une clef supplémentaire par protocole. On créé donc 3 clefs : TLS 1.0, TLS 1.1 et TLS 1.2. A noter qu'il est fort probable que soient déjà présentes d'autres clefs pour SSL, comme sur cette capture d'écran.

Dans chacune des clefs TLS, il faudra créer 2 sous-clefs : Client et Server. L'arborescence ressemble donc à cela :

Dans chacune des 6 clefs qui ont été crées, il faudra ajouter 2 valeurs DWORD en hexadécimal :

  • DisabledByDefault, qui aura toujours la valeur 0
  • Enabled, qui aura la valeur 0 pour TLS 1.0 et TLS 1.1 et la valeur 1 pour TLS 1.2.

Ce qui donne, pour TLS 1.0\Client, TLS 1.0\Server, TLS 1.1\Client et TLS 1.1\Server :

Pour TLS 1.2\Client et TLS 1.2\Server :

Ensuite, un redémarrage du serveur suffit pour que les modifications soient prises en compte. Les protocoles TLS 1.0 et 1.1 ne sont plus actifs. A noter que ces clefs de registre peuvent également être appliquées sur Windows Server 2012 et R2.

Si jamais le Remote Desktop ne fonctionne plus une fois TLS 1.0 désactivé et que le patch est bien installé sur le serveur (si antérieur à 2012), il faut forcer le Terminal Server à utiliser son encryption et non celle de TLS 1.0. Pour ce faire, on ouvrira tsconfig.msc, puis les propriétés du serveur. Cette fenêtre s'ouvre :

Il est important que le Security Layer soit basculé sur RDP Security Layer et non TLS 1.0, faute de quoi la connexion sera impossible.