Sophos UTM: Zertifikat der WAF mittels PowerShell exportieren

Die Sophos UTM kann mittlerweile automatisch Zertifikate von Let’s Encrypt anfordern und auch erneuern. Diese Funktion ist gerade für die Webserver Protection (WAF) sehr nützlich. Das Zertifikat für die verschiedenen Services der WAF wird somit durch die UTM verwaltet und vor Ablauf entsprechend erneuert.

Ich habe bereits mehrere Anfragen von Leuten bekommen die gerne das Zertifikat der WAF auch für weitere interne Dienste nutzen möchten. Die meisten Anfragen beziehen sich dabei natürlich auf Exchange Server. Die Exchange URLs wurden mit dem gleichen Hostnamen konfiguriert, somit wäre auch das Zertifikat der WAF auch  auf dem internen Exchange Server gültig. Hier ein Beispiel der Exchange Konfiguration:

Exchange Konfiguration

Die UTM Webserver Protection ist in diesem Fall ebenfalls auf den Hostnamen “mail.frankysweb.de” konfiguriert:

image

Verbindungen aus dem Internet werden mittels Sophos UTM WAF zum Exchange Server geleitet. Intern wird mittels DNS Split Brain direkt die IP des Exchange Servers aufgelöst. In diesem Fall ist es möglich das Zertifikat der Sophos WAF auch für Exchange (oder andere Dienste) zu nutzen.

Damit das Let’s Encrypt Zertifikat der UTM für andere Dienste verwendet werden kann, muss es zunächst von der UTM exportiert werden. Manuell ist dies per GUI möglich:

Manueller Export des WAF Zertifikats

Let’s Encrypt Zertifikate haben allerdings nur eine Gültigkeit von 90 Tagen, daher ist der manuelle Export von der UTM und der Import auf den jeweiligen internen Zielsystemen meist kein praktikabler Weg. Mittels der Sophos REST API und einem kleinen Script lässt sich dieser Vorgang jedoch automatisieren.

Hier mal ein kleines Beispiel für ein PowerShell Script, welches via Sophos REST API ein Zertifikat abholt und in eine PFX Datei umwandelt (siehe Erklärung des Scripts weiter unten):

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
param(
    [Parameter(Position=0, Mandatory=$true)]
        $UTMAddress = "utm.domain.local",
    [Parameter(Position=1, Mandatory=$true)]
        [string]$UTMApiToken = "xxXXxxXXxxXXxxXX",
    [Parameter(Position=2, Mandatory=$true)]
        [string]$CertREF = "REF_0815abcd",
    [Parameter(Position=3, Mandatory=$false)]
        [string]$OpenSSLPath = "C:\Program Files (x86)\OpenSSL\bin\openssl.exe",
    [Parameter(Position=4, Mandatory=$false)]
        [string]$PFXFilePath = $PSScriptRoot
    )
#Set TLS Settings (Only TSLv1.1 and TLSv1.2)
[System.Net.ServicePointManager]::SecurityProtocol = @("Tls12","Tls11","Tls")
#Build Credentials
$securePassword = ConvertTo-SecureString $UTMApiToken -AsPlainText -Force
$credential = New-Object System.Management.Automation.PSCredential("token", $securePassword)
#UTM API Call to get certificate and private key
$UTMAPICall = "https://$UTMAddress" + ":4444/api/objects/ca/host_key_cert/$CertREF"
try
    {
        $UTMCertResponse = Invoke-RestMethod -Method GET -Uri $UTMAPICall -Credential $credential
    }
catch
    {
        write-error "Error getting certificate from UTM"
        exit
    }
#Write private key and certificate to temp files
try
    {
        $TempCertFile = "$env:temp\" + $CertREF + ".cer"
        $TempKeyFile = "$env:temp\" $CertREF + ".key"
        $UTMCertResponse.certificate | set-content $TempCertFile
        $UTMCertResponse.key | set-content $TempKeyFile
    }
catch
    {
        write-error "Error writing temp files"
        exit
    }
    
#Build PFX File from certificate and key
try
    {
        $PFXFileNameAndPath = "$PFXFilePath" + "\" + "$CertREF" + ".pfx"
        . $OpenSSLPath pkcs12 -export -in $TempCertFile -inkey $TempKeyFile -out $PFXFileNameAndPath -password pass:$UTMApiToken
        remove-item $TempCertFile -force
        remove-item $TempKeyFile -force
    }
catch
    {
        write-error "Error building PFX File"
    }

