J'ai essayé d'ajouter une liaison https à un site et cela peut être assez douloureux. Il existe de nombreuses façons d'accomplir chaque étape et chacune a ses pièges. Je laisse la solution finale en espérant que quelqu'un la trouvera utile.
Cette solution suppose que vous avez installé IIS et défini un site Web. Appelez le site sample.contoso.com aux fins de cet article. Supposons que vous disposez d'un certificat dans un fichier sample.contoso.com.pfx que vous souhaitez également utiliser.
La première étape consiste à importer le certificat à partir du fichier.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Ce serait bien si cela suffisait. Et dans certains cas, cela peut être le cas. Cependant, pour moi, cela a laissé le certificat sans accès approprié à la clé privée. Cela a provoqué une erreur PowerShell "Une session d'ouverture de session spécifiée n'existe pas. Elle peut déjà avoir été terminée" lorsque je suis allé ajouter le certificat à la liaison (voir cette étape plus tard). La prochaine étape consiste donc à réparer l'ACL pour la clé privée.
$privateKeyFilename = $webServerCert.PrivateKey.CspKeyContainerInfo.UniqueKeyContainerName
$privateKeyFullPath = "c:\ProgramData\Microsoft\Crypto\RSA\MachineKeys\"+$privateKeyFilename
$aclRule = "SYSTEM", "Full", "Allow"
$aclEntry = New-Object System.Security.AccessControl.FileSystemAccessRule $aclRule
$privateKeyAcl = (Get-Item $privateKeyFullPath).GetAccessControl("Access")
$privateKeyAcl.AddAccessRule($aclEntry)
Set-Acl $privateKeyFullPath $privateKeyAcl
Cela permettra au système local d'avoir un accès complet à la clé privée si elle n'est pas héritée du dossier contenant.
Si vous souhaitez obtenir un certificat qui est déjà installé, vous avez besoin du hachage pour celui-ci et pouvez le récupérer avec Get-Item comme ceci:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
L'étape suivante consiste à créer la liaison.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Il est important de noter que "https" est sensible à la casse. Si vous utilisez "HTTPS" à la place, vous obtenez un résultat de liaison vraiment différent.
Cette liaison n'a pas encore de certificat attaché, donc la dernière étape consiste à attacher le certificat. Si le certificat est correctement approuvé et que la sécurité est correcte, cette étape doit réussir. Cela peut être difficile s'il y a un problème avec le certificat.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Si cela échoue avec un message sur une session d'ouverture de session n'existe pas, le certificat peut avoir un problème. Consultez l'Observateur d'événements pour plus de détails. Au cours de mes efforts, j'ai trouvé l'événement 5061 dans le journal de sécurité. Lorsqu'il a échoué, il a montré que OpenKey a échoué avec 80090016 (le jeu de clés n'existe pas). Et l'échec était dû au fait que SYSTEM n'avait pas accès à la clé privée.
Cela m'a suffi pour créer la liaison https. La liaison http était un sous-produit de l'utilisation de l'applet de commande New-WebSite. Si ce n'est pas gratuit, je n'ai pas trouvé difficile de créer la liaison du port 80 avec l'applet de commande New-WebBinding.