IIS: Gerencie vários certificados em vários servidores Web

Gerenciar diversos certificados de segurança pode ser um trabalho difícil, mas o Windows PowerShell pode ajudar a agilizar o processo.

Jason Helmick

Gerenciamento de certificados em ambientes de grande escala da Web é um desafio em grande escala. Pode haver centenas de servidores que hospedam centenas de sites da Web SSL, todos com certificados originais. Instalação e manutenção de certificados nesta escala são um processo demorado com a GUI do Gerenciador do IIS.

Não tenho medo — lá é uma maneira melhor. Se você tiver dois ou 200 servidores de Web, o Windows PowerShell podem transformar dias, semanas ou meses de seu tempo em poucos minutos. Durante todo o processo de implantação, instalando e configurando certificados e SSL para seus sites da Web, existem alguns truques que você pode usar para localizar certificados que estão prestes a expirar, assim você pode substituí-los.

As regras básicas são simples: Isso funciona no IIS 7.5 e 8 do IIS, mas você precisa do Windows PowerShell remoting habilitado. Neste exemplo, existem dois servidores Web configurados em um equilíbrio de carga com seus próprios endereços IP de cluster. Cada um está executando três novos sites que precisam de certificados e ligações para SSL. Eu mudei os endereços IP de cluster no código para endereços internos a obscurecer os reais Web sites, mas você começa a idéia. Eu comprei meus novos certificados e ter os arquivos. pfx prontos para implantar. Aqui está o resumo dos sites existentes:

  • Shop.Company.com-endereço de IP 192.168.3.201-Cert: Shop.Company.com.pfx
  • Update.Company.com-endereço de IP 192.168.3.202-Cert: Update.Company.com.pfx
  • Register.Company.com-endereço de IP 192.168.3.203-Cert: Register.Company.com.pfx

Vamos começar por implantar e instalar os certificados nos servidores Web load-balanced.

Implantar e instalar

Você precisa de duas coisas para começar — uma variável que contém uma lista de nomes de computador de servidor Web e uma sessão remota do Windows PowerShell para cada um desses servidores. MEUS nomes de computador veio de um arquivo de texto no meu computador, mas você pode agarrá-los do Active Directory, se os servidores Web são membros do domínio:

PS> $servers = Get-Content c:\webservers.txt PS> $session = New-PsSession –ComputerName $servers

Copie os certificados para servidores remotos, assim você pode facilmente instalá-los. Não se preocupe alguém roubar seus arquivos. pfx. Você vai apagá-las antes que esta seção é completa. Para esta demonstração, meus arquivos. pfx são no meu cliente computador c:\sites\certpfx:

PS> $servers | foreach-Object{ copy-item -Path c:\sites\certpfx\*.* -Destination "\\$_\c$"}

CertUtil.exe é uma ótima ferramenta para instalar certificados através de sessões de comunicação remota do Windows PowerShell. Em seguir o one-liners, cada servidor Web irá instalar os certificados. Lembre-se, há três certificados para instalar (uma para cada site), então eu repeti os comandos:

PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\shop.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\update.company.com.pfx} PS> Invoke-command -Session $session { certutil -p P@ssw0rd -importpfx c:\register.company.com.pfx}

Quando você usar o CertUtil.exe, você precisará especificar a senha para o PFX. Porque realizei isso em tempo real, eu digitei as senhas. Se você vai construir um script, eu recomendaria trocar as senhas com uma variável que recebe a senha de um prompt, tais como:

PS> $Cred = (Get-Credential).password

Certifique-se de excluir os arquivos. pfx de servidores Web remotos para evitar o roubo de qualquer possível certificado:

PS> $servers | foreach-object {Remove-Item -Path "\\$_\c$\*.pfx"}

Com os certificados instalados em servidores remotos, o próximo passo é criar as ligações de HTTPS para sites da Web.

Criar ligações do Web site

Cada site em cada servidor o equilíbrio de carga precisa uma ligação HTTPS. Use o cmdlet New-WebBinding do módulo WebAdministration e o processo vai ser moleza. Os parâmetros do cmdlet especificam o nome do site, protocolo, porta e o endereço IP do cluster para o site. Os SSLFlags determinar onde se encontra o certificado que será usado para a ligação:

PS> Invoke-Command -session $session {Import-Module WebAdministration} PS> Invoke-command -Session $session { New-WebBinding -name shop -Protocol https -Port 443 -IPAddress 192.168.3.201 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name update -Protocol https -Port 443 -IPAddress 192.168.3.202 -SslFlags 0} PS> Invoke-command -Session $session { New-WebBinding -name register -Protocol https -Port 443 -IPAddress 192.168.3.203 -SslFlags 0}

