IIS : Gérez plusieurs certificats sur plusieurs serveurs Web

La gestion de plusieurs certificats de sécurité pouvant s'avérer pesante, vous pouvez utiliser Windows PowerShell pour accélérer le processus.

Jason Helmick

Gestion des certificats dans des environnements Web à grande échelle est un défi de grande envergure. Il pourrait y avoir des centaines de serveurs qui hébergent des centaines de sites Web SSL, toutes avec certificats uniques. Installation et maintenance des certificats à cette échelle sont un processus long avec l'interface graphique du gestionnaire des services Internet.

N'ayez pas peur, il est une meilleure façon. Si vous avez deux ou 200 serveurs Web, Windows PowerShell peuvent transformer des jours, des semaines ou des mois de votre temps en quelques minutes. Tout au long du processus de déploiement, installation et configuration de certificats et SSL pour vos sites Web, il y a quelques astuces que vous pouvez utiliser pour localiser les certificats expireront donc vous pouvez les remplacer.

Les règles du jeu est simple : Cela fonctionne sur IIS 7.5 et 8 IIS, mais vous avez besoin d'accès à distance Windows PowerShell activée. Pour cet exemple, il y a deux serveurs Web configurés dans un équilibre de la charge avec leur propre adresse IP de cluster. Chacun exécute trois nouveaux sites Web nécessitant des certificats et des liaisons pour SSL. J'ai changé les adresses IP de cluster dans le code pour les adresses internes à obscurcir les sites Web réels, mais vous voyez l'idée. J'ai acheté mon nouveaux certificats et avoir les fichiers .pfx prêtes à se déployer. Voici le récapitulatif des sites Web existants :

  • Shop.Company.com – adresse IP 192.168.3.201-Cert : Shop.Company.com.pfx
  • Update.Company.com – adresse IP 192.168.3.202-Cert : Update.Company.com.pfx
  • Register.Company.com – adresse IP 192.168.3.203-Cert : register.Company.com.pfx

Nous allons commencer par déployer et installer les certificats sur les serveurs Web à charge équilibrée.

Déployer et installer

Vous avez besoin de deux choses pour commencer, une variable qui contient une liste de noms d'ordinateur serveur Web et une session à distance Windows PowerShell pour chacun de ces serveurs. Les noms de mon ordinateur est venu depuis un fichier texte sur mon ordinateur, mais vous pouvez les récupérer depuis Active Directory si les serveurs Web sont membres du domaine :

PS> $servers = Get-Content c:\webservers.txt PS> $session = New-PsSession –ComputerName $servers

Copier les certificats pour les serveurs distants, donc vous pouvez les installer facilement. Ne vous inquiétez pas au sujet de quelqu'un voler vos fichiers .pfx. Vous allez supprimer avant la fin de la présente section. Pour cette démonstration, mes fichiers .pfx sont sur mon client ordinateur c:\sites\certpfx :

PS> $servers | foreach-Object{ copy-item -Path c:\sites\certpfx\*.* -Destination "\\$_\c$"}

CertUtil.exe est un outil formidable pour installer des certificats sur les sessions de communication à distance Windows PowerShell. Dans les passages suivants, chaque serveur Web va installer les certificats. Rappelez-vous, il y a trois certificats d'installer (un pour chaque site Web), donc j'ai répété les commandes :

PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\shop.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\update.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\register.company.com.pfx}

Lorsque vous utilisez CertUtil.exe, vous devrez spécifier le mot de passe pour le .pfx. Parce que j'ai réalisé cela en temps réel, j'ai juste tapé le mot de passe. Si vous allez créer un script, je vous recommande de remplacer les mots de passe par une variable qui reçoit le mot de passe depuis une invite de commandes, telles que :

PS> $Cred = (Get-Credential).password

Assurez-vous de supprimer les fichiers .pfx depuis les serveurs Web distants afin d'éviter tout vol de certificat possible :

PS> $servers | foreach-object {Remove-Item -Path "\\$_\c$\*.pfx"}

Avec les certificats installés sur les serveurs distants, l'étape suivante consiste à créer les liaisons HTTPS pour les sites Web.

Créer des liaisons de site Web

Chaque site Web sur chaque serveur de l'équilibrage de la charge a besoin d'une liaison HTTPS. Utilisez la cmdlet New-WebBinding du module WebAdministration et le processus sera un jeu d'enfant. Les paramètres de l'applet de commande spécifient le nom du site, protocole, port et l'adresse IP de cluster pour le site. Les SSLFlags déterminer où se trouve le certificat que vous utiliserez pour la liaison :

