¿Cómo puedo crear e instalar un certificado firmado de dominio en IIS usando PowerShell?

¿Cómo puedo crear e instalar un certificado firmado de dominio en IIS usando PowerShell?

En mi entorno alojamos una gran cantidad de sitios web y servicios web WCF en IIS (en Windows 2008 R2 y Windows 2012).

Estamos en el proceso de habilitar HTTPS en estos sitios. Esto es lo siguiente:

  • Cree un certificado firmado de dominio *.environment.domainen IIS, utilizando la Autoridad de certificación de Active Directory que está disponible en nuestra red.
  • Habilite HTTPS en los sitios cambiando los enlaces del sitio y aplicando el certificado generado.

Dada la cantidad de máquinas y sitios, nos gustaría automatizar las acciones requeridas. Puedo aplicar los enlaces de sitio correctos a los sitios durante la implementación, pero todavía no he encontrado una solución para crear e instalar un certificado firmado de dominio en IIS.

Ya descubrí cómo hacer esto manualmente, usando el ícono 'Certificados de servidor' en IIS e invocando la acción 'Crear certificado de dominio' allí. Puedo proporcionar las credenciales correctas y, cuando especifico la Autoridad de certificación, puedo crear los certificados deseados.

También descubrí que puedes ver qué certificados están instalados en la máquina usando la cert:\unidad PowerShell:

cert:\LocalMachine\My> Get-ChildItem

Y descubrí que en Windows Server 2012 hay un New-SelfSignedCertificatePowerShell CmdLet disponible.

Sin embargo, parece que no puedo encontrar los comandos de PowerShell necesarios para combinar todas estas acciones en Windwos Server 2008 R2.

¿Cómo creo e instalo un certificado SSL firmado por un dominio en IIS mediante PowerShell?

Respuesta1

Pruebe lo siguiente:

function New-DomainSignedCertificate {
    [CmdletBinding()]
    param(
        [parameter(Mandatory=$true)]
        [string]
        $Hostname,

        [parameter(Mandatory=$true)]
        [string]
        $Organization,

        [parameter(Mandatory=$true)]
        [string]
        $OrganizationalUnit,

        [parameter(Mandatory=$true)]
        [string]
        $Locality,

        [parameter(Mandatory=$true)]
        [string]
        $State,

        [parameter(Mandatory=$true)]
        [string]
        $Country,

        [parameter(Mandatory=$true)]
        [string]
        $CertificateAuthority,

        [parameter(Mandatory=$false)]
        [string]
        $Keylength = "2048",

        [string]
        $workdir = $env:Temp
    )

    $fileBaseName = $Hostname -replace "\.", "_" 
    $fileBaseName = $fileBaseName -replace "\*", ""

    $infFile = $workdir + "\" + $fileBaseName + ".inf"
    $requestFile = $workdir + "\" + $fileBaseName + ".req"
    $CertFileOut = $workdir + "\" + $fileBaseName + ".cer"

    Try {
        Write-Verbose "Creating the certificate request information file ..."
        $inf = @"
[Version] 
Signature="`$Windows NT`$"

[NewRequest]
Subject = "CN=$Hostname, OU=$OrganizationalUnit, O=$Organization, L=$Locality, S=$State, C=$Country"
KeySpec = 1
KeyLength = $Keylength
Exportable = TRUE
FriendlyName = "$Hostname"
MachineKeySet = TRUE
SMIME = False
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0

[Extensions]
2.5.29.17 = "{text}"
_continue_ = "dns=$Hostname&"
"@

        $inf | Set-Content -Path $infFile

        Write-Verbose "Creating the certificate request ..."
        & certreq.exe -new "$infFile" "$requestFile"

        Write-Verbose "Submitting the certificate request to the certificate authority ..."
        & certreq.exe -submit -config "$CertificateAuthority" -attrib "CertificateTemplate:WebServer" "$requestFile" "$CertFileOut"

        if (Test-Path "$CertFileOut") {
            Write-Verbose "Installing the generated certificate ..."
            & certreq.exe -accept "$CertFileOut"
        }

    }
    Finally {
        Get-ChildItem "$workdir\$fileBaseName.*" | remove-item
    }
}

Básicamente, solo usa certreg.exe en lugar de cmdlets nativos de PowerShell (no estoy seguro de que existan y, si existen, generalmente no los hay en sistemas operativos más antiguos).

Los detalles de la solicitud se encuentran en la cadena aquí, corrija el asunto y otras configuraciones si es necesario. Es posible que desee mover más valores a la sección de parámetros.

Creo un archivo inf para la nueva solicitud y lo convierto en un archivo de solicitud.

Luego envío la solicitud a la CA especificada en $CAName, si el usuario ejecutor es un administrador de dominio, la solicitud se emite de inmediato.

Finalmente completo la solicitud con -aceptar y hago una limpieza.

Normalmente también exporto el nuevo certificado a un archivo PFX.

para el enlace de IIS y la asignación de certificados, puede utilizar algo como esto:

 New-WebBinding -Name www.test.local   -Port 443 -Protocol https
 $thumb = (Get-ChildItem cert:\LocalMachine\MY | where-object { $_.FriendlyName -like "www.test.local" } | Select-Object -First 1).Thumbprint
 $guid = [guid]::NewGuid()
 & netsh http add sslcert hostnameport=www.test.local:443 certhash=$thumb appid=`{$guid`} certstorename=MY

información relacionada