Eu passei pelo processo de tentar adicionar uma ligação https a um site e isso pode ser bastante doloroso. Existem várias maneiras de realizar cada etapa e cada uma delas possui armadilhas. Estou deixando para trás a solução final, esperando que alguém a ache útil.
Esta solução pressupõe que você tenha o IIS instalado e um site definido. Ligue para o site sample.contoso.com para os fins desta postagem. Suponha que você tenha um certificado em um arquivo sample.contoso.com.pfx que também deseja usar.
A primeira etapa é importar o certificado do arquivo.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Seria bom se isso fosse suficiente. E, em alguns casos, pode ser. No entanto, para mim, isso deixou o certificado sem acesso adequado à chave privada. Isso causou um erro no PowerShell "Não existe uma sessão de logon especificada. Ela já pode ter sido encerrada" quando adicionei o certificado à ligação (consulte essa etapa posteriormente). Portanto, a próxima etapa é corrigir a ACL da chave privada.
$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
Isso permitirá que o sistema local tenha acesso total à chave privada se isso não for herdado da pasta que o contém.
Se você deseja obter um certificado que já está instalado, é necessário o hash e pode recuperá-lo com Get-Item da seguinte forma:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
O próximo passo é criar a ligação.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
É importante observar que "https" diferencia maiúsculas de minúsculas. Se você usar "HTTPS", obterá um resultado de ligação realmente diferente.
Essa ligação ainda não possui um certificado anexado; portanto, a última etapa é anexar o certificado. Se o certificado for adequadamente confiável e a segurança estiver correta, esta etapa será bem-sucedida. Pode ser complicado se houver algum problema com o certificado.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Se isso falhar com uma mensagem sobre uma sessão de logon não existir, o certificado poderá ter algum problema. Revise o visualizador de eventos para obter mais detalhes. Durante meus esforços, encontrei o evento 5061 no log de segurança. Quando falhou, mostrou que o OpenKey falhou com 80090016 (O conjunto de chaves não existe). E a falha ocorreu porque o SYSTEM não teve acesso à chave privada.
Isso foi suficiente para criar a ligação https. A ligação http foi um subproduto do uso do cmdlet New-WebSite. Se não for de graça, não considero um desafio criar a ligação da porta 80 com o cmdlet New-WebBinding.