Como posso criar e instalar um certificado assinado por domínio no IIS usando PowerShell?

Como posso criar e instalar um certificado assinado por domínio no IIS usando PowerShell?

No meu ambiente, hospedamos muitos sites e serviços da web WCF no IIS (no Windows 2008 R2 e no Windows 2012).

Estamos no processo de ativação do HTTPS nesses sites. Isto é o seguinte:

  • Crie um *.environment.domaincertificado assinado por domínio no IIS, usando a Autoridade de Certificação do Active Directory que está disponível em nossa rede.
  • Habilite HTTPS nos sites, alterando as vinculações do site e aplicando o certificado gerado.

Dada a quantidade de máquinas e sites, gostaríamos de automatizar as ações necessárias. Posso aplicar as ligações de site corretas aos sites durante a implantação, mas ainda não encontrei uma solução para criar e instalar um certificado assinado por domínio no IIS.

Já descobri como fazer isso manualmente, usando o ícone 'Certificados de Servidor' no IIS e invocando a ação 'Criar Certificado de Domínio'. Posso fornecer as credenciais corretas e, quando especifico a Autoridade de Certificação, posso criar os certificados desejados.

Também descobri que você pode visualizar quais certificados estão instalados na máquina usando a cert:\unidade do PowerShell:

cert:\LocalMachine\My> Get-ChildItem

E descobri que no Windows Server 2012 existe um New-SelfSignedCertificatePowerShell CmdLet disponível.

No entanto, não consigo encontrar os comandos do PowerShell necessários para combinar todas essas ações no Windwos Server 2008 R2.

Como posso criar e instalar um certificado SSL assinado por domínio no IIS, usando PowerShell?

Responder1

Experimente o seguinte:

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
    }
}

Basicamente, ele usa apenas certreg.exe em vez de cmdlets nativos do PowerShell (não tenho certeza se eles existem e, se existirem, geralmente não existem em sistemas operacionais mais antigos).

Os detalhes da solicitação estão na string aqui, corrija o assunto e outras configurações se necessário. Você pode querer mover mais valores para a seção de parâmetros.

Eu crio um arquivo inf para a nova solicitação e o converto em um arquivo de solicitação.

Em seguida, submeto a solicitação à CA especificada em $CAName. Se o usuário executor for um administrador de domínio, a solicitação será emitida imediatamente.

Finalmente, concluo a solicitação com -accept e faço alguma limpeza.

Normalmente também exporto o novo certificado para um arquivo PFX.

para a ligação do IIS e atribuição de certificado, você pode usar algo assim:

 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

informação relacionada