PS> Invoke-Command -session $session {Import-Module WebAdministration} PS> Invoke-command -Session $session { New-WebBinding -name shop -Protocol https -Port 443 -IPAddress 192.168.3.201 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name update -Protocol https -Port 443 -IPAddress 192.168.3.202 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name register -Protocol https -Port 443 -IPAddress 192.168.3.203 -SslFlags 0}

Les certificats que vous venez installé sont dans le stockage de certificats de Windows, mais Voici les options :

  • 0 – Certificat régulier dans le stockage de certificats de Windows
  • 1 – Certificat d'Indication de nom (SNI)
  • 2 – Magasin de certificats central
  • 3 – Certificat SNI dans le magasin de certificats central

Il y a une dernière étape à compléter, qui est souvent négligée et oubliée : liaison entre les certificats et les nouvelles liaisons de site Web.

Lier les certificats

Cette dernière étape peut être source de confusion. Le gestionnaire des services Internet graphique cache cette partie du processus, mais vous ne pouvez pas omettre si vous souhaitez que vos sites pour travailler avec SSL. Vous devez lier le certificat à la liaison du site Web.

Il s'agit d'un processus en deux phases. Tout d'abord, vous devez obtenir l'empreinte numérique du certificat pour chaque site Web, donc il peut créer une liaison SSL appropriée. N'oubliez pas, je travaille avec trois sites Web dans cet exemple. Je vais avoir besoin de l'empreinte numérique de chaque certificat unique. J'ai choisi de stocker l'empreinte numérique à trois variables différentes donc je ne confondent quand je leur lien vers les sites Web :

PS> Invoke-Command -session $session { $CertShop=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*shop*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertUpdate=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*update*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertRegister=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*register*"} | Select-Object -ExpandProperty Thumbprint}

Maintenant il est temps d'utiliser l'empreinte numérique pour saisir l'intégralité du certificat et l'assigner comme une liaison SSL pour chaque site Web. La commande suivante utilise Get-Item pour récupérer le certificat, puis New-Item pour créer la liaison SSL ; le fournisseur IIS IIS:\SSLBindings crée les liaisons SSL ainsi que les informations de liaison :

PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certShop" | new-item -path IIS:\SslBindings\192.168.3.201!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certUpdate" | new-item -path IIS:\SslBindings\192.168.3.202!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certRegister" | new-item -path IIS:\SslBindings\192.168.3.203!443}

Dans IIS renseignement contraignant est normalement affiché comme IPAddress:Port:Hostname (*: 80: *). En revanche, Windows PowerShell avec le signe deux-points (:) comme un indicateur de trajectoire. Lorsque vous utilisez Windows PowerShell pour définir les informations de liaison, vous utilisez le point d'exclamation (!).

Les liaisons sont maintenant terminées et vous pourrez rejoindre les sites Web à l'aide de HTTPS, comme illustré ici :

PS> start iexplore https://shop.company.com PS> start iexplore https://update.company.com PS> start iexplore https://register.company.com

Cocher pour l'expiration

Il y a une autre solution utile qui emploie toutes les informations que vous venez d'apprendre. C'est un défi d'affaires courant pour bon nombre d'entre vous : Sont vos certificats à expiration ?

Cadre de gestion des certificats est de déterminer si certains sont sur le point d'expirer donc vous pouvez les remplacer. Vous pouvez appliquer les concepts et les tactiques utilisées ici pour ce problème. Vous avez juste besoin d'un bon mot plus. Encore une fois, vous devez toujours une ouverture de session Windows PowerShell remoting pour les serveurs Web, que vous voulez vérifier des certificats expirés.

L'exemple suivant recherche tous les certificats dans le magasin de certificats localmachine. Il compare le certificat expiration propriété notafter à la date du jour dans une colonne personnalisée, j'ai nommé ExpireInDays. Le filtre (Where-Object) vérifie si les certificats ont moins de 90 jours avant leur expiration. La commande répertorie les noms de serveur et les certificats sur le point d'expirer :

PS> Invoke-Command -Session $session { Get-ChildItem -Path Cert:\LocalMachine\My | Select-Object -Property PSComputerName, Subject, @{ n='ExpireInDays';e={($_. notafter - (Get-Date)).Days}} | Where-Object {$_.ExpireInDays -lt 90}}

L'utilisation de tout ce que vous avez appris ici, vous pouvez avec succès et rapidement remplacer tous ces certificats — même à grande échelle — à l'aide de Windows PowerShell.

Jason Helmick

Jason Helmickest le directeur des technologies de Windows PowerShell pour l'Interface de formation technique, basée à Phoenix, Arizona Il est conférencier, auteur, enseignant et administrateur IIS par inadvertance.

Contenu associé