Ho provato ad aggiungere un'associazione https a un sito e può essere piuttosto doloroso. Ci sono molti modi per compiere ogni passo e ognuno ha insidie. Lascio alle spalle la soluzione finale sperando che qualcuno la troverà utile.
Questa soluzione presuppone che IIS sia installato e che sia stato definito un sito Web. Chiamare il sito sample.contoso.com ai fini di questo post. Supponiamo di avere un certificato in un file sample.contoso.com.pfx che si desidera utilizzare anche.
Il primo passo è importare il certificato dal file.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Sarebbe bello se fosse sufficiente. E in alcuni casi potrebbe essere. Tuttavia, per me, questo ha lasciato il certificato senza un accesso adeguato alla chiave privata. Ciò ha causato un errore PowerShell "Una sessione di accesso specificata non esiste. Potrebbe essere già stata terminata" quando sono andato per aggiungere il certificato all'associazione (vedere il passaggio successivo). Quindi, il prossimo passo è sistemare l'ACL per la chiave privata.
$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
Ciò consentirà al sistema locale di avere pieno accesso alla chiave privata se questa non è ereditata dalla cartella contenente.
Se si desidera ottenere un certificato già installato, è necessario l'hash per esso e è possibile recuperarlo con Get-Item in questo modo:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
Il prossimo passo è creare l'associazione.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
È importante notare che "https" fa distinzione tra maiuscole e minuscole. Se invece usi "HTTPS", otterrai un risultato di associazione molto diverso.
Questa associazione non ha ancora un certificato allegato, quindi l'ultimo passaggio è quello di allegare il certificato. Se il certificato è correttamente attendibile e la sicurezza è corretta, questo passaggio dovrebbe avere esito positivo. Può essere pignolo se c'è qualche problema con il certificato però.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Se ciò non riesce con un messaggio su una sessione di accesso non esiste, il certificato potrebbe presentare qualche problema. Controlla il visualizzatore eventi per maggiori dettagli. Durante i miei sforzi, ho trovato l'evento 5061 nel registro di sicurezza. Quando falliva, mostrava che OpenKey falliva con 80090016 (il Keyset non esiste). E l'errore è stato dovuto al fatto che SYSTEM non aveva accesso alla chiave privata.
Questo è stato sufficiente per me per creare l'associazione https. Il binding http era un sottoprodotto dell'utilizzo del cmdlet New-WebSite. Se non viene fornito gratuitamente, non ho trovato la creazione del binding della porta 80 con il cmdlet New-WebBinding essere una sfida.