Viele Mails die mich erreichen, drehen sich immer wieder um Zertifikate. Daher habe ich einen kleinen Assistent mittels PowerShell erstellt, das einem ein bisschen Arbeit mit den Zertifikaten abnimmt. Es sucht sich automatisch die entsprechenden DNS-Namen, fordert das Zertifikat von einer Windows CA an und installiert es auf allen Exchange 2013 Servern. Ganz ohne etwas Handarbeit geht es allerdings nicht:
ExchangeCertificateAssistant
Voraussetzungen
Auf dem Exchange Server auf ExchangeCertificateAssistant ausgeführt wird, muss das ActiveDirectory Modul für die PowerShell installiert sein, das Modul lässt sich im Servermanager nachinstallieren:
Damit der Assistent Zertifikate anfordern kann, muss es neben einer Zertifizierungsstelle auch eine Zertifikatsvorlage geben. Wie eine Zertifizierungsstelle installiert und konfiguriert wird, habe ich hier beschrieben:
Wenn es schon eine installierte und konfigurierte Zertifizierungsstelle gibt, muss nur eine neue Vorlage erstellt werden. Dazu in der MMC der Zertifizierungsstelle die Zertifikatsvorlagenkonsole öffnen:
Die Vorlage „Webserver“ muss dupliziert werden
Im neuen Fenster unter dem Reiter Allgemein den Vorlagenanzeigenamen festlegen und merken (wird von ExchangeCerttificateAssistant abgefragt)
Auf dem Reiter Anforderungsverwaltung müssen die Haken bei „Vom Antragssteller zugelassene symmetrische Algorithmen einbeziehen“ und „Exportieren von privaten Schlüssel zulassen“ gesetzt werden
Auf dem Reiter Sicherheit wird die Gruppe „Exchange Trusted Subsystem“ mit den Rechten „Lesen“ und „Registrieren“ hinzugefügt
Jetzt kann mit „OK“ bestätigt werden und die Zertifikatsvorlagenkonsole geschlossen werden. Die neue Vorlage muss dann nur noch veröffentlicht werden
Nachdem die Vorlage erstellt und veröffentlicht wurde kann der Assistent aus der Exchange Management Shell gestartet werden
Hinweis: ExchangeCertificateAssistant benötigt Server 2012 R2, PowerShell 4, Exchange 2013 und das ActiveDirectory Modul für die Powershell. Der oder die Exchange Server müssen bereits vollständig konfiguriert sein, für die Konfiguration kann der Exchange Configurator genutzt werden.
ExchangeCertificateAssistant starten
.\ExchangeCertificateAssistant.ps1
Der Assistent fragt nach dem Vorlagennamen, hier muss der eben vergebene Vorlagenanzeigename eingetragen werden
Der Rest sollte selbsterklärend sein. Bevor das Zertifikat ausgestellt wird, besteht noch die Möglichkeit weitere DNS-Namen hinzuzufügen, die nicht in Exchange konfiguriert wurden:
Das Zertifikat wird dann ausgestellt und an die Exchange Dienste gebunden, außerdem wird es unter c:\Zertifikat auf dem Exchange Server gespeichert, der den Assistent ausgeführt hat. Das Kennwort ist wählbar, somit lässt sich das Zertifikat auf Loadbalancer oder Firewalls übertragen.
Download:
ExchangeCertificateAssistant
Kleines Update: Der Assistent funktioniert auch mit Exchange 2016.
Hallo Frank,
nochmals vielen Dank für Deine genialen Skripte und Artikel. Ich und viele andere wären ohne Dich nicht halb so weit bei der Administration unserer Exchange Server.
Ich hätte mal eine Frage zum Zertifikats-Assistenten für Lets Encrypt: Ist es aus Deiner Sicht denkbar, DANE (DNS-based Authentication of Named Entities) mit Lets Encrypt umzusetzen?
Liebe Grüße
Michael
Hallo
Ich komme nicht weiter, da ich die Fehlermeldung nicht beheben kann, und nicht verstehe was sie mir sagen will.
Das script läuft bis 00:17:17 auf die unten stehende Fehlermeldung.
11.03.2019 00:17:14;IIS;Info;Changing Let’s Encrypt IIS directory to http;
11.03.2019 00:17:15;IIS;Info;Successfully changed Let’s Encrypt IIS directory to http;
11.03.2019 00:17:15;IIS;Info;Checking Let’s Encrypt IIS directory to accept validation by http request;
11.03.2019 00:17:15;IIS;Info;.well-known directory accepts http;
11.03.2019 00:17:15;LE Challange;Info;Try to submit challenge;
11.03.2019 00:17:16;LE Challange;Info;Submitted challenge for Alias Cert110320190017-1;
11.03.2019 00:17:16;LE Challange;Info;Try to submit challenge;
11.03.2019 00:17:17;LE Challange;Info;Updated Identifier for Alias Cert110320190017-1;
11.03.2019 00:17:17;Certificate;Info;Try to create the certificate;
11.03.2019 00:17:17;Certificate;Info;Using mail.gehlhaar.de as certificates CN;
11.03.2019 00:17:17;Certificate;Error;Failed to create the certificate SAN110320190017; Unable to find an Identifier for the given reference
Kann mir jemadn weiterhelfen warum er den Identifier nicht finden kann, bzw welchen Identifier er sucht.
Danke
Heute geht nichts mehr. Habe den Server neu gestartet und jetzt sagt er beim Zertifikat Datum ungültig!
Was nun???
Hi Frank, danke für dein bombastisches Skript. Hab auch noch ein Problem mit dem Renew. Task wird angelegt und der läuft auch soweit aber das Zertifikat wird leider nicht ausgetauscht. Hab das mal manuell gestartet und er macht soweit alles ganz brav. Die EX Shell wird geladen dann sehe ich noch „Exchange Server 2013/2016 wurde erkannt“ und dann geht er aus der Shell wieder raus. Bei den Zertifikaten wird leider nichts geändert, ein Fehler kommt auch nicht.
Hättest du einen Tipp?
Danke dir und VG
Stefano
Hallo Frank,
tolles Script – die initiale Ausstellung des Zertifikates funktioniert korrekt, nicht allerdings das Anlegen des geplanten Tasks für das Auto-Renewal. Bevor der Bildschirm gelöscht wird und „Alle Informationen sind vorhanden, soll das Zertifikat konfiguriert werden?“ erscheint sieht man auch kurz einen Fehler in rot, aber es geht zu schnell, als dass man erkennen könnte, was es ist.
Hast Du einen Hinweis, wie man den Task manuell einrichten kann?
Danke & Gruß
Jan
Hallo Frank
Ich bin der dritte im Bunde.
wie kann ich die Bindung per Shell wieder herstellen?
Exchange 2013
Danke
Hallo,
wie kann ich die Bindung per Shell wieder herstellen? Habe genau das gleiche Problem. wie Volker.
Es geht bei mir um Exchange 2013
Danke!
Hi Franky, bei uns ist es auch passiert – gleicher Fehler wie oben !! Nun haben wir ein echtes Problem …kommen nicht mal mehr auf ECP, das Standard Zertifikat ist weg und auch sonst gibt keine Zertifikate und Bindungen mehr auf unserem Exchange :-(
Hi Volker,
es werden keine Zertifikate gelöscht. Per Shell lassen sich die Bindungen wiederherstellen. Welche Exchange Version wird eingesetzt?
Gruß, Frank
Hallo Frank,
ich erhaltefolgende Fehlermeldung, kannst Du helfen?
Get-Certificate : Falscher Parameter. 0x80070057 (WIN32: 87 ERROR_INVALID_PARAMETER)
In D:\zertifikate\ExchangeCertificateAssistant.ps1:178 Zeichen:9
+ $cert = Get-Certificate -Template $template -DnsName $dnsnames -CertStoreLocatio …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-Certificate], Exception
+ FullyQualifiedErrorId : System.Exception,Microsoft.CertificateServices.Commands.GetCertificateCommand
Export-PfxCertificate : Es wird kein Zertifikat exportiert, da die Eingabe leer ist.
In D:\zertifikate\ExchangeCertificateAssistant.ps1:191 Zeichen:69
+ $export = Get-ChildItem -Path „cert:\localMachine\my\$thumbprint“ | Export-PfxCe …
+ ~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Export-PfxCertificate], ArgumentException
+ FullyQualifiedErrorId : NullInput,Microsoft.CertificateServices.Commands.ExportPfxCertificate
Hey Franky,
ist es nicht möglich den -Subjectname mit einzubinden?
$cert = Get-Certificate -Template $template -DnsName $dnsnames -SubjectName tester -CertStoreLocation cert:\LocalMachine\My -Url ldap:
Erzeugt den Fehler, dass ein fehlerhaftes x500 Attribut vorhanden ist…
Encode: The string contains an invalid X500 name attribute key, oid, …
Hast Du eine Ahnung woran das liegen kann?
Im Grunde ist es ja nur ein String, nichts spezielles
Hallo,
bekomme folgenden fehler:
Importiere und Aktiviere Zertifikat auf Server EXCHANGE
Ein spezieller RPC-Fehler ist auf Server EXCHANGE aufgetreten: Das Zertifikat mit dem Fingerabdruck
’94D53F59AE899A9D3C0BC5B1AB1384CE5549C1DB‘ wurde gefunden, ist jedoch für die Verwendung mit Exchange Server nicht
gültig (Begründung: SigningNotSupported).
+ CategoryInfo : NotSpecified: (:) [Enable-ExchangeCertificate], InvalidOperationException
+ FullyQualifiedErrorId : EA32EA0C,Microsoft.Exchange.Management.SystemConfigurationTasks.EnableExchangeCertificat
e
+ PSComputerName : exchange.xxxx.local
———————————————————————
Das Zertifikat wurde unter c:\Zertifikat\Exchange.pfx gesichert
hast Du dazu ne Idee ?
Kann man eine Möglichkeit schaffen, für „weitere Domains“ eine Textdatei einzulesen?
Beste Grüße
Jörg
hi frank,
ich erhlalte folgende fehlermeldungen…
Wurde die Zertifikatsvorlage erstellt? (j/n): j
Bitte Name der Zertifikatsvorlage angeben: ExchangeCertificateAssistant
Vorlage gefunden
Bitte Passwort für die PFX-Datei eingeben: *********
Lese DNS-Namen aus…
WARNUNG: Das Cmdlet „Get-ClientAccessServer“ wird in einer künftigen Version von Exchange entfernt. Verwend
stattdessen das Cmdlet „Get-ClientAccessService“. Wenn in Skripts das Cmdlet „Get-ClientAccessServer“ verwen
aktualisieren Sie die Skripts, sodass sie das Cmdlet „Get-ClientAccessService“ verwenden. Weitere Informatio
Sie unter „http://go.microsoft.com/fwlink/p/?LinkId=254711“.
Folgende DNS-Namen werden auf dem Zertifikat eingetragen:
esrv01.xxx.local
ESRV01
ESRV01.xxx.local
autodiscover.xxx.local
autodiscover.xxx.de
Sollen dem Zertifikat weitere Namen hinzugefügt werden? (j/n): j
Bitte DNS-Namen eingeben: mail.xxx.de
Sollen dem Zertifikat weitere Namen hinzugefügt werden? (j/n): n
Das Zertifikat wird mit folgenden Namen ausgestellt:
esrv01.xxx.local
ESRV01
ESRV01.xxx.local
autodiscover.xxx.local
autodiscover.xxx.de
mail.xxx.de
Get-Certificate : Falscher Parameter. 0x80070057 (WIN32: 87 ERROR_INVALID_PARAMETER)
In C:\Users\Administrator.xxx\Desktop\ExchangeCertificateAssistant.ps1:178 Zeichen:9
+ $cert = Get-Certificate -Template $template -DnsName $dnsnames -CertStoreLocatio …
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo : NotSpecified: (:) [Get-Certificate], Exception
+ FullyQualifiedErrorId : System.Exception,Microsoft.CertificateServices.Commands.GetCertificateCommand
Export-PfxCertificate : Es wird kein Zertifikat exportiert, da die Eingabe leer ist.
In C:\Users\Administrator.xxx\Desktop\ExchangeCertificateAssistant.ps1:191 Zeichen:69
+ $export = Get-ChildItem -Path „cert:\localMachine\my\$thumbprint“ | Export-PfxCe …
+ ~~~~~~~~~~~~
+ CategoryInfo : InvalidArgument: (:) [Export-PfxCertificate], ArgumentException
+ FullyQualifiedErrorId : NullInput,Microsoft.CertificateServices.Commands.ExportPfxCertificate
Importiere und Aktiviere Zertifikat auf Server ESRV01
Zugriffsfehler für die importierte Zertifikatdatei für Server ESRV01. Ursache: Die Datei
„\\ESRV01\c$\Zertifikat\Exchange.pfx“ konnte nicht gefunden werden.
+ CategoryInfo : InvalidOperation: (:) [Import-ExchangeCertificate], InvalidOperationException
+ FullyQualifiedErrorId : [Server=ESRV01,RequestId=9ea8ebbf-6a18-4c42-a691-6eefec1358e6,TimeStamp=10.11.
:04] [FailureCategory=Cmdlet-InvalidOperationException] 3B8BDEDE,Microsoft.Exchange.Management.SystemConf
Tasks.ImportExchangeCertificate
+ PSComputerName : esrv01.xxx.local
Das Argument kann nicht an den Parameter „Thumbprint“ gebunden werden, da es sich um eine leere Zeichenfolge
+ CategoryInfo : InvalidData: (:) [Enable-ExchangeCertificate], ParameterBindingValidationExcep
+ FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Enable-ExchangeCertifica
+ PSComputerName : esrv01.xxx.local
Hallo,
Ist es richtig, dass in diesem Fall Zertifizierungsstelle und der Exchange-Server auf einem Rechner liegen müssen? Oder kann man die beiden Funktionen auch auf zwei Rechner verteilen?
Hallo,
die Zertifizierungsstelle muss AD integriert sein, kann aber natürlich auf einem anderem Server laufen.
Gruß, Frank
Hallo nochmals,
leider hatte ich keine andere Möglichkeit als den Webverwaltungsdient neu zu installieren, damit hat er sich das Standardzertifikat geholt und die Exchange Powershell ging wieder. Dann konnt ich ein Zertifikat erstellen und die Bindings der Defautl Web Site und der Back End Site darauf binden und somit hab ich den Exchange wieder sauber am laufen.
Mich würde dennoch interressieren wie, warum sowas passieren kann und er, obwohl das Script mit nem Fehler abbricht, die Standard Exchange Zertifikate einfach unwiederruflich löscht. Ideen?
Gruß JW
Hallo,
ich habe das Script nun nach Anleitung ausgeführt. Beim erstellen des Scripts gibts dann eine Fehlermeldung:
Get-Certificate : Falscher Parameter. 0x80070057 (WIN32: 87)
In C:\Zertifikate_Exch\ExchangeCertificateAssistant.ps1:179 Zeichen:9
+ $cert = Get-Certificate -Template $template -DnsName $dnsnames -CertStoreLocatio …
mit dem Ergebnis dass bisherige Zertifikate aus dem Zertifikasspeicher des Exchange gelöscht wurden.
Warum? Wie komme ich an diese wieder dran?
Danke und Gruß JW
Hallo Franky,
vielen Dank für diese tolle Anleitung!
Wenn ich das Skript ausführen will bekomme ich den Hinweis, dass dieses nicht digital zertifiziert sei.
Hast Du mir dafür nen Tipp? Danke!
Hi,
set-executionpolicy unrestricted
und wenn du fertig bist: set-executionpolicy restricted
Gruss, Frank
Sehr nützliches Script, aber der Antragstellername wird nicht gefüllt!? Damit meldet dann z.B. das TestTool von MS Fehler:
https://testconnectivity.microsoft.com