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

In diesem Artikel hatte ich ja bereits beschrieben, wie das Zertifikat der Sophos UTM per REST API exportiert werden kann. Ein paar Leute haben sich nun gemeldet, dass eine automatischer Export und Import für Exchange Server interessant ist. Ich habe daher das Script erweitert und den Export und Import mit Exchange Server 2016 erfolgreich getestet.

Hier einmal die angepasste Version für den automatischen Import für Exchange Server 2016:

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
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
#Requires -RunAsAdministrator
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)
try
    {
        write-warning "Changing PowerShell TLS settings"
        [System.Net.ServicePointManager]::SecurityProtocol = @("Tls12","Tls11","Tls")
    }
catch
    {
        write-error "Can't change PowerShell TLS settings: $Error[0]"
    }
 
#Build Credentials
try
    {
        Write-Warning "Building UTM Rest API Creds"
        $securePassword = ConvertTo-SecureString $UTMApiToken -AsPlainText -Force
        $credential = New-Object System.Management.Automation.PSCredential("token", $securePassword)
    }
catch
    {
        write-error "Error building UTM creds: $Error[0]"
        exit
    }
 
#UTM API Call to get certificate and private key
try
    {
        Write-Warning "Getting Cert from UTM REST API"
        $UTMAPICall = "https://$UTMAddress" + ":4444/api/objects/ca/host_key_cert/$CertREF"
        $UTMCertResponse = Invoke-RestMethod -Method GET -Uri $UTMAPICall -Credential $credential
    }
catch
    {
        write-error "Error getting certificate from UTM: $Error[0]"
        exit
    }
 
#Write private key and certificate to temp files
try
    {
        Write-Warning "Writing cert TMP files"
        $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: $Error[0]"
        exit
    }
    
#Build PFX File from certificate and key
try
    {
        Write-Warning "Convert UTM Cert and Key to PKCS12"
        $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: $Error[0]"
    }
 
#Get UTM certs serial number
try
    {
        $UTMCertSerial = $UTMCertResponse.certificate.split(" ")[35].ToUpper().Replace(":","").Trim()
        Write-Warning "UTM Cert Serial: $UTMCertSerial"
    }
catch
    {
        write-error "Can't find serial number of UTMs certificate: $Error[0]"
        exit
    }
    
#Get current Exchange Server certificate
try
    {
        write-warning "Get current Exchange Server Certificate"
        Import-Module -Name WebAdministration
        Add-PSSnapin Microsoft.Exchange*
        $AllIISCerts = Get-ChildItem IIS:SSLBindings
        foreach ($IISCert in $AllIISCerts)
         {
          if ($IISCert.sites.value -match "Default Web Site") {$IISThumbprint = $IISCert.Thumbprint}
         }
        $CurrentExchangeCert = Get-ExchangeCertificate -Thumbprint $IISThumbprint
        $CurrentExchangeCertSerial = $CurrentExchangeCert.SerialNumber
        write-warning "Exchange Cert Serial: $CurrentExchangeCertSerial"
    }
catch
    {
        write-error "Can't find current Exchange certificate: $Error[0]"
        exit
    }
    
#Test if current Exchange Cert matches UTM Cert
try
    {
        if ($CurrentExchangeCertSerial -eq $UTMCertSerial)
         {
            Write-Warning "Exchange certificate matches UTM certificate: Nothing to do!"
            $ExchangeCertChangeRequierd = $false
         }
        else
         {
            write-warning "UTM Cert dosen't match Exchange certificate!"
            $ExchangeCertChangeRequierd = $true
         }
    }
catch
    {
        write-error "Don't know if cert change is requierd: $Error[0]"
        exit
    }
 
#If needed: lets try to change the Exchange Server certificate
if ($ExchangeCertChangeRequierd -eq $true)
    {
     try
        {
            Write-Warning "Let's try to change the certificate"
            $CertFilePath = "\\" + $env:computername + "\" + $PFXFileNameAndPath.Replace(":","$")
            $ImportCert = Import-ExchangeCertificate -FileName $CertFilePath -Password $securePassword -PrivateKeyExportable:$true -FriendlyName "$CertREF"
            $EnableCert = Get-ExchangeCertificate | where {$_.SerialNumber -eq $UTMCertSerial} | Enable-ExchangeCertificate -Services POP,IMAP,SMTP,IIS -force
            $ChangeSuccessfull = $true
            write-warning "Change Sucessfull: $ChangeSuccessfull"
        }
     catch
        {
            write-error "Can't change certificate: $Error[0]"
            exit
        }
    }
if ($ExchangeCertChangeRequierd -eq $false)
    {
     Write-Information "No certificate change needed"
     exit
    }
    
#Remove the old Exchange server certificate if change was successfull
if ($ChangeSuccessfull -eq $true)
    {
     try
        {
            Write-Warning "Removing old certificate"
            $RemoveCert = Remove-ExchangeCertificate -Thumbprint $IISThumbprint -Confirm:$false
        }
    catch
        {
            write-error "Can't remove old certificate: $Error[0]"
            exit
        }
    }
 
   