Das Script erfordert ein paar Parameter damit es funktioniert. Der Parameter “UTMAddress” dürfte klar sein. Die Verbindung zur REST Api funktioniert via API Token (UTMApiToken), das Token kann im WebAdmin der UTM erstellt werden:

Sophos API Token

Damit das entsprechende Zertifikat von der UTM abgeholt werden kann, ist die REF ID des Zertifikats nötig. Die REF ID lässt sich beispielsweise dem Live Log “Let’s Encrypt” entnehmen:

Sophos Let's Encrypt Live Log

Der folgende Eintrag aus dem Live Log zeigt einen Erneuerung Vorgang und die entsprechende REF ID der Zertifikats (blauer Kasten):

Sophos REF ID

Die Sophos REST API liefert den privaten Schlüssel und das Zertifikat. Damit Windows Systeme etwas damit anfangen können, erzeugt dieses Beispiel Script eine PFX-Datei. Die Konvertierung in das PKCS12 Format (PFX-Datei) wird mittels OpenSSL durchgeführt. OpenSSL muss daher auf dem Rechner vorhanden sein und der entsprechende Pfad zur EXE übergeben werden (OpenSSLPath). OpenSSL für Windows kann hier runtergeladen werden:

Die PFX Datei kann wiederum auf Windows Zielsystemen importiert werden und beispielsweise für Exchange und IIS Server genutzt werden.

Mit dem Parameter PFXFilePath kann der Pfad für das exportierte Zertifikat im PKCS12 Format angegeben werden. Das Passwort für die PFX Datei entspricht dem UTMApiToken.

Hier mal ein Beispiel für den Aufruf des Scripts:

image

Der Import oder das Zuweisen des Zertifikats an das Zielsystem ist nicht Bestandteil dieses Scripts. Mit ein wenig PowerShell KnowHow ist das Script aber einfach zu erweitern.

Wenn Interesse an einem automatisierten Export und Import für Exchange Server besteht, dann bitte einen kurzen Kommentar hinterlassen.

Hinweis 15.07.19: Eine Version für Export und Import für WAF und Exchange Server findet sich hier:

Sophos UTM: Zertifikat der WAF mittels PowerShell exportieren (Exchange Version)

