Ich stand mal wieder vor der Herausforderung, einen RDSGW- und einen VPN-Server bereit zu stellen. Damit einher geht natürlich immer das Problem mit den Zertifikaten. Entweder es kostet Geld oder es wird umständlich, da von eigener CA oder mit kurzen Laufzeiten bei Let´s Encrypt. Letzteres lässt sich aber gut automatisieren.
Als einfachste Variante kommt da nun Certify The Web ins Spiel, welches aber mittlerweile auch nicht mehr kostenlos nutzbar ist. Also habe ich mich dann mal mit dem Powershell Modul Posh ACME beschäftigt…
# Falls Modul noch nicht installiert....
Install-Module -Name Posh-ACME
Import-Module Posh-ACME
Wir gehen mal davon aus, RDSGW oder RRAS bereits installiert ist. Damit ist auch der IIS mit an Bord. Auch die DNS Einträge für die Subdomains und die jeweiligen Portwieterleitungen bzw. -freigaben sind gesetzt und funktionieren. Der IIS auf dem Server muss per HTTP & HTTPS erreichbar sein.
Wichtig!!!: Auf dem IIS muss auf der jeweiligen Site ein MIME Typ ergänzt werden, damit die Überprüfung der Domain auf Port 80 funktioniert.
Dateinamenerweiterung: .* / MIME Typ: text/plain
Ohne diesen liefert der IIS die vom Posh ACME angelegte Textdatei nicht aus.
$certnew = New-PACertificate -Domain @("sub1.domain.de","sub2.domain.de")
-Contact "kontakt@domain.de" -Plugin WebRoot
-PluginArgs @{ WRPath = "C:\inetpub\wwwroot" } -AcceptTOS
-Install
Damit wird nun das Zertifikat beantragt, geprüft und dann im Zertifikatspeicher des Computers abgelegt. Die Variable $certnew enthält dann auch gleich den nötige Thumbprint des Zertifikats für die Weiterverarbeitung.
Routing und Remote Access (RRAS) SSTP VPN
Damit das Zertifikat hier auch mit Powershell gesetzt werden kann sind einige Schritte notwendig.
#RRAS beenden
Stop-Service RemoteAccess
#Bindung des alten Zertifikats aufheben
netsh http delete sslcert ipport=0.0.0.0:443
#Zertifikat aus dem Speicher abfragen
$cert = Get-ChildItem -Path Cert:\LocalMachine\My | Where-Object { $_.Thumbprint -eq $certnew.Thumbprint }
Set-RemoteAccess -SslCertificate $cert
#RRAS wieder starten
Start-Service RemoteAccess
Remote Desktop Gateway Server (RDSGW)
Auch hier sind es wieder mehrere Schritte
#Benötigtes Modul für RDSGW laden
Import-Module RemoteDesktopServices
#RDSGW beenden
Stop-Service -Name Tsgateway -Force
#Bindung des alten Zertifikats aufheben
netsh http delete sslcert ipport=0.0.0.0:443
#Variable für Thumbprint vereinfachen
$thumb = $certnew.Thumbprint
#Zertifikat an RDSGW binden
Set-Item RDS:\GatewayServer\SSLCertificate\Thumbprint -Value $thumb -EA Stop -Verbose:$false
#Zertifikat an Port 443 binden
netsh http add sslcert ipport=0.0.0.0:443 certhash=$thumb appid="{00112233-4455-6677-8899-AABBCCDDEEFF}" certstorename=MY
#RDSGW wieder starten
Start-Service -Name Tsgateway
NPS mit Microsoft Protected EAP (PEAP)
Für diejenigen, die diese Infrastruktur möglichst sicher betreiben wollen wird natürlich auch des Zertifikat für PEAP benötigt.
Die Besonderheit ist hier, dass ich diese Konfiguration im NPS nicht mit PS bearbeiten kann und hier einen Umweg nehmen muss. Der Vorteil hier ist aber, dass gleich bei allen Netzwerk Richtlinien im NPS das Zertifikat getauscht wird.
Achtung!!! Das Verwendete Suffix und Prefix können evtl. in anderen Konfigurationen abweichen und sollten vor Verwendung geprüft werden.
# === Pfad für die temporäre Datei festlegen ===
$xmlPath = "c:\Pfad zur Datei.xml"
# NPS Dienst beenden
Stop-Service -Name "IAS" -Force
# NPS konfiguration als XML exportieren
netsh nps export filename=$xmlPath exportPSK=YES
# === XML aus Datei laden ===
[xml]$xml = Get-Content -Path $xmlPath -ErrorAction Stop
# === msEAPConfiguration-Felder finden ===
$nodes = $xml.SelectNodes("//msEAPConfiguration")
# === Präfix/Suffix vorbereiten ===
$prefix = "190000000000000000000000000000003800000002000000380000000100000014000000"
$suffix = "0100000001000000100000001a00000000000000"
$newValue = $prefix + $certnew.Thumbprint.ToLower() + $suffix
# === Werte ersetzen ===
foreach ($node in $nodes) {
$oldValue = $node.'#text'
Write-Host "Ersetze alten Hash durch neuen Thumbprint $newThumbprint…"
$node.'#text' = $newValue
}
# === XML speichern ===
$xml.Save($xmlPath)
# === XML wieder in NPS importieren ===
netsh nps import filename=$xmlPath
# NPS wieder starten
Start-Service -Name "IAS"
Damit sollte man sich nun das passende Script bauen können, um den oder die Server dauerhaft mit kostenlosen Zertifikaten zu versorgen.