Nachdem ein Exchange 2019 Server konfiguriert wurde, steht die Installation eines SSL Zertifikats an. Für die korrekte Konfiguration des Zertifikats müssen die Hostnamen ermittelt werden, welche für das Zertifikat relevant sind. Das folgende Script liest die Hostnamen aus den konfigurierten URLs der virtuellen Verzeichnisse aus und zeigt die entsprechenden Hostnamen in der Exchange Management Shell an. Das Script führt keine Konfiguration durch und dient nur der Überprüfung der Konfiguration und als Hilfestellung für die Konfiguration des Zertifikats:
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
|
#Getting Exchange FQDNs from configured URLs #Local Server Name try { $ExchangeServer = ( Get-ExchangeServer $env:computername ).Name } catch { } #Autodiscover try { $AutodiscoverFQDN = (( Get-ClientAccessService -Identity $ExchangeServer ).AutoDiscoverServiceInternalUri.Host).ToLower() [array] $CertNames += $AutodiscoverFQDN } catch { } #Outlook Anywhere try { $OAExtFQDN = (( Get-OutlookAnywhere -Server $ExchangeServer ).ExternalHostname.Hostnamestring).ToLower() [array] $CertNames += $OAExtFQDN $OAIntFQDN = (( Get-OutlookAnywhere -Server $ExchangeServer ).Internalhostname.Hostnamestring).ToLower() [array] $CertNames += $OAIntFQDN } catch { } #OAB try { $OABExtFQDN = (( Get-OabVirtualDirectory -Server $ExchangeServer ).ExternalUrl.Host).ToLower() [array] $CertNames += $OABExtFQDN $OABIntFQDN = (( Get-OabVirtualDirectory -Server $ExchangeServer ).Internalurl.Host).ToLower() [array] $CertNames += $OABIntFQDN } catch { } #ActiveSync try { $EASIntFQDN = (( Get-ActiveSyncVirtualDirectory -Server $ExchangeServer ).Internalurl.Host).ToLower() [array] $CertNames += $EASIntFQDN $EASExtFQDN = (( Get-ActiveSyncVirtualDirectory -Server $ExchangeServer ).ExternalUrl.Host).ToLower() [array] $CertNames += $EASExtFQDN } catch { } #EWS try { $EWSIntFQDN = (( Get-WebServicesVirtualDirectory -Server $ExchangeServer ).Internalurl.Host).ToLower() [array] $CertNames += $EWSIntFQDN $EWSExtFQDN = (( Get-WebServicesVirtualDirectory -Server $ExchangeServer ).ExternalUrl.Host).ToLower() [array] $CertNames += $EWSExtFQDN } catch { } #ECP try { $ECPIntFQDN = (( Get-EcpVirtualDirectory -Server $ExchangeServer ).Internalurl.Host).ToLower() [array] $CertNames += $ECPIntFQDN $ECPExtFQDN = (( Get-EcpVirtualDirectory -Server $ExchangeServer ).ExternalUrl.Host).ToLower() [array] $CertNames += $ECPExtFQDN } catch { } #OWA try { $OWAIntFQDN = (( Get-OwaVirtualDirectory -Server $ExchangeServer ).Internalurl.Host).ToLower() [array] $CertNames += $OWAIntFQDN $OWAExtFQDN = (( Get-OwaVirtualDirectory -Server $ExchangeServer ).ExternalUrl.Host).ToLower() [array] $CertNames += $OWAExtFQDN } catch { } #MAPI try { $MAPIIntFQDN = (( Get-MapiVirtualDirectory -Server $ExchangeServer ).Internalurl.Host).ToLower() [array] $CertNames += $MAPIIntFQDN $MAPIExtFQDN = (( Get-MapiVirtualDirectory -Server $ExchangeServer ).ExternalUrl.Host).ToLower() [array] $CertNames += $MAPIExtFQDN } catch { } #Make FQDNs unique try { $CertNames = $CertNames | select –Unique } catch { } write-host " Autodiscover Hostname: $AutodiscoverFQDN Outlook Anywhere Hostname (Internal): $OAIntFQDN Outlook Anywhere Hostname (External): $OAExtFQDN ActiveSync Hostname (Internal): $EASIntFQDN ActiveSync Hostname (External): $EASExtFQDN OAB Hostname (Internal): $OABIntFQDN OAB Hostname (External): $OABExtFQDN EWS Hostname (Internal): $EWSIntFQDN EWS Hostname (External): $EWSExtFQDN ECP Hostname (Internal): $ECPIntFQDN ECP Hostname (External): $ECPExtFQDN OWA Hostname (Internal): $OWAIntFQDN OWA Hostname (External): $OWAExtFQDN MAPI Hostname (Internal): $MAPIIntFQDN MAPI Hostname (External): $MAPIExtFQDN " write-host " SANs needed for Certificate: " $CertNames write-host " Use this Hostname as Common Name (CN): $OWAExtFQDN " |
Die Ausgabe des Scripts auf der Exchange Management Shell sieht dann wie folgt aus:
Das Script liefert die Hostnamen welche als SAN (Subject Alternate Name) und CN (Common Name) auf der Zertifikat vorhanden sein müssen.
Das Script steht auch hier zum Download bereit:
ExchangeHostNames
Hier findet sich ein Artikel zur Basiskonfiguration für Exchange 2019:
Ein ausführliches Whitepaper zum Thema Exchange Server und Zertifikate ist derzeit in Arbeit. Dieses Script ist ein nur ein kleiner Auszug aus dem neuen Whitepaper.
Hallo Frank,
habe versucht das Skript zu starten und bekomme massig Fehler angezeigt, was mache ich falsch?
Nachfolgend die Fehlermeldung:
In der „Try“-Anweisung fehlt der zugehörige „Catch“- oder „Finally“-Block.
In E:\scripts\ExchangeHostNames.ps1:18 Zeichen:1
+ ).Name
+ ~
Unerwartetes Token „)“ in Ausdruck oder Anweisung.
In E:\scripts\ExchangeHostNames.ps1:20 Zeichen:1
+ }
+ ~
Unerwartetes Token „}“ in Ausdruck oder Anweisung.
In E:\scripts\ExchangeHostNames.ps1:36 Zeichen:24
+ Get-ClientAccessService
+ ~
Schließende „)“ fehlt in einem Ausdruck.
In E:\scripts\ExchangeHostNames.ps1:38 Zeichen:1
+ -Identity
+ ~~~~~~~~~
Unerwartetes Token „-Identity“ in Ausdruck oder Anweisung.
In E:\scripts\ExchangeHostNames.ps1:38 Zeichen:10
+ -Identity
+ ~
Schließende „)“ fehlt in einem Ausdruck.
In E:\scripts\ExchangeHostNames.ps1:28 Zeichen:5
+ try {
+ ~
Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
In E:\scripts\ExchangeHostNames.ps1:40 Zeichen:16
+ $ExchangeServer
+ ~
In der „Try“-Anweisung fehlt der zugehörige „Catch“- oder „Finally“-Block.
Es wurden nicht alle Analysefehler berichtet. Korrigieren Sie die berichteten Fehler, und versuchen Sie es erneut.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : MissingEndParenthesisInExpression
Hey Franky,
habe das Script heruntergeladen und auf einem aktuell neu installierten Exchange 2019 CU8 versucht auszuführen. Es kommt jedoch folgender Fehler:
In E:\Scripts\ExchangeHostNames.ps1:126 Zeichen:1
+ “
+ ~
Die Zeichenfolge hat kein Abschlusszeichen: „.
In E:\Scripts\ExchangeHostNames.ps1:96 Zeichen:5
+ try {
+ ~
Die schließende „}“ fehlt im Anweisungsblock oder der Typdefinition.
In E:\Scripts\ExchangeHostNames.ps1:126 Zeichen:2
+ “
+ ~
In der „Try“-Anweisung fehlt der zugehörige „Catch“- oder „Finally“-Block.
+ CategoryInfo : ParserError: (:) [], ParseException
+ FullyQualifiedErrorId : TerminatorExpectedAtEndOfString
Wo genau fehlt was?
Danke im Voraus!
LG Dennis
Hallo Dennis,
vielen Dank für den Hinweis, da hatte sich ein Fehler im Script versteckt. Ich habe es gerade korrigiert und neu hochgeladen.
Viele Grüße,
Frank
Hallo zusammen.
Ich beschäftige mich gerade mit dem Thema Zertifikate jedoch für einen EX 2013 den wir via Hybrid Wizard mit O365 verbinden wollen.
Da wird im Wizard ja an einem Punkt ein Zertifikat verlangt das zur Absicherung der Kommunikation verlangt wird. Dieses Zertifikat und seinen Inhalt bin ich aktuell am recherchieren.
Gibt es dieses Script auch für Exchange 2013 eventuell ?
Danke fèr ein kurzes feedback
Hallo Frank,
danke für das Skript. Zertifikate sind aus meiner Sicht immer ein Thema, vor dem viele zurückschrecken und für viele Unsicherheiten bestehen.
Dein Skript geht auf die virtuellen Verzeichnisse. Aus meiner Sicht kann es aber auch relevant sein die akzeptieren Domänen mitzubetrachten. Zwar kann ich den Autodiscover für weitere Domänen auch über einen SRV Eintrag auf die Hauptdomäne umleiten, kann dann aber bei Skype-Clients Redirect Meldungen erhalten oder Probleme bei Raumsystemen haben, die keinen SRV Eintrag unterstützen. Sicher betrifft das nicht alle, aber ich hab die Erfahrung gemacht, dass es die wenigsten Probleme gibt, wenn für jede akzeptierte Domäne auch ein Autodiscover Eintrag vorhanden ist, auf den man dann per Host A-Eintrag verweisen kann.
Man kann das dann natürlich noch weiter runter brechen, dass man den Eintrag nur für Domänen setzt, die auch als primäre Adresse verwendet werden.
Hast Du da ähnliche Erfahrungen gemacht oder die Thematik anders umgangen?
Gruß
Thorsten