Beherrschung von IIS-Zertifikatsanforderungen mit PowerShell

Wenn Sie lernen möchten, wie Sie eine IIS-Zertifikatsanforderung generieren, sind Sie hier genau richtig. In diesem Artikel werde ich erläutern, wie ich dies mit PowerShell gemacht habe und wie man ein Zertifikat an eine IIS-Website bindet.

Lasst uns eine Sache klarstellen. Ich hasse Kryptografie und Zertifikate. Im Laufe meiner Karriere war ich schon ein paar Mal der „Zertifikats-Typ“. Aber es war nur eine weitere Aufgabe für einen Systemadministrator.

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.

Lassen Sie mich Ihnen eine Geschichte darüber erzählen, wie man mit PowerShell eine Zertifikatinstallation auf einem IIS-Server automatisiert.

Die Mission

Von einem Client aus soll ein neues öffentliches Digicert-Zertifikat angefordert werden. Es soll auf einem entfernten Windows Server 2012 R2 Core Server mit IIS 8.5 in einer Arbeitsgruppe installiert werden. Außerdem soll eine SSL-Bindung zu einer Website hergestellt und das installierte Zertifikat für die Bindung verwendet werden. Einfach, oder? LOLz!

So wird’s gemacht, Junge!

Kurz gesagt, es bedarf X Schritte, um dies zu erreichen.

  1. Generieren einer IIS-Zertifikatsanforderung auf dem Computer, auf dem das Zertifikat installiert werden soll. In meinem Fall hatte ich nur WinRM-Zugriff, daher musste ich certreq.exe auf dem Remote-Server mithilfe von Invoke-Command ausführen und den Inhalt der CSR in eine lokale Datei senden.
  2. Lassen Sie die CSR von einer öffentlichen CA signieren. (Keine Hilfe hier – ein hübsches Zertifikat ist gerade von der Sicherheit zurückgekommen, mit der ich zusammengearbeitet habe). In meinem Fall hat mir das Sicherheitsteam eine P7B-Sammlung von Zertifikaten zurückgegeben, die in einer .CER-Datei zusammengefasst waren und sowohl das gesuchte Zertifikat als auch die Zwischenzertifikate enthielten. Das erforderte etwas Herumprobieren, um es zum Laufen zu bringen.
  3. Schließen Sie den Zertifikatsignierantrag auf dem Computer ab, auf dem das Zertifikat installiert werden soll. Dadurch gelangt das Zertifikat in den Zertifikatsspeicher.
  4. Erstellen Sie eine SSL IIS-Webbindung auf dem Server.
  5. Hängen Sie das Zertifikat an die Webbindung an.

Generieren des IIS-Zertifikatanforderung

Ihre erste Aufgabe besteht darin, certreq.exe mit diesem PowerShell-IIS-Skript auf dem Remote-Server auszuführen, um eine Anforderungsdatei zu erstellen. Dazu benötigt certreq.exe eine INF-Datei als Eingabe. Diese Datei wird für alle verschiedenen Optionen verwendet, die Ihr Zertifikat haben wird. Ohne ins Detail zu gehen, handelt es sich hierbei um eine Kopie der INF-Datei, die ich verwendet habe.