24 thoughts on “Sophos UTM: Zertifikat der WAF mittels PowerShell exportieren”

  1. Hallo Frank,
    kann man hier statt der UTM auch die XG für dieses vorhaben verwenden?? Das Prinzip müsste das gleiche sein, oder?

    Viele Grüße
    Markus

    Reply
  2. Danke für das Skript, für jeden der sich die Frage stellt wie man per Domain Namen statt REF ID sucht, sollte man einfach so vorgehen dass man sich die passende ID über Domainname sucht bzw. über die Objeket die als Json reinkommen, und dann in den unter-namespace mit diesem passenden REF_ID geht um sich .cer + .key zu erstellen

    $CertREF= ($UTMCertResponse | Select-Object -Property _ref,certificate |
    Where-Object { $_.certificate -like „*$domainname*“ } |
    Select-Object „_ref“ -ExpandProperty „_ref“ -Unique )

    ##UND DANACH bin ich ähnlich wie oben vorgegangen
    $UTMAPICall = „https://$UTMAddress“ + „: $port/api/objects/ca/host_key_cert/$CertREF“
    $UTMCertResponse = Invoke-RestMethod -Method GET -Uri $UTMAPICall -Verbose -Credential $credential

    Reply
  3. Hallo zusammen,
    leider bekomme ich bei dem Script immer folgende Fehlermeldung:

    C:\Users\administrator\Desktop\Cert\Cert_Rest_Api.ps1 : Error getting certificate from UTM
    + CategoryInfo : NotSpecified: (:) [Write-Error], WriteErrorException
    + FullyQualifiedErrorId : Microsoft.PowerShell.Commands.WriteErrorException,Cert_Rest_Api.ps1

    Das Script versuche ich auf einem Server 2019 auszuführen.

    Weiß jemand was ich dagegen tun kann?

    Reply
    • Also da die Exception von der Powershell kommt, würde ich sagen dass der Zielpfad nicht ordnung ist, oder vielleicht der Zugriff auf die openssl.exe? Shell als Admin gestartet? Skript freigeschaltet in den Dateieigenschaften?

      Reply
  4. Tach zusammen :) nun bin ich doch schon mal einen Schritt weitergekommen. Sobald man den richtigen „token“ nimmt klappt das allerdings nur begrenzt. Ein neuer Rechtefehler tritt nun auf:

    WARNUNG: Changing PowerShell TLS settings
    WARNUNG: Building UTM Rest API Creds
    WARNUNG: Getting Cert from UTM REST API
    WARNUNG: Writing cert TMP files
    WARNUNG: Convert UTM Cert and Key to PKCS12
    WARNUNG: UTM Cert Serial: 038003E9D7BC85A6F2A0C806CCD1485E7163
    WARNUNG: Get current Exchange Server Certificate
    C:\UTMCertificate\Get-SophosUTMCertificate.ps1 : Can’t find current Exchange certificate: Fehler bei Active Directory-Vorgang auf . Die angegebenen Anmeldeinformationen für ‚AD\xxx‘ sind ungültig. Error getting
    certificate from UTM: [
    {

    Kann mir jemand hierbei helfen oder zumindest mir einen neuen Ansatz geben wo nun die Fehlerquelle liegen kann.

    ==> Can’t find current Exchange certificate > Würde mich über echt jede Hilfestellung sehr freuen!!

    Gruß
    Philipp

    Reply
  5. Servus zusammen,

    ich scheine wohl einfach die einfachsten Dinge nicht hinbekommen.
    Mein Fehlerbild sieht wie folgt aus:

    „C:\UTMCertificate\Get-SophosUTMCertificate.ps1 : Error getting certificate from UTM: [
    {
    „name“: „X.509-Zertifikat-Objekt kann nicht gelesen werden: Zugriff verweigert.“,
    „rights“: „ANONYMOUS“,
    „attrs“: [],
    „Oattrs“: [
    „class“,
    „type“
    ],
    „objname“: „“,
    „del_object“: „“,
    „ref“: „REF_QVEFoUuMkNjE“,
    „msgtype“: „OBJECT_LOOKUP_DENY“,
    „format“: „%_O-Objekt kann nicht gelesen werden: Zugriff verweigert.“,
    „class“: „ca“,
    „type“: „host_key_cert“,
    „perms“: „MAILSEC,RASMAN,WEBSEC,WEBAUDITOR,MAILAUDITOR,READONLY,WEBAPPAUDITOR,WEBAPPSEC,NTTCUSTOMER,NTTOPERATOR,SUPERADMIN,RASAUDITOR,NTTCUSTOMER2“,
    „never_hide“: 0,
    „fatal“: 1
    }

    Es wäre wirklich super wenn mir jemand eine Hilfestellung geben könnte.

    Ein Ansatz wäre auch schon super… Denn wieso ich keine Rechte habe kann ich mir einfach nicht erklären.

    Danke und Gruß
    Philipp

    Reply
  6. Manchmal sind die Lösungen einfach, zu geringes Recht des auslesenden Benutzers. Somit läuft das Skript perfekt.
    Sorry, aber manchmal dauert’s halt etwas. Ist auch recht warm heut :-)

    Reply
  7. Der Vollständigkeit wegen, im temporären Pfad (Skript Zeile 32+33) wird eine cer Datei und eine key Datei erstellt. Die Key Datei ist bei mir jeweils 0 Byte groß, auch bei verschiedenen LE-Zertifikaten. Die cer-Datei rund 8KB und enthält auch das korrekte Zertifikat.

    Reply
  8. Hat jemand eine Idee warum ich folgenden Fehler erhalte?
    15876:error:0909006C:PEM routines:get_name:no start line:crypto\pem\pem_lib.c:745:Expecting: ANY PRIVATE KEY
    Beste Grüße
    Alex

    Reply
  9. ok, kann man vielleciht mit der Rest API der XG ein Zertifikat austauschen?
    Let’s Encrpyt läuft bei mir bereits auf IIS, es muss nur immer das Zertifikat in der XG geändert werden.

    Reply
  10. Vielen Dank Frank, wie immer tolle Arbeit.
    Der Import auf Exchange Seite wäre wohl das Sahnehäubchen.

    Reply
  11. Das sieht sehr spannend aus und würde die Kombination UTM und Exchange perfekt ergänzen.
    Mit automatischem Import in Exchange wäre es ziemlich klasse.

    Reply
  12. Super, darauf habe ich gewartet! :-)

    Da ich auch eine Sophos UTM habe, könnte ich mir mit automatisierten Let’s Encrypt Zertifikats-Export und Import mein Exchange-Kauf-Zertifikat sparen…

    Reply
  13. Großes Interesse!

    Vielen Dank schon mal für diesen Teil der Lösung, das ist grandios!

    Viele Grüße, Christoph.

    Reply

Leave a Comment