Zum Inhalt springen

Let`s Encrypt Zertifikate für RRAS & RDSGW

    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.