Das Script kann auch hier direkt als PS1 Datei runtergeladen werden:

Dieses Script kann direkt auf dem Exchange Server ausgeführt werden. Wichtig ist, dass das Script mit Administrator Rechten gestartet wird. Natürlich muss der Benutzer auch entsprechende Exchange Berechtigungen haben um das Zertifikat zuzuweisen.

Das Script kann wie folgt aufgerufen werden:

1
.\Get-SophosUTMCertificate.ps1 -UTMAddress utm.domain.local -UTMApiToken "UTMRESTAPIKEY" -CertREF "REF_XXXXXXXX" -OpenSSLPath "C:\Program Files (x86)\OpenSSL\bin\openssl.exe"

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

Hier einmal zwei Durchläufe des Scripts. Beim ersten Durchlauf wurde festgestellt, dass sich das Zertifikat der UTM und des Exchange Servers unterscheiden, daher wurde das Zertifikat der UTM auf dem Exchange Server eingespielt. Beim zweiten Aufruf entspricht das UTM Zertifikat dem Exchange Zertifikat, es muss also nicht wieder ausgetauscht werden:

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

Das Script lässt sich als Task in der Aufgabenplanung anlegen und beispielsweise einmal täglich ausführen. Wenn die UTM nun das Let’s Encrypt Zertifikat erneuert, wird mit maximal einen Tag Verzögerung auch das Exchange Zertifikat ausgetauscht.

6 Kommentare zu “Sophos UTM: Zertifikat der WAF mittels PowerShell exportieren (Exchange Version)”

  1. Hallo! Erst einmal: Vielen Dank Frank! Immer wieder tolle Lösungen und Artikel!

    Ich habe mal zwei Fragen:

    1. Funktioniert das auch auf EX2013 ? (Ich würde es testen, habe aber erst in einigen Tagen wieder Zugriff auf mein Labor).
    2. Ich habe auf einem EX2013 CU22 auf WS2012R2 mir das Zertifikat für mail.dom1.de und autodiscover.dom1.de ausstellen lassen. Jetzt habe ich noch weitere autorisierte Domänen auf dem EX, zB. dom2.de. Ein Postfach hat als Antwort-Adresse mail@dom2.de. Wenn ich jetzt Outlook mit diesem Konto einrichte, erhalte ich eine Zertifikatswarnung, dass autodiscover.dom2.de nicht dem Namen des Zertifikats entrspicht, ist ja auch richtig.
    Kann ich das Zertifikat beim erneuern einfach um autodiscover.dom2.de erweitern? oder muss ich ein neues Zertifikat anfordern?

    1. Hallo Stefan,
      ja grundsätzlich funktioniert es auch mit Exchange 2013. Zu Punkt 2: Du musst ein neues Zertifikat anfordern. Es ist aber nicht nötig nur für Autodiscover ständig neue Zertifikate anzufordern, für zusätzliche Mail Domains lässt sich dies auch mit DNS-SRV Records lösen. Schau mal in das Autodiscover Whitepaper, darin ist beschrieben wie es funktioniert.
      Gruß,
      Frank

      1. Hallo Frank,
        genau das hat mir gefehlt, klappt super mit den DNS-Einträgen! Vielen Dank für den Hinweis und Deine Arbeit hier!!

  2. Hallo Frank,

    ich sehe mich mit der Zertifikat-Thematik und unserem Exchange gerade konfrontiert. Hier gibt es viel lesenswertes, vielen Dank! Das Whitepaper habe ich mir schon mal zur Seite gelegt und diverse Bookmarks gesetzt. Da wir auch eine Sophos UTM einsetzen, passt das sehr gut.

    Eine Frage stellt sich mir aber gerade: die UTM kann ja keine SAN Zertifikate erstellen, sprich ich habe dort ein mail.domain.tld Zertifikat und eines für autodiscover.domain.tld – so jedenfalls meine Denke. Zwei Scripte anlegen für zwei Zertifikate wäre jetzt das kleinere Problem – aber wie weise ich die Zertifikate jeweils zu? Es müsste ja autodiscover-Zertifikat bei autodiscover.domain.tld ausgewiesen werden sowie das mail.domain.tld bei allen anderen virtuellen Exchange Seiten.

    Oder stehe ich da gerade auf dem Schlauch? Das Whitepaper spricht ja von einem SAN Zert für outlook oder eben mail sowie autodiscover. Wenn du dafür auch eine Lösung hast, wäre das grandios.

  3. Ich korrigiere mich selbst: natürlich kann die UTM in der aktuellen Version SAN-Certificates erstellen – so hat Frank es auch in seinem Blog beschrieben. Was nicht funktioniert, sind wildcards mit Let’s Encrypt. Da hatte ich irgendwie was im Hinterkopf und das lag nun quer.

Schreibe einen Kommentar

Deine E-Mail-Adresse wird nicht veröffentlicht. Erforderliche Felder sind mit * markiert.