Exchange 2013/2016: Assistent für Zertifikate

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:

Assistent

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:

image

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:

image

Die Vorlage „Webserver“ muss dupliziert werden

image

Im neuen Fenster unter dem Reiter Allgemein den Vorlagenanzeigenamen festlegen und merken (wird von ExchangeCerttificateAssistant abgefragt)

image

Auf dem Reiter Anforderungsverwaltung müssen die Haken bei „Vom Antragssteller zugelassene symmetrische Algorithmen einbeziehen“ und „Exportieren von privaten Schlüssel zulassen“ gesetzt werden

image

Auf dem Reiter Sicherheit wird die Gruppe „Exchange Trusted Subsystem“ mit den Rechten „Lesen“ und „Registrieren“ hinzugefügt

image

Jetzt kann mit „OK“ bestätigt werden und die Zertifikatsvorlagenkonsole geschlossen werden. Die neue Vorlage muss dann nur noch veröffentlicht werden

image

image

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

image

Der Assistent fragt nach dem Vorlagennamen, hier muss der eben vergebene Vorlagenanzeigename eingetragen werden

image

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:

image

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.

image

Download:

 

Kleines Update: Der Assistent funktioniert auch mit Exchange 2016.

21 Kommentare zu “Exchange 2013/2016: Assistent für Zertifikate”

  1. 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!

  2. 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

  3. 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

  4. 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?

  5. 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

  6. 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 ?

  7. 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

  8. 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

  9. 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 :-(

    1. Hi Volker,
      es werden keine Zertifikate gelöscht. Per Shell lassen sich die Bindungen wiederherstellen. Welche Exchange Version wird eingesetzt?
      Gruß, Frank

  10. 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!

  11. 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

  12. 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

  13. 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

  14. 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

Schreibe einen Kommentar

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