Am 06.02.2017 hatte ich die erste Version des Zertifikatsassistent für Exchange 2016 und Let’s Encrypt veröfferntlicht. Der Zertifikatsassistent vereinfacht das Anfordern, Erneuern und Installieren eines SSL-Zertifikats für Exchange 2016. Nun gibt es Dank Bjoern eine neue Version.

Bjoern hat sich die Mühe gemacht und einige Änderungen vorgenommen, sodass der Zertifikatsassistent auch mit Exchange 2010 und Exchange 2013 funktioniert. Des weiteren ist das mehrmalige Ausführen pro Tag dank Bjoerns Änderungen nun auch möglich. Häufiges Ausführen des Scripts ist allerdings mit etwas Vorsicht zu genießen, hier gibt es Limits von Let’s Encrypt:

https://letsencrypt.org/docs/rate-limits/

Falls das ACMESharp Modul nicht bereits installiert ist, wird nun die Version 0.8.1 durch das Script installiert. Die Version des ACMESharp Moduls ist zwar etwas älter, aber damit funktioniert die HTTP Validierung durch Let’s Encrypt noch.

Nach wie vor gelten ein paar Voraussetzungen für den Assistenten, diese sind hier beschrieben:

https://www.frankysweb.de/exchange-2016-zertifikatsassistent-fuer-lets-encrypt/

Neue Version des Exchange Zertifikatsassistent für Let’s Encrypt

Die aktuelle Version des Zertifikatsassistenten kann hier runtergeladen werden:

Durch die geplante Aufgabe wird das Zertifikat 4 Tage vor Ablauf erneuert. Ob das Zertifikat erneuert wurde, sollte also 3 Tage vor Ablauf kontrolliert werden.

Ein komplette Überarbeitung des Scripts habe ich ebenfalls vorgesehen, bin aber leider noch nicht dazu gekommen. Es steht erst einmal ein Update für den Exchange Reporter in den Startlöchern. Verbesserungsvorschläge und Wünsche sind per Mail willkommen.

Vielen Dank an Bjoern!

Update 10.09.17: Edwin van Brenk hat das Script ins Englische übersetzt, vielen Dank dafür! Link siehe unten.

Edwin van Brenk has translated the script to English language. Many thank for your work. You will find the English version here:

Update 26.02.2018: Eine komplett überarbeitete Version findet sich hier (Beta):

Exchange Certificate Assistant: Neue Version

Teilen:

