Padronanza delle richieste di certificati IIS con PowerShell

Se vuoi imparare come generare una richiesta di certificato IIS, sei nel posto giusto. In questo articolo, spiegherò come ho fatto questo con PowerShell e anche come associare un certificato a un sito IIS.

Facciamo una cosa chiara. Io odio la crittografia e i certificati. Nel corso della mia carriera, sono stato il “ragazzo dei certificati” in alcune occasioni. Tuttavia, era solo un altro ruolo per un amministratore di 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.

Lasciami raccontarti una storia sull’automatizzazione dell’installazione di un certificato su un server IIS con PowerShell.

La Missione

Dal cliente, richiedi un nuovo certificato pubblico Digicert, installalo su un server Windows Server 2012 R2 Core remoto con IIS 8.5 in un workgroup, imposta un binding SSL per un sito web e utilizza il certificato installato per il binding. Semplice, vero? LOLz!

Come si Fa, Figlio!

In poche parole, ci vogliono X passaggi per farlo accadere.

  1. Genera una richiesta di firma del certificato IIS nel computer dove il certificato sarà installato. Nel mio caso, avevo solo l’accesso WinRM, quindi ho dovuto eseguire certreq.exe sul server remoto usando Invoke-Command e inviare il contenuto della CSR a un file locale.
  2. Ottieni la CSR firmata da una CA pubblica. (Nessun aiuto qui – è appena tornato indietro dalla sicurezza un certificato bello con cui ho lavorato). Nel mio caso, il team di sicurezza mi ha restituito una raccolta di certificati P7B raggruppati in un file .CER che includeva il certificato che stavo cercando, oltre ai certificati intermedi. Ci è voluto un po’ di sperimentazione per farlo funzionare.
  3. Completa la richiesta di firma del certificato sul computer dove verrà installato il certificato. Questo inserirà il certificato nel deposito dei certificati.
  4. Crea un collegamento SSL IIS sul server.
  5. Collega il certificato al collegamento web.

Genera la richiesta di certificato IIS

Il tuo primo compito sarà eseguire certreq.exe con questo script PowerShell IIS sul server remoto per raccogliere un file di richiesta. Per fare questo, certreq.exe richiede un file INF in input. Questo file è utilizzato per tutte le varie opzioni che avrà il tuo certificato. Senza entrare nei dettagli, questo è una copia del file INF che stavo utilizzando.

[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

Vedrai nella funzione New-CertificateSigningRequest che rendo estremamente facile personalizzarlo. In realtà, se usi le mie funzioni, non vedrai mai nemmeno questo file, poiché è necessario solo temporaneamente per creare la CSR (file di richiesta).

Successivamente, dovrai ottenere questo file INF sul server remoto ed eseguire certreq.exe con i seguenti parametri come certreq.exe -new "$InfFilePath" "$reqFilePath".

Questo genererà un file CSR (file di richiesta) sul computer remoto. Dovrai quindi inviare questo file al tuo team di sicurezza. Ciò creerà anche un certificato contenente sia la chiave privata che la chiave pubblica nel contesto del computer locale in Richieste di Certificato Emissi.

Certificate service request in the Windows MMC snapin

Completamento della richiesta di certificato IIS

Nel mio caso, ho ricevuto un singolo file CER. Ho creato una funzione in questo script PowerShell IIS per importarlo direttamente nello store Personale nel contesto del computer locale, ma IIS non riusciva a vederlo. Il motivo era che il certificato doveva contenere anche la chiave privata. Semplicemente importare il certificato nello store Personale non avrebbe funzionato. Ho dovuto completare la richiesta di certificato usando certreq.exe.

Per fare ciò, dovrai copiare il certificato che ricevi dal tuo team di sicurezza sul server remoto e quindi eseguire certreq.exe in questo modo certreq.exe -accept -machine "C:\issuedcert.cer".

Dovrai sempre assicurarti che il certificato di risposta vada sempre nel contesto del computer locale utilizzando il parametro -machine. Questo dovrebbe essere completato con successo secondo tutto ciò che ho letto, ma sicuramente non è stato così per me. Per qualche motivo, ricevevo un errore che sembrava così:

Error requesting certificate

Si scopre che ciò significa che la chiave pubblica nel file di richiesta non corrispondeva a quella restituita dal team di sicurezza. Per testarlo, esegui semplicemente certutil.exe -dump requestfile.req e certutil -dumpissuedcert.cer. Scorri l’output fino a quando non vedi l’area della chiave pubblica.

Encrypted public key

Copia ciascuna di queste chiavi private e confrontale in un editor di testo per assicurarti che siano uguali. Se non lo sono, contatta il tuo team di sicurezza perché non ha firmato correttamente la tua richiesta!

Se corrispondono, sei a posto e non dovresti ricevere quell’errore.

Crea il collegamento SSL

Sul server remoto esegui:

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

Associa il certificato al collegamento SSL

Sul server remoto, esegui:

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

Otteni lo script PowerShell di IIS

Se tutto va bene, dovresti aver finito! Ora, se hai bisogno di un po’ di aiuto per farlo, ho creato tre funzioni per rendere tutto più facile. Vai sulla mia repo di Github per ottenere le funzioni:

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

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

Codice di esempio

## Invia il file che questo produce ai tuoi responsabili dei certificati 
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## Importa il certificato ricevuto
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## Crea il collegamento e associa il certificato.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

Lettura correlata

Assicurati di dare un’occhiata agli altri articoli del blog ATA su come gestire IIS con PowerShell

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