Beheer van IIS-certificaataanvragen met PowerShell

Als je wilt leren hoe je een IIS-certificaataanvraag genereert, ben je hier aan het juiste adres. In dit artikel ga ik uitleggen hoe ik dit heb gedaan met PowerShell en ook hoe je een certificaat aan een IIS-website koppelt.

Laten we één ding duidelijk maken. Ik haat cryptografie en certificaten. Gedurende mijn carrière ben ik op enkele momenten de “certificaatpersoon” geweest. Het was echter gewoon een andere hoed voor een systeembeheerder.

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.

Laat me je een verhaal vertellen over het automatiseren van het installeren van een certificaat op een IIS-server met PowerShell.

De Opdracht

Van een client een nieuw openbaar Digicert-certificaat aanvragen, het installeren op een externe Windows Server 2012 R2 Core Server met IIS 8.5 in een werkgroep, een SSL-binding instellen naar een website en het geïnstalleerde certificaat gebruiken voor de binding. Simpel, toch? LOLz!

Hoe het Gedaan wordt, Jongen!

In een notendop zijn er X stappen nodig om dit te laten gebeuren.

  1. Genereer een IIS-certificaataanvraag op de computer waar het certificaat zal worden geïnstalleerd. In mijn geval had ik alleen WinRM-toegang, dus moest ik certreq.exe op de externe server uitvoeren met Invoke-Command en de inhoud van de CSR naar een lokaal bestand sturen.
  2. Haal de CSR op die door een openbare CA is ondertekend. (Geen hulp hier – er kwam zojuist een mooi certificaat terug van beveiliging waarmee ik heb samengewerkt). In mijn geval gaf het beveiligingsteam me een P7B-verzameling van certificaten samengevoegd in een .CER-bestand, waarin het certificaat stond waar ik naar op zoek was, evenals de tussenliggende certificaten. Hier moest ik wat mee rommelen om het te laten werken.
  3. Voltooi het ondertekenen van het certificaataanvraag op de computer waar het certificaat zal worden geïnstalleerd. Hiermee wordt het certificaat in de certificaatopslag geplaatst.
  4. Maak een SSL IIS-webbinding op de server.
  5. Koppel het certificaat aan de webbinding.

Het genereren van het IIS-certificaatverzoek

Uw eerste taak zal zijn om certreq.exe uit te voeren met behulp van dit PowerShell IIS-script op de externe server om een aanvraagbestand te genereren. Hiervoor vereist certreq.exe een INF-bestand als invoer. Dit bestand wordt gebruikt voor alle verschillende opties die uw certificaat uiteindelijk zal hebben. Zonder al te veel in detail te treden, dit is een kopie van het INF-bestand dat ik gebruikte.

[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

U zult zien in de New-CertificateSigningRequest functie dat ik het heel eenvoudig voor u maak om dit aan te passen. Eigenlijk zult u dit bestand nooit zien als u mijn functies gebruikt, omdat het slechts tijdelijk nodig is om de CSR (aanvraagbestand) te maken.

Vervolgens moet u dit INF-bestand op de externe server krijgen en certreq.exe uitvoeren met de volgende parameters zoals certreq.exe -new "$InfFilePath" "$reqFilePath".

Dit zal een CSR (aanvraagbestand) genereren op de externe computer. Vervolgens moet je dit bestand naar je beveiligingsteam sturen. Dit zal ook een certificaat creëren dat zowel de privésleutel als de openbare sleutel bevat in de Certificaat Uitgegeven Aanvragen in de context van de lokale machine.

Certificate service request in the Windows MMC snapin

Het voltooien van het IIS-certificaatverzoek

In mijn geval kreeg ik slechts één CER-bestand terug. Ik heb een functie gemaakt in dit PowerShell IIS-script om dit rechtstreeks te importeren in de Persoonlijke opslag in de context van de lokale machine om te ontdekken dat IIS het niet kon zien. De reden hiervoor was dat het certificaat ook de privésleutel moest bevatten. Het eenvoudig importeren van het certificaat in de Persoonlijke opslag zou niet werken. Ik moest het certificaatverzoek voltooien met behulp van certreq.exe.

Om dit te doen, moet je het certificaat dat je van je beveiligingsteam ontvangt naar de externe server kopiëren en vervolgens certreq.exe uitvoeren zoals dit certreq.exe -accept -machine "C:\issuedcert.cer".

Je moet er altijd voor zorgen dat het responscertificaat altijd in de context van de lokale machine terechtkomt door de parameter -machine te gebruiken. Dit zou volgens alles wat ik heb gelezen succesvol moeten worden voltooid, maar dat was absoluut niet het geval voor mij. Om een of andere reden kreeg ik een foutmelding die er ongeveer zo uitzag:

Error requesting certificate

Het blijkt dat dit betekent dat de openbare sleutel in het aanvraagbestand niet overeenkwam met wat door het beveiligingsteam werd geretourneerd. Om dit te testen, voer eenvoudig certutil.exe -dump requestfile.req en certutil -dumpissuedcert.cer uit. Blader door de output totdat je het gedeelte met de openbare sleutel ziet.

Encrypted public key

Kopieer elk van deze privésleutels en vergelijk ze in een teksteditor om ervoor te zorgen dat ze hetzelfde zijn. Als dat niet het geval is, neem contact op met uw beveiligingsteam omdat uw verzoek niet correct is ondertekend!

Als die overeenkomen, zit u goed en zou u die foutmelding niet moeten ontvangen.

Maak de SSL-binding

Voer op de externe server het volgende uit:

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

Voeg het certificaat toe aan de SSL-binding

Voer op de externe server het volgende uit:

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

Krijg het PowerShell IIS-script

Als alles goed gaat, ben je klaar! Als je wat hulp nodig hebt, heb ik drie functies gemaakt om het gemakkelijker te maken. Ga naar mijn Github-repo om de functies te krijgen:

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

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

Voorbeeldcode

## Stuur het bestand dat dit oplevert naar je certificaatmensen
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## Importeer het ontvangen certificaat
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## Maak de binding en voeg het certificaat toe.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

Gerelateerde lectuur

Zorg ervoor dat je ook deze andere ATA-blogposts bekijkt over het beheren van IIS met PowerShell

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