[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

Sie werden in der Funktion New-CertificateSigningRequest feststellen, dass es super einfach ist, dies anzupassen. Tatsächlich sehen Sie diese Datei nie, wenn Sie meine Funktionen verwenden, da sie nur vorübergehend benötigt wird, um den CSR (Anforderungsdatei) zu erstellen.

Als Nächstes müssen Sie diese INF-Datei auf den Remote-Server übertragen und certreq.exe mit den folgenden Parametern ausführen, wie z.B. certreq.exe -new "$InfFilePath" "$reqFilePath".

Dies generiert eine CSR (Anforderungsdatei) auf dem Remote-Computer. Anschließend müssen Sie diese Datei an Ihr Sicherheitsteam senden. Dadurch wird auch ein Zertifikat erstellt, das sowohl den privaten Schlüssel als auch den öffentlichen Schlüssel im Zertifikatsausstellungsanforderungen im Kontext der lokalen Maschine enthält.

Certificate service request in the Windows MMC snapin

Abschluss des IIS-Zertifikatsantrags

In meinem Fall habe ich eine einzelne CER-Datei erhalten. Ich habe eine Funktion in diesem PowerShell-IIS-Skript erstellt, um diese direkt in den Persönlichen Speicher im Kontext der lokalen Maschine zu importieren, um festzustellen, dass IIS sie nicht sehen konnte. Der Grund dafür war, dass das Zertifikat auch den privaten Schlüssel enthalten musste. Das einfache Importieren des Zertifikats in den Persönlichen Speicher würde nicht funktionieren. Ich musste den Zertifikatsantrag mithilfe von certreq.exe abschließen.

Dazu müssen Sie das Zertifikat, das Sie von Ihrem Sicherheitsteam erhalten, auf den Remote-Server kopieren und dann certreq.exe wie folgt ausführen: certreq.exe -accept -machine "C:\issuedcert.cer".

Sie müssen immer sicherstellen, dass das Antwortzertifikat immer in den Kontext der lokalen Maschine gelangt, indem Sie den Parameter -machine verwenden. Dies sollte erfolgreich abgeschlossen werden, wie ich überall gelesen habe, aber bei mir hat es definitiv nicht funktioniert. Aus irgendeinem Grund habe ich einen Fehler erhalten, der so aussah:

Error requesting certificate

Es stellte sich heraus, dass dies bedeutet, dass der öffentliche Schlüssel in der Anforderungsdatei nicht mit dem übereinstimmte, was vom Sicherheitsteam zurückgegeben wurde. Um dies zu testen, führen Sie einfach certutil.exe -dump requestfile.req und certutil -dumpissuedcert.cer aus. Scrollen Sie durch die Ausgabe, bis Sie den Bereich des öffentlichen Schlüssels sehen.

Encrypted public key

Kopieren Sie jeden dieser privaten Schlüssel und vergleichen Sie sie in einem Texteditor, um sicherzustellen, dass sie identisch sind. Wenn nicht, wenden Sie sich an Ihr Sicherheitsteam, weil Ihre Anforderung nicht richtig signiert wurde!

Wenn sie übereinstimmen, sind Sie in Ordnung und sollten diesen Fehler nicht erhalten.

Erstellen Sie die SSL-Bindung

Auf dem Remote-Server führen Sie Folgendes aus:

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

Fügen Sie das Zertifikat der SSL-Bindung hinzu

Auf dem Remote-Server führen Sie Folgendes aus:

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

Holen Sie sich das PowerShell IIS-Skript

Wenn alles gut läuft, sollten Sie fertig sein! Wenn Sie etwas Hilfe dabei benötigen, habe ich drei Funktionen erstellt, um es Ihnen einfacher zu machen. Gehen Sie zu meinem Github-Repository, um die Funktionen zu erhalten:

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

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

Beispielcode

## Senden Sie die von dieser Ausgabe generierte Datei an Ihre Zertifikatsverantwortlichen
New-CertificateSigningRequest -SubjectHost 'somesubject' -FilePath 'C:\somefile.req' -ComputerName REMOTESERVER

## Importieren Sie das empfangene Zertifikat
Import-CertificateSigningRequestResponse -FilePath C:\issuedcert.cer -ComputerName REMOTESERVER

## Erstellen Sie die Bindung und fügen Sie das Zertifikat hinzu.
New-IISWebBinding -ComputerName 'zapp09rpr01' -WebsiteName GHI -Protocol https -Port 443 -Certificate $cert

Verwandte Artikel

Schauen Sie sich unbedingt diese anderen ATA-Blog-Beiträge zur Verwaltung von IIS mit PowerShell an

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