Powershell: Générer un certificat SAN pour IIS 7 avec un CA Entreprise
Nous allons voir dans ce post comment générer automatiquement un certificat SAN pour un serveur Web IIS 7.0 à partir d’une PKI d’entreprise, ce certificat va nous permettre d’avoir plusieurs URL en HTTPS sur un même serveur Web. Pour y parvenir nous allons notamment utiliser le PSRemoting apporté par WinRM ainsi que les CmdLets IIS.
Nous lançons notre script à partir d’une console d’administration et devons utiliser le PSRemoting pour créer le fichier CSR sur le serveur IIS avant de l’envoyer à l’autorité de certification, puis une fois le certificat émis le récupérer dans le magasin local du serveur Web et configurer la partie IIS.
Tout d’abord voyons le modèle de certificat utilisé, il est nommé dans notre cas 2008-Webserver:
Une fois demandé le certificat devra être approuvé par le CA Manager, par ailleurs les informations du certificat seront contenues dans la requête (CSR). La clef privée à une longueur minimale de 2048 bits et n’est pas exportable. Le CSR sera généré avec certreq.exe à partir d’un fichier RequestPolicy.inf. Dans ce fichier, nous déclarons le Subject Alternate Name de notre certificat (i.e. nos multiples URL), à des endroits bien précis du fichier RequestPolicy.inf:
Comme l’indique la capture d’écran ci-dessus de cet article technet, les SAN seront déclarés dans la section Extension du fichier. Attention sur un CA d’entreprise ne jamais permettre l’obtention de certificats SAN en éditant la section RequestAttributes du fichier RequestPolicy.inf, ceci pour des raisons de sécurité, cela n’est valable que pour un CA en standalone.
Voyons donc à quoi va ressembler notre fichier RequestPolicy.inf:
[Version]
Signature=”$Windows NT$”[NewRequest]
Exportable = FALSE
KeyLength = 204
RequestType = CMC
[RequestAttributes]
CertificateTemplate= 2008-WEBSERVER[Extensions]
2.5.29.17 = “{text}”
_continue_ = “dns=webURL1.ldap389.info&”
_continue_ = “dns=webURL2.ldap389.fr&”
_continue_ = “dns=webURL3.ldap389.info&”
Pour lancer la génération du CSR sur le serveur IIS ($webserver) avec la commande certreq -new, ceci à partir de notre console nous utilisons le CmdLet Invoke-Command. A propos du PSRemoting et WinRM je vous conseille la lecture des séries d’articles de Ravikanth Chaganti.
Le fichier CSR ($iisreq) doit ensuite être soumis au CA ($CAPath):
$array = @($CAPath,$iisreq) $Requestforsigning = invoke-command $webserver {param($argarray);certreq.exe -config $argarray[0] -submit $argarray[1]} -ArgumentList $array,$null $reqt = $Requestforsigning[0].replace('RequestId: ','') |
L’ID de la requête est alors récupéré dans la variable $reqt. Il devra ensuite être validé sur la console d’administration par un CA Manager (vous 🙂 ), à l’aide de la commande certutil -resubmit $reqt.
Reste ensuite à récupérer le certificat sur le serveur IIS et à l’intégrer dans le magasin local de l’ordinateur, toujours avec le CmdLet Invoke-Command:
$array = @($reqt,$iiscrt,$CAPath) invoke-command $webserver -scriptblock { param($argarray) certreq -config $argarray[2] -retrieve $argarray[0] $argarray[1] certreq -accept $argarray[1] } -ArgumentList $array,$null |
Notre certificat SAN est alors importé dans le magasin local de notre serveur IIS:
Ne reste plus qu’à configurer IIS, pour cela nous allons utiliser les WebAdministration CmdLets qui sont installées sur le serveur et suivre les instructions données dans ce post. Il nous faut donc tout d’abord récupérer le thumbprint du certificat à partir de notre console avec la commande certutil -view:
$thumbprint = ((((certutil -view -restrict "RequestID=$reqt" -out CertificateHash csv)[1]).replace(' ','')).replace('"','')).ToUpper() |
Puis lancer les commandes suivantes sur notre serveur IIS:
import-module WebAdministration New-WebBinding -Name "Default Web Site" -IP "*" -Port 443 -Protocol https cd IIS:\SslBindings Get-Item cert:\LocalMachine\MY\$thumbprint | new-item 0.0.0.0!443 |
En utilisant toujours Invoke-Command (alias: icm). Voilà, votre IIS est configuré et vous pouvez appeler les URL désirées en HTTPS:
Pour télécharger le script complet c’est ici:
Ne vous reste plus qu’à changer les variables suivantes:
- $CAPath: Chemin de votre CA, sous la forme %FQDN_Serveur_CA%\%Nom_CA%
- $webURL1, $webURL2, $webURL3: Les URLs à mettre dans le SAN, attention adapter le script pour un nombre d’URLs différent.
- $CertTemplate: Nom du modèle de certificat utilisé.
- $webserver: Nom du serveur IIS 7.
This post is also available in: Anglais