33 Replies to “Neue Version des Exchange Zertifikatsassistent für Let’s Encrypt”

  1. Getestet auf SBS2011, Exch2010 SP3, CU17 bzw. CU18 (Stand 09/2017)
    set-executionpolicy bypass
    und Windows Management Framework 5.1 installieren müssen https://www.microsoft.com/en-us/download/details.aspx?id=54616

    Skript funktioniert 1a! Null IIS-Kenntnisse erforderlich, keine Exchange, gar nix. Funktioniert sogar EINFACHER als der Exchange-/SBS-integrierte Assistent und der ist nicht öffentlich gültig.
    Aufgabenplanung auch Task erstellen lassen und Erneuerung auf jedes Monat eingestellt.

    TOP Skript!

  2. Hallo Mr Buabe,

    soweit ich weiss ist Powershell 5 inkompatibel mit dem SBS 2011 – gibt es da irgendwelche Seiteneffekte oder Fehlermeldungen?
    Ist das in mehreren Installationen getestet?

  3. Powershell v5 wird nur für PSGet benötigt um ACMESharp zu installieren. Über kleine Umwege kann man ACMESharp auch manuell ohne PSGet installieren (z. B. Save-Module von einem anderem System mit PSv5 und dann in den entsprechenden Powershell Module Ordner auf dem Zielsystem kopieren). Wichtig hierbei, die Version 0.8.1 verwenden, mit der aktuellen Version von ACMESharp gab es bei meinem Test Probleme.

    WMF Updates würde ich bei Exchange Servern vermeiden: „Version of Windows Management Framework built into the release of Windows Server you’re installing Exchange on.“ siehe https://technet.microsoft.com/de-de/library/ff728623(v=exchg.150).aspx

  4. Hallo!
    Ein super Skript! Dafür erst mal vielen Dank!!
    Ich habe aber nun ein kleines Problem auf einem Server 2016 an dem ich schier verzweifle … :-(
    Und zwar kann bei mir ACME nicht installiert werden, da die PS angeblich keine Verbindung zum Internet hat. Daher kann nichts nachgeladen werden. Der Server ist aber direkt ohne Proxy mit dem Internet verbunden. Der Server steht zu Hause und hängt hinter einer FritzBox. Ping an eine externe URL funktioniert auch.
    Auf einem Server in Azure hat es auch problemlos funktioniert, auch direkt im Internet und auch 2016. Da läuft das Skript ohne Probleme durch.
    Von Exchange her ist auf beiden Seiten 2016 mit CU6 installiert.
    Ich finde einfach den Unterschied bei beiden Servern wegen der Verbindung zum Internet!!!
    Habt dazu vielleicht jemand eine Idee???
    Danke an alle schon im Voraus!
    Viele Grüße
    Carsten

  5. das Script an sich ist Super !!!
    Auf dem Server 2012R2 mit Exchange 2016 CU6 musste ich allerdings einige Unwegbarkeiten ausräumen, damit das Script fehlerfrei durchläuft:
    PSget gibts für die PS 3 oder 4 als MSI-Download: hier: https://docs.microsoft.com/de-de/powershell/gallery/psget/get_psget_module
    damit kann man dann das passende ACMESharp installieren mit Install-Module -Name ACMESharp -RequiredVersion 0.8.1
    und dann läuft das Script einwandfrei durch

    Von Installation des PS 5 auf dem 2012R2 mit Exchange wird abgeraten, was ich auch bestätigen kann: davon geht dann die Exchange-PS-Console flöten.

    Danke und Gruß

    Alexander

  6. Nachtrag: ACMESahrp bitte mit Install-Module -Name ACMESharp -RequiredVersion 0.8.1 -AllowClobber installieren :) sons

    @Frank, kannst du die Kommentare zusammenführen? Danke

  7. vielleicht kann mir hier jemand helfen:
    Exchange fängt 3 Monate vor Ablauf eines Zertifikats Errors ins Eventlog zu schreiben:
    „ID 12017: An internal transport certificate will expire soon.
    Thumbprint:xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, expires: 04.01.2018 08:00:34“
    und coolerweise noch eine weitere:
    „ID 12018 The STARTTLS certificate will expire soon: subject: email.xxxxxxx.de, thumbprint: xxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxxx, expires: 04.01.2018 08:00:34. Run the New-ExchangeCertificate cmdlet to create a new certificate.“
    das ist zwar nur ein Schönheitsfehler, aber dennoch nervig.
    das neue Zertifikat zu holen ist hier ja keine Lösung, irgendwo müsste man den Zeitpunkt der Meldung nur verstellen können (eine Woche vorher oder so), nur wo?

    Danke im Voraus

  8. Mich würde auch interessieren ob es eine Lösung zu dem von Alexander Schröder angesprochenen Fehler gibt.

  9. Hallo,
    Nach ein bisschen herumprobieren lief das Script auch bei mir durch (W2k12R2/Ex 2016) bis dann zum schluss diese Fehlermeldung kommt.
    „Carry out validation: Cert171120170209-1
    Carry out validation: Cert171120170209-2
    Carry out validation: Cert171120170209-3
    Carry out validation: Cert171120170209-4
    wait 30 Seconds…
    Check whether the DNS names have been validated…
    Update Alias: Cert171120170209-1
    Error: Validation failed for alias Cert171120170209-1“
    Ports 80/443 sind weitergeleitet, Firewall ist aus.
    Woran könnte das liegen?

  10. ich habe noch einen tipp den ich gerne loswerden möchte und mich jetzt einige zeit an suche gekostet hat.

    bitte führt das script bevor das ihr die Alten SSL/TLS Protokolle am Exchange Server deaktiviert (thema Exchange 2016 Installation absichern). ist das geschehen kann keine verbindung zum repository aufgebaut werden.

    danach kann man die protokolle mit dem iis crypto wieder deaktivieren.

  11. Hallo Zusammen,
    ich habe auf meinen Windows 2012 R2 und Exchange 2013 CU12 die Fehlermeldung erhalten „Install-Module“ not found und habe voreilig WMF 5.1 installiert. Nun funktioniert die EMS nicht mehr. Wie kann ich WMF 5.1 deinstallieren, so dass WMF 4.0 wieder sauber arbeitet?
    VG Dieter

  12. einfach unter Programme (Systemsteuerung\Programme\Programme und Features\installierte Updates\ )das entsprechende KB deinstallieren. Dann sollte es wieder gehen.

  13. Script hat auf SBS2011 geklappt.
    Musste nur Powershellget als msi installieren.

    Schön wäre es wenn jetzt noch die Anforderung nur per 443 gehen würde, damit man den Port 80 wieder schließen könnte.

  14. Hallo Zusammen,
    danke für den Hinweis von Alexander Schröder. Ich konnte die Version 5.1 wieder deinstallieren.
    Ich musste für WinRM die Registry-Einstellungen noch anpassen, dann war alles wieder gut.
    VG Dieter

  15. Hallo,
    bekomme auf einen SBS2011 mit Exchange 2010 folgende Meldung wenn das Script versucht das Zert auf dem Exchange zu importieren:

    Zertifikat wird Exchange zugewiesen und aktiviert
    Import-ExchangeCertificate : Beim Exchange-Zertifikatvorgang ist eine Ausnahme aufgetreten. Die Fehlermeldung lautet:
    Unknown error (0xe0434f4d)
    In C:\CertificateAssistant\CertificateAssistant.ps1:370 Zeichen:4
    + Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path $CertPath – …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [Import-ExchangeCertificate], LocalizedException
    + FullyQualifiedErrorId : A84B44C1,Microsoft.Exchange.Management.SystemConfigurationTasks.ImportExchangeCertificat
    e

    Prüfe ob das Zertifikat aktiviert wurde
    Aktivierung ist fehlgeschlagen

    Kann mir jemand helfen???

  16. Seit ich das Zertifikat installiert und die Einstellungen am Exchange verändert habe, kann ich kein neues Profil bei Outlook einrichten. Ich bekomme die Fehlermeldung:
    „Die Aktion kann nicht abgeschlossen werden. Es steht keine Verbindung mit Microsoft Exchange zur Verfügung. Outlook muss im Onlinemodus oder verbunden sein, um diesen Vorgang abzuschließen.“
    Zuvor kommt eine Fehlermeldung da der autodiscover nicht der gleiche Host ist. Ich konnte das Zertifikat nicht auf autodiscover austellen. Kann es an dem Zertifikat liegen, dass das Outlook-Profil nicht mehr angelegt werden kann?

  17. Hallo,

    ich habe ein kleines Problem mit dem Script unter Server 2016 mit Exchange 2016 CU7.

    folgende Ausgabe gibt das script:

    —————————————————————————————————————————

    Prüfe ob bereits ein Vault existiert…
    Prüfe Let’s Encrypt Registrierung…
    Neuer Identifier:
    DNS: w2k16-exchange.***.local
    Alias: Cert310120180358-1
    New-ACMEIdentifier : Error creating new authz :: Name does not end in a public suffix
    In C:\letsencrypt\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (ACMESharp.Vault.Model.IdentifierInfo:IdentifierInfo) [New-ACMEIdent
    AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:malformed (400),ACMESharp.POSH.NewIdentifier
    Validierung vorbereiten:
    Alias Cert310120180358-1
    Complete-ACMEChallenge : Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
    In C:\letsencrypt\CertificateAssistant.ps1:273 Zeichen:20
    + … lidateReq = Complete-ACMEChallenge $ACMEAlias -ChallengeType http-01 …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Complete-ACMEChallenge], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.CompleteChallenge

    Neuer Identifier:
    DNS: mail.***.de
    Alias: Cert310120180358-2
    Validierung vorbereiten:
    Alias Cert310120180358-2
    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert310120180358-1
    Submit-ACMEChallenge : Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
    In C:\letsencrypt\CertificateAssistant.ps1:297 Zeichen:17
    + … $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMEChallenge], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.SubmitChallenge

    Validierung durchführen: Cert310120180358-2
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert310120180358-1
    Update-ACMEIdentifier : Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
    In C:\letsencrypt\CertificateAssistant.ps1:308 Zeichen:21
    + $ACMEIDUpdate = Update-ACMEIdentifier $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Update-ACMEIdentifier], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.UpdateIdentifier

    Fehler: Validierung für Alias Cert310120180358-1 fehlgeschlagen

    —————————————————————————————————————————

    Aus irgend einem Grund versucht das Script den internen Namen über letscrypt zu prüfen. Dies geht natürlich schief. Ich hatte hier und im original Post schon alle Kommentare durchgearbeitet.

    ACME ist 0.8.1 installiert
    MIME-Typ auf dem acme-challange im ISS werden auch korrekt gesetzt

    Kann mir jemand dazu einen Tipp geben?

  18. Hallo,

    ich habe das gleiche Problem wie TobiasK nur auf einem SBS2011 mit Exchange 2010

    gibt es hierzu einen Tipp bzw. Lösung??

    Vielen Dank
    Frank

  19. Ich kann kein -renew:$true verwenden, da sagt er immer der Eintrag existiert schon im Zertifikatspeicher!

    Muss jedes mal ein neues Zertifikat erstellen! :-(

    Gibt es das ganze nicht irgendwo als funktionierend? :-(

  20. Richard, hier funktioniert das Script wirklich super…

    wie wäre es mit einem Post Fehlermeldung?
    Meine Glaskugel funktioniert leider derzeit nicht.

  21. Hallo zusammen,

    wir haben im alten Zertifikat auch diverse ***.local DNS-Namen welche mit dem Skript nicht funktionieren ->
    Name does not end in a public suffix

    Suche auch dringend eine Lösung …….
    Vielen Dank in Voraus und Gruß

    Jens

  22. Hallo zusammen,

    zum Thema „diverse ***.local DNS-Namen“ ist die Lösung denkbar einfach.

    Im Script sollte folgende Zeile ergänzt werden:

    $CertNames = $CertNames | where {$_ -NotLike „*.local“}

    Ergänzt die Zeile for der Zeile:

    $CertNames = $CertNames | select –Unique

    und es werden alle DNS-Name mit *.local am Ende aus dem Array gelöscht.

  23. Mir wird beim Starten des Scripts folgendes ausgespuckt

    Install-Module : Es wurde kein Parameter gefunden, der dem Parameternamen „AllowClobber“ entspricht.
    In C:\Users\Administrator.NET\desktop\CertificateAssistant.ps1:38 Zeichen:58
    + Install-Module -Name ACMESharp -RequiredVersion 0.8.1 -AllowClobber #Modul in …
    + ~~~~~~~~~~~~~
    + CategoryInfo : InvalidArgument: (:) [Install-Module], ParameterBindingException
    + FullyQualifiedErrorId : NamedParameterNotFound,Install-Module

    Fehler: ACME Sharp Modul konnte nicht installiert werden

    wenn ich ACMESharp dann von hand installiere Ohne AllowClobber dann bekomme ich beim starten des scripts folgende Meldung

    Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In C:\Users\Administrator\desktop\CertificateAssistant.ps1:108 Zeichen:5
    + [array]$CertNames += ((Get-MapiVirtualDirectory -Server $ExchangeServer).Ext …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Jemand ne Idee was ich falsch mache. Habe ein Win2012R2Std mit Exchange2013 (Version 15.0 ‎(Build 1156.6))

  24. Bei mir ging es dann auch ohne AllowClobber ich hab einfach nochmals alle Module Deinstalliert rebootet und neu installiert habe im script AllowClobber entfernt und jetzt läuft es.

  25. Ich habe das Script bei mir ausgeführt und weitere Domains hinzugefügt. Beim erneuten ausführen wird immer nur eine Domain berücksichtigt. Wie erreiche ich es das er alle von mir eingetragenen Domains wieder erneuert?

  26. Hallo an Frank und die Gemeinde,

    habe auch versucht das Script mit einem SBS2011 zu installieren. Es funktioniert bis zum Import des Zertifikates. Der Fehler wurde hier auch schon gepostet.

    Import-ExchangeCertificate : Beim Exchange-Zertifikatvorgang ist eine Ausnahme aufgetreten. Die Fehlermeldung lautet:
    Unknown error (0xe0434f4d)
    In D:\Programme\CertificateAssistant\CertificateAssistant.ps1:370 Zeichen:4
    + Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path $CertPath – …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [Import-ExchangeCertificate], LocalizedException
    + FullyQualifiedErrorId : A8B80CEE,Microsoft.Exchange.Management.SystemConfigurationTasks.ImportExchangeCertificat
    e

    Wenn ich nun in der Powershell manuell versuche das Zertifikat zu importieren kommt ebenfalls ein Fehler.

    Cmdlet Import-ExchangeCertificate an der Befehlspipelineposition 1
    Geben Sie Werte für die folgenden Parameter an:
    FileData[0]: C:\Users\admin\AppData\Local\Temp\2\SAN0000000000.pfx
    „C:\Users\admin\AppData\Local\Temp\2\SAN0000000000.pfx“ kann aufgrund eines Formatfehlers nicht als System.Byte erkannt werden.

    Manuelles importieren über Exchange funktioniert allerdings ohne Probleme

  27. Hi,
    eine kurze frage. Ich beschäftige mich gerade mit dem Thema Exchange Hybrid Deployment. Als Transport-Zertifikat dafür muss man ja offenbar ein fixes Zertifikat konfigurieren. Ich könnte als ein LE-Zertifikat verwenden, müsste dann aber nach einem Renewal auch die Hybridkonfiguration aktualisieren. Tut der Zertifikatsassistent das evtl. schon oder hast Du einen Tipp, was man beachten muss?
    Danke & Gruß
    Jan

  28. Hallo zusammen,

    vielen Dank für das Script. (Exchange 2013)
    Das Script lief einwandfrei, alle Einstellungen wurden auf Servername.mydomain.com geändert (Internal / External) auch AutoDiscoverService via Shell. DNS wurde ebenfalls angepasst. Alles sieht gut aus…

    Dennoch erhalte ich nun beim start von Outlook immernoch den Zertifikatsfehler servername.mydomain.local „Der Name auf em Sicherheitszertifikat ist ungültig….“

    Virtual Directories hab ich soweit geprüft für OWA, OBA, EWS, ActivSync und ECP umgestellt auf meine externe URL, hier gibt es keine .local Adresse mehr, wo könnte sie noch hinterlegt sein?

  29. Danke für die Antwort, es lag nicht an der Autodiscover URL sondern OutlookAnywhere
    Außerdem war es ein 2016 und kein 2013, mein Fehler.

    Set-OutlookAnywhere -Identity „SERVERNAME\Rpc (Default Web Site)“ -InternalClientAuthenticationMethod NTLM -InternalHostname URL -InternalClientsRequireSsl $True

    danach funktioniert alles wieder einwandfrei.

    Aber noch eine andere Frage, muss Port 80 dauerhaft offen sein oder reicht es wenn man ihn alle 3 Monate öffnet für die Erneuerung?

Schreibe einen Kommentar

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