Dominando Solicitações de Certificado no IIS com PowerShell

Se você deseja aprender como gerar uma solicitação de certificado IIS, você veio ao lugar certo. Neste artigo, vou explicar como eu fiz isso com o PowerShell e também como vincular um certificado a um site IIS.

Vamos esclarecer uma coisa. Eu odeio criptografia e certificados. Ao longo da minha carreira, fui o “cara dos certificados” em algumas ocasiões. No entanto, era apenas mais um chapéu para um administrador de sistema.

I never got to the point where I completely understood the technology and it seemed like every task I tried to accomplish around that area seemed to never work out. It’s definitely an unforgiving technology for sure.

Deixe-me contar uma história sobre automatizar a instalação de um certificado em um servidor IIS com o PowerShell.

A missão

A partir de um cliente, solicitar um novo certificado público Digicert, instalá-lo em um servidor remoto Windows Server 2012 R2 Core executando IIS 8.5 em um grupo de trabalho, configurar uma vinculação SSL para um site e usar o certificado instalado para a vinculação. Simples, certo? LOLz!

Como é feito, filho!

Em suma, são necessários X passos para fazer isso acontecer.

  1. Gerar uma solicitação de assinatura de certificado IIS no computador onde o certificado será instalado. No meu caso, eu só tinha acesso por WinRM, então tive que executar certreq.exe no servidor remoto usando Invoke-Command e enviar o conteúdo do CSR para um arquivo local.
  2. Obtenha o CSR assinado por uma CA pública. (Sem ajuda aqui – um certificado bonito acabou de voltar da segurança com a qual trabalhei). No meu caso, a equipe de segurança me devolveu uma coleção P7B de certificados agrupados em um arquivo .CER que incluía o certificado que eu estava procurando, bem como os certificados intermediários. Isso exigiu um pouco de experimentação para funcionar.
  3. Complete a solicitação de assinatura de certificado no computador onde o certificado será instalado. Isso colocará o certificado no repositório de certificados.
  4. Crie uma associação web SSL IIS no servidor.
  5. Anexe o certificado à associação web.

Gerando a Solicitação de Certificado do IIS

Sua primeira tarefa será executar certreq.exe com este script PowerShell IIS no servidor remoto para reunir um arquivo de solicitação. Para fazer isso, certreq.exe requer um arquivo INF como entrada. Este arquivo é usado para todas as várias opções que seu certificado acabará tendo. Sem entrar em muitos detalhes, esta é uma cópia do arquivo INF que eu estava usando.

[Version]
Signature = "$Windows NT$"
[NewRequest]
Subject = "C=US,S=State,L=City,O=Company,OU=IT,CN=Name"
Exportable = TRUE
KeyLength = 2048
KeySpec = 1
KeyUsage = 0xa0
MachineKeySet = True
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
Silent = True
SMIME = False
RequestType = PKCS10

Você verá na função New-CertificateSigningRequest que eu a deixo super fácil de personalizar. Na verdade, se você usar minhas funções, nem mesmo verá este arquivo, pois ele é necessário apenas temporariamente para criar o CSR (arquivo de solicitação).

Em seguida, você precisará colocar este arquivo INF no servidor remoto e executar certreq.exe com os seguintes parâmetros, como certreq.exe -new "$InfFilePath" "$reqFilePath".

Isso vai gerar um CSR (arquivo de solicitação) no computador remoto. Em seguida, você precisará enviar este arquivo para sua equipe de segurança. Isso também criará um certificado contendo tanto a chave privada quanto a chave pública no contexto Solicitações Emitidas de Certificado na máquina local.

Certificate service request in the Windows MMC snapin

Concluindo a Solicitação de Certificado IIS

No meu caso, recebi de volta um único arquivo CER. Criei uma função neste script do PowerShell IIS para simplesmente importá-lo diretamente no armazenamento Pessoal no contexto da máquina local, mas percebi que o IIS não conseguia vê-lo. O motivo era que o certificado também precisava conter a chave privada. Simplesmente importar o certificado no armazenamento Pessoal não funcionaria. Eu tinha que completar a solicitação de certificado usando certreq.exe.

Para fazer isso, você precisará copiar o certificado que recebeu de sua equipe de segurança para o servidor remoto e então executar certreq.exe assim certreq.exe -accept -machine "C:\issuedcert.cer".

Você sempre precisará garantir que o certificado de resposta sempre vá para o contexto da máquina local usando o parâmetro -machine. Isso deveria ser concluído com sucesso de acordo com tudo que li, mas definitivamente não foi o caso para mim. Por algum motivo, eu estava recebendo um erro que parecia com isso:

Error requesting certificate

Acontece que isso significa que a chave pública no arquivo de solicitação não correspondia ao que foi retornado pela equipe de segurança. Para testar isso, simplesmente execute certutil.exe -dump requestfile.req e certutil -dumpissuedcert.cer. Role para baixo na saída até encontrar a área da chave pública.

Encrypted public key

Copie cada uma dessas chaves privadas e compare em um editor de texto para garantir que sejam iguais. Se não forem, entre em contato com sua equipe de segurança por não ter assinado sua solicitação corretamente!

Se eles corresponderem, você está bem e não deve receber esse erro.

Crie a Associação SSL

No servidor remoto, execute:

PS> Import-Module WebAdministration
PS> New-WebBinding -Name $WebsiteName -IP * -Port 443 -Protocol https

Anexe o Certificado à Associação SSL

No servidor remoto, execute:

PS> $certificate = Get-Item Cert:\localmachine\My\$Thumbprint
PS> $certificate | New-Item "IIS:\SSLBindings\0.0.0.0!443"

Obtenha o Script IIS PowerShell

Se tudo correr bem, você deverá estar pronto! Agora, se você precisar de um pouco de ajuda para fazer isso, criei três funções para facilitar. Vá até meu repositório no Github para obter as funções:

https://github.com/adbertram/Random-PowerShell-Work/tree/master/Certificates

https://github.com/adbertram/Random-PowerShell-Work/tree/master/IIS

Exemplo de código

## Envie o arquivo que isso gera para sua equipe de certificados 
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## Importe o certificado recebido
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## Crie a associação e anexe o certificado.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

Leitura relacionada

Não deixe de conferir estas outras postagens do blog ATA sobre como gerenciar o IIS com PowerShell

Source:
https://adamtheautomator.com/iis-certificate-request/