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

4

No meu ambiente, hospedamos uma grande quantidade de sites e serviços Web WCF no IIS (no Windows 2008 R2 e Windows 2012).

Estamos no processo de ativar o HTTPS nesses sites. Isso é o seguinte:

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

Dado o número 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 de domínio assinado no IIS.

Eu já descobri como fazer isso manualmente, usando o ícone 'Server Certificates' no IIS e invocando a ação 'Create Domain Certificate'. Eu posso fornecer as credenciais corretas e, quando eu especificar a Autoridade de Certificação, posso criar os certificados desejados.

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

cert:\LocalMachine\My> Get-ChildItem

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

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

Como faço para criar e instalar um certificado SSL assinado por domínio no IIS, usando o PowerShell?

    
por oɔɯǝɹ 20.02.2015 / 14:45

1 resposta

5

Tente 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 o certreg.exe em vez de cmdlets nativos do PowerShell, (não sei se eles existem e, se houver, geralmente não há sistemas operacionais mais antigos).

Os detalhes da solicitação estão na sequência 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 criei um arquivo inf para o novo pedido e o converto em um arquivo de solicitação.

Em seguida, envio a solicitação para a CA especificada em $ CAName, se o usuário em execução for um administrador de domínio, a solicitação será emitida imediatamente.

Por fim, concluo a solicitação com -accept e faço algumas limpezas.

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

para a vinculação do IIS e a 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
    
por 20.02.2015 / 22:39