Pasé por el proceso de intentar agregar un enlace https a un sitio y puede ser bastante doloroso. Hay muchas maneras de lograr cada paso y cada una tiene dificultades. Estoy dejando atrás la solución final con la esperanza de que alguien la encuentre útil.
Esta solución supone que tiene IIS instalado y un sitio web definido. Llame al sitio sample.contoso.com para los fines de esta publicación. Suponga que tiene un certificado en un archivo sample.contoso.com.pfx que también desea usar.
El primer paso es importar el certificado del archivo.
$certPwd = ConvertTo-SecureString -String "password" -Force -AsPlainText
$webServerCert = Import-PfxCertificate -FilePath c:\some\folder\sample.contoso.com.pfx -CertStoreLocation Cert:\LocalMachine\My -Password $certPwd
Sería bueno si eso fuera suficiente. Y en algunos casos puede ser. Sin embargo, para mí, esto dejó el certificado sin el acceso adecuado a la clave privada. Esto provocó un error de PowerShell "No existe una sesión de inicio de sesión especificada. Es posible que ya haya finalizado" cuando agregué el certificado al enlace (consulte ese paso más adelante). Entonces, el siguiente paso es arreglar la ACL para la clave 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
Esto permitirá que el sistema local tenga acceso completo a la clave privada si no se hereda de la carpeta que lo contiene.
Si desea obtener un certificado que ya está instalado, necesita el hash y puede recuperarlo con Get-Item de la siguiente manera:
$webServerCert = get-item Cert:\LocalMachine\My\XFX2DX02779XFD1F6F4X8435A5X26ED2X8DEFX95
El siguiente paso es crear el enlace.
New-WebBinding -Name sample.contoso.com -IPAddress * -Port 443 -Protocol "https"
Es importante tener en cuenta que "https" distingue entre mayúsculas y minúsculas. Si utiliza "HTTPS" en su lugar, obtendrá un resultado de enlace realmente diferente.
Este enlace aún no tiene un certificado adjunto, por lo que el último paso es adjuntar el certificado. Si el certificado es de confianza y la seguridad es correcta, este paso debe ser exitoso. Sin embargo, puede ser complicado si hay algún problema con el certificado.
$bind = Get-WebBinding -Name $webSiteDNSName -Protocol https
$bind.AddSslCertificate($webServerCert.GetCertHashString(), "my")
Si esto falla con un mensaje sobre una sesión de inicio de sesión no existe, entonces el certificado puede tener algún problema. Revise el visor de eventos para más detalles. Durante mis esfuerzos, encontré el evento 5061 en el registro de seguridad. Cuando falló, mostró que OpenKey falló con 80090016 (El conjunto de claves no existe). Y el fallo se debió a que SYSTEM no tenía acceso a la clave privada.
Eso fue suficiente para crear el enlace https. El enlace http fue un subproducto del uso del cmdlet New-WebSite. Si no es gratis, no creo que crear el enlace del puerto 80 con el cmdlet New-WebBinding sea un desafío.