Os certificados que você apenas instalado estão no armazenamento de certificado do Windows, mas aqui estão as opções:

  • 0 – Regular certificado no armazenamento de certificado do Windows
  • 1-Certificado de servidor indicação de nome (SNI)
  • 2-Loja central de certificado
  • 3 – Certificado SNI no armazenamento de certificados central

Há um último passo para completar, que é muitas vezes negligenciado e esquecido: ligando os certificados para as ligações de Web site novas.

Ligar os certificados

Esta última etapa pode ser confusa. O Gerenciador do IIS gráfica esconde esta parte do processo, mas você não pode deixá-lo fora se você quiser que seus sites para trabalhar com o SSL. Você tem que ligar o certificado para a ligação do Web site.

Este é um processo de duas fases. Primeiro, você tem que obter a impressão digital do certificado para cada site, assim ele pode criar uma ligação de SSL adequada. Lembre-se, eu estou trabalhando com três sites neste exemplo. Eu vou ter a impressão digital de cada certificado exclusivo. Eu escolhi para armazenar a impressão digital em três variáveis diferentes, então eu não confundi-los quando eu ligá-los aos Web sites:

PS> Invoke-Command -session $session { $CertShop=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*shop*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertUpdate=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*update*"} | Select-Object -ExpandProperty Thumbprint} PS> Invoke-Command -session $session { $CertRegister=Get-ChildItem -Path Cert:\LocalMachine\My | where-Object {$_.subject -like "*register*"} | Select-Object -ExpandProperty Thumbprint}

Agora é hora de usar a impressão digital para pegar o certificado inteiro e atribuí-lo como uma ligação SSL para cada site. O comando a seguir usa Get-Item para pegar o certificado, então o novo Item para criar a ligação SSL; o provedor IIS IIS:\SSLBindings cria ligações SSL juntamente com as informações de ligação:

PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certShop" | new-item -path IIS:\SslBindings\192.168.3.201!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certUpdate" | new-item -path IIS:\SslBindings\192.168.3.202!443} PS> Invoke-Command -Session $session { get-item -Path "cert:\localmachine\my\$certRegister" | new-item -path IIS:\SslBindings\192.168.3.203!443}

No IIS informações vinculativas normalmente é exibida como IPAddress (*: 80: *). No entanto, Windows PowerShell interpreta os dois pontos (:) como um indicador do caminho. Quando você estiver usando o Windows PowerShell para definir as informações de ligação, você usar o ponto de exclamação (!).

As ligações estão completas e pode chegar as sites usando HTTPS, como demonstrado aqui:

PS> start iexplore https://shop.company.com PS> start iexplore https://update.company.com PS> start iexplore https://register.company.com

Verificação de validade

Não há outra solução útil que emprega todas as informações que você aprendeu. É um desafio de negócio comum para muitos de vocês: São seus certificados prestes a expirar?

Parte do gerenciamento de certificados é determinar se alguns estão prestes a expirar, assim você pode substituí-los. Você pode aplicar os conceitos e táticas usadas aqui para este problema. Você só precisa de uma linha de comando mais. Novamente, você ainda precisará um aberto de sessão do Windows PowerShell remoting para os servidores de Web que você deseja verificar certificados expirados.

O exemplo a seguir examina todos os certificados no armazenamento de certificados localmachine. Ele compara o notafter de propriedade de expiração do certificado para a data atual em uma coluna personalizada chamei ExpireInDays. O filtro (Where-Object) verifica se qualquer certificados têm menos de 90 dias antes que expirem. O comando lista os nomes de servidor e os certificados prestes a expirar:

PS> Invoke-Command -Session $session { Get-ChildItem -Path Cert:\LocalMachine\My | Select-Object -Property PSComputerName, Subject, @{ n='ExpireInDays';e={($_. notafter - (Get-Date)).Days}} | Where-Object {$_.ExpireInDays -lt 90}}

Usando tudo o que você aprendeu aqui, você pode rapidamente e com sucesso substituir todos esses certificados — mesmo em grande escala — usando o Windows PowerShell.

Jason Helmick

Jason Helmické o diretor de tecnologias do Windows PowerShell para Interface formação técnica, com sede em Phoenix, Arizona Ele é um palestrante, autor e administrador do IIS inadvertida.

Conteúdo relacionado