Exchange 2016: Zertifikatsassistent für Let’s Encrypt

Ich hatte es ja bereits angekündigt, dass der Zertifikatsassistent ein Update für Let’s Encrypt erhält. Die Version für Exchange 2016 ist jetzt fertig.

Der Zertifikatsassistent kann mit wenigen Angaben ein Zertifikat von Let’s Encrypt holen und danach auch vollautomatisch erneuern.

Getestet habe ich dieses Script bisher mit Windows Server 2016 und Exchange Server 2016. Tests für Server 2012 R2 und Exchange Server 2013/2016 bereite ich gerade vor und werde die Version ggf. entsprechend anpassen. Bisher gibt es also nur Unterstützung für Server 2016 und Exchange 2016, weitere Versionen folgenden.

Das Script funktioniert relativ einfach und ohne viel zutun. Folgende Voraussetzungen gibt es allerdings:

  • Exchange Server muss mit gültigen URLs / Hostnamen konfiguriert sein
  • Alle Hostnamen müssen aus dem Internet erreichbar sein
  • Die konfigurierten Hostnamen müssen per HTTP (Port 80) aus dem Internet erreichbar sein

Die Vorausetzungen gelten damit Let’s Encrypt die Domains validieren kann. Interne Hostnamen, wie zum Beispiel exsrv1.domain.local lassen sich also nicht verwenden.

Der Zertifikatsassistent liest die konfigurierten Hostnamen aus und holt dann ein entsprechendes SAN-Zertifikat von Let’s Encrypt. Das Zertifikat wird im Anschluss automatisch aktiviert.

Da Let’s Encrypt Zertifikate nur 3 Monate lang gültig sind, kann eine geplante Aufgabe erstellt werden, die 4 Tage vor Ablauf das Zertifikat erneuert. Für die Erneuerung ist keine Benutzerinteraktion nötig.

Für Tests lässt sich der Zeitpunkt der Erneuerung selbst bestimmen (Zeile 402 im Script). Beispielsweise könnte hier 30 Tage eingetragen werden, um genügend Zeit für die Fehleranalyse zu haben. Bisher habe ich das Script in drei unterschiedlichen Exchange Umgebungen getestet, bisher erfolgreich. Ich freue mich aber über Feedback.

So sieht die Oberfläche mit allen nötigen Eingaben aus:

Zertifikatsassistent Let's Encrypt

Der Rest funktioniert automatisch und dauert ca. 2 Minuten:

image

In der Aufgabenplanung wird eine Aufgabe zu Erneuerung angelegt, Die Aufgabe startet jeden Tag um 23:00 Uhr und erneuert das Zertifikat 4 Tage vor Ablauf:

image

Bekannte Probleme:

  • Wenn noch keine Registrierung bei Let’s Encrypt vorliegt, wird eine Fehlermeldung generiert, die Registrierung wird dann aber durchgeführt.
  • Es gibt noch keine Benachrichtigung oder Fehlerbehandlung für das Erneuern

Abhängigkeiten:

  • PowerShell IIS Modul (Webadministration)
  • Exchange Management Shell
  • ACMESharp PowerShell Client (wird installiert, wenn nicht vorhanden)

Wer Lust hat kann die erste Version testen, natürlich können hier noch diverse Probleme auftauchen, daher bitte vorerst nicht in produktiven Umgebungen einsetzen.

Feedback und Probleme bitte via Kontaktformular. Bei Problemen bitte immer Screenshots oder die Ausgabe anhängen.

105 Replies to “Exchange 2016: Zertifikatsassistent für Let’s Encrypt”

  1. Klasse Tool,

    habe für Server 2012R2 Exchange 2013 folgendes festgestellt:
    1. Powershell 5 muss installiert sein
    -> https://www.microsoft.com/en-us/download/details.aspx?id=50395
    2. ACME muss ohne den Zusatz „-AllowClobber“ installiert werden
    3. Autodiscover kann nicht ermittelt werden
    -> habe ich manuell hinzugefügt, liegt vermutlich an der Abfrage gegen den Exchange
    4. Ich hatte schon das Problem, dass der IIS auf Pot 444, also Exchange BackEnd, das falsche ungültige Zertifikat hatte, somit kein Sync mit Endgeräten möglich war. Dies sollte noch beachtet werden.
    -> habe ich manuell angepasst

    Grüße Stephan

  2. Gibt es eine Möglichkeit eine bestimmte Domäne von der Prüfung auszuschließen?
    Beispielsweise die exchange.domain.local

  3. HI,
    nein eine konfigurierte Domain ausschließen funktioniert nicht. Es würde zu Zertifikatswarnungen kommen. Gruß, Frank

  4. Hi Stephan,
    das Zertifikat der Backend Website wird nicht ausgetauscht, hier bleibt das Exchange Self Signed im Einsatz, das stört auch nicht.
    Danke für die Hinweise.
    Gruß, Frank

  5. Coole Sache!
    Ich bereite grade eine Migration auf Ex16 vor, da kommt dies sehr gelegen, da auch das gekaufte Zertifikat bald ausläuft.
    Der offene Port 80 lässt mich noch grübeln: Bisher habe ich den Exchange über die Sophos WAF veröffentlicht und dort 80 nach 443 umleiten lassen.
    Noch ohne eigene Tests: Funktioniert die Zertifikatserneuerung auch über die WAF Umleitung auf 443, oder muss hier die WAF nur auf 443 hören und für Let’sEncrypt auf 80 gibt es eine NAT-Regel? Die könnte man auf die Let’sEncrypt-IPs einschränken, dann bleiben aber alle Port 80 OWA User draußen…

  6. Hi Frank,

    das selbstsignierte läuft doch auch aus.
    Wäre es nicht sinnvoll hier vorzubeugen?

    grüße Stephan

  7. Hi Stephan,
    das Backend Zertifikat hat eine Laufzeit von 5 Jahren. Vor Ablauf kann es einfach wieder gegen ein selbstsigniertes Zertifikat getauscht werden. Es besteht wie schon erwähnt keine Notwendigkeit ein anderes Zertifikat zu verwenden.
    Gruß, Frank

  8. Hi Nathan,
    mit der WAF wird es etwas schwieriger. Lets Encrypt muss den Server per Port 80 erreichen können, ein Redirect von 80 auf 443 an der WAF wird also nicht funktionieren. Ich habe das bisher nicht in Verbindung mit der WAF getestet, aber das Zertifikat müsste ja auch auf der Sophos installiert werden, wenn es erneuert wird. Das dürfte schwierig werden.
    Gruß, Frank

  9. Nach ein paar Anpassungen hat das Script sehr gut funktioniert. Vielen Dank dafür.
    Macht es denn ueberhaupt Sinn, die InternalURLs mit abzufragen? Entweder sind sie gleich (SplitBrain) oder der interne ist nicht DNS-aufloesbar und darf nicht mit rein.
    Oder gibt es da Fälle, wo intern und extern unterschiedlich, aber trotzdem uebers Internet aufloesbar sind?

  10. Hi Thomas,

    wenn interne URLs konfiguriert wurden und diese später nicht auf dem Zertifikat stehen, wird es zu Zertifikatswarnungen kommen. Anders herum, wenn interne URLs angegeben wurden, diese aber nicht durch Let’s Encrypt validierbar sind, kann kein Zertifikat ausgestellt werden. Daher die Prüfung.

    Gruß, Frank

  11. Hi, vielen Dank für deine Mühen und das Skript, welches vmtl. vielen die Arbeit abnehmen wird. Besteht die Chance, dass dieses auch mit Exchange 2010 läuft / laufen wird?

  12. Let’s encrypt steht auf der Sophos Roadmap. Sollte noch dieses Jahr integriert werden.

    @Frank: Vielen Dank

  13. Leider funktioniert die Erneuerung nicht wirklich:

    Get-ACMECertificate : The file ‚C:\Users\Administrator.PSC\AppData\Local\Temp\SAN24022017.pfx‘ already exists.
    At C:\Users\Administrator.PSC\Downloads\CertificateAssistant\CertificateAssistant.ps1:438 char:18
    + $CertExport = Get-ACMECertificate $SANAlias -ExportPkcs12 $CertPath -Certific …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Get-ACMECertificate], IOException
    + FullyQualifiedErrorId : System.IO.IOException,ACMESharp.POSH.GetCertificate

    Import-ExchangeCertificate : A special Rpc error occurs on server EX1W12: The source data cannot be imported or the wrong password was specified.
    At C:\Users\Administrator.PSC\Downloads\CertificateAssistant\CertificateAssistant.ps1:441 char:4
    + Import-ExchangeCertificate -FileName $CertPath -FriendlyName $ExchangeSubject …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : ReadError: (:) [Import-ExchangeCertificate], InvalidOperationException
    + FullyQualifiedErrorId : [Server=EX1W12,RequestId=706bdc24-6bb9-43f8-9279-688a492e4c61,TimeStamp=24.02.2017 09:17:48] [FailureCategory=Cmdlet-InvalidOperationExcep
    tion] F11D832B,Microsoft.Exchange.Management.SystemConfigurationTasks.ImportExchangeCertificate

  14. Hi Peter,
    stimmt, am gleichen Tag brauchst du es aber auch nicht erneuern. Morgen würde es klappen. Ich schaue mal, dass ich das Script noch ein wenig verbessere.
    Danke für den Hinweis.
    Gruß, Frank

  15. Hallo Frank,

    vielen Dank für dieses Script und deine Arbeit in dieses.
    Erhalte jedoch beim Export des Scripts eine Fehlermeldung.

    Anbei der Auszug aus der Konsole:

    Prüfe DNS Einträge…

    DNS Test bestanden: autodiscover.xxxxx.de wurde in IP 188.109.xxx.yyy aufgelöst
    DNS Test bestanden: outlook.xxxxx.de wurde in IP 188.109.xxx.yyy aufgelöst
    Prüfe ob bereits ein Vault existiert…
    Prüfe Let’s Encrypt Registrierung…
    Neuer Identifier:
    DNS: autodiscover.xxxxx.de
    Alias: Cert24022017-1
    Validierung vorbereiten:
    Alias Cert24022017-1
    Neuer Identifier:
    DNS: outlook.xxxxx.de
    Alias: Cert24022017-2
    Validierung vorbereiten:
    Alias Cert24022017-2
    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert24022017-1
    Validierung durchführen: Cert24022017-2
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert24022017-1
    Validierung OK
    Update Alias: Cert24022017-2
    Validierung OK
    30 Sekunden warten…
    Prüfe das Zertifikat…
    Zertifikat OK
    Exportire das Zertifikat nach C:\Users\ex-admin\AppData\Local\Temp
    Get-ACMECertificate : asset file does not exist
    In C:\Users\ex-admin\Desktop\Let´sEncrypt CertificateAssistant\CertificateAssistant.ps1:356 Zeichen:15
    + … ertExport = Get-ACMECertificate $SANAlias -ExportPkcs12 $CertPath -Ce …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Get-ACMECertificate], FileNotFoundException
    + FullyQualifiedErrorId : System.IO.FileNotFoundException,ACMESharp.POSH.GetCertificate

    Prüfe ob das Zertifikat exportiert wurde…
    Fehler: Das Zertifikat wurde nicht exportiert

    Hat jemand eine Ahnung woran das liegen kann?

    Vielen Dank für eure Hilfe!

    Gruß
    Stephan

  16. Moin, Moin,

    also ich muss jetzt mal fragen nachdem ich nun schon das zweite mal den Exchange neu aufgesetzt habe. Alles klappt soweit ganz gut, nur das wichtigste Zertifikat schlechthin wird nicht ausgestellt weil ich hierüber:
    Resolve-DnsName master.xyz.com -Server 8.8.8.8 -ea 0
    die internen IP-Adressen aufgelöst bekomme. Wie kann ich das ändern?

    Danke und Gruß aus Hamburg

  17. Hallo Frank,
    vielen Dank für den Assistenten! Funktioniert auch bei mir tadellos.

    Jetzt müsste man nur für das automatische renewal eine dauerhafte Ausnahme in der UTM für das Verzeichnis .well-known auf Port 80 hinzufügen. Oder gibt es Sicherheitsbedenken, wenn das Verzeichnis dauerhaft „offen“ ist?

    Danke und beste Grüße

  18. Hi Sönke,
    die UTM soll wohl direkte Unterstützung für Let’s Encrypt bekommen, was ich klasse finde. Mal sehen ob es wirklich kommt. Ich habe es bisher nicht hinbekommen die UTM so zu konfigurieren, dass ein http/https Redirect stattfindet, aber das .well-known Verzeichniss per http erreichbar ist. Wenn du da einen Tipp hast, immer her damit :-)
    Gruß, Frank

  19. So,- nachdem ich heute den ganzen Tag damit verbracht habe und nicht ein einziges Stück weiter gekommen bin, muss ich hier doch noch mal nachharken bevor ich mir wieder ein Zertifikat kaufe. Ich erhalte folgende Ausgabe:

    [PS] C:\Windows\system32>Resolve-DnsName master.XYZ.com -Server 8.8.8.8 -ea 0

    Name Type TTL Section IPAddress
    —- —- — ——- ———
    Master.XYZ.com AAAA 1200 Question fe80::1000:d49:d1fe:398e
    Master.XYZ.com AAAA 1200 Question 2001:0:34a9:ece7:1000:d49:d144:398e
    Master.XYZ.com AAAA 1200 Question fe80::5efe:192.168.0.2
    Master.XYZ.com AAAA 1200 Question fe80::c1ab:3d1b:7767:392
    Master.XYZ.com A 1200 Question 192.168.0.2

    [PS] C:\Windows\system32>Resolve-DnsName server.XYZ.com -Server 8.8.8.8 -ea 0

    Name Type TTL Section NameHost
    —- —- — ——- ——–
    server.XYZ.com CNAME 59 Answer XYZ.com

    Name : XYZ.com
    QueryType : A
    TTL : 59
    Section : Answer
    IP4Address : 46.59.198.111

    Name : XYZ.com
    QueryType : SOA
    TTL : 1799
    Section : Authority
    NameAdministrator : hostmaster.XYZ.com
    SerialNumber : 1488220650
    TimeToZoneRefresh : 16384
    TimeToZoneFailureRetry : 2048
    TimeToExpiration : 1048576
    DefaultTTL : 2560

    [PS] C:\Windows\system32>

    Der FQDN server.XYZ.com wird korrekt aufgelöst, der Hostname master.XYZ.com hingegen nicht. Dabei sind beide kann ich keine Unterschiede in der Konfiguration erkennen. Mittlerweile konfiguriere ich völlig ohne Hirn und Verstand weil ich das so gar nicht verstehen kann in der Hoffnung ein besseres Ergebnis zu erhalten.

    Kann mir hier jemand weiter helfen?

  20. Hi Thomas,
    „Resolve-DnsName master.xyz.com -Server 8.8.8.8 -ea 0“ löst den DNS Namen via Google DNS Server auf, wenn du hier interne IP Adressen bekommst, liegt entweder ein Problem an deiner DNS Konfiguration vor und die spätere Validierung von Let’s Encrypt schlägt fehl, oder ein Gerät in deinem Netz schreibt die Antwort des Google DNS um.
    Gruß, Frank

  21. Hi Frank,

    Also ich habe eine Fritz.Box in der der Server als Exposed Host eingetragen ist. Zusätzlich sind die Ports 80 und 443 explizit geöffnet. IPV6 habe ich bei der Internetverbindung deaktiviert. Wenn ich die Auflösung von hier aus teste: http://www.dnstools.ch/dns-nameserver.html dann funktioniert die Auflösung. Ein Zertifikat bekomme ich aber nicht ausgestellt. Kannst du mir sagen welche Einträge im DNS-Server vorhanden sein müssen damit die Auflösung funktioniert? Ich habe auch keinen weiteren DNS-Server im Netz. Selbst wenn ich den Google-DNS-Server als einzigen DNS-Server in der Einstellung der Netzwerkkarte eintrage, funktioniert das nicht. Danke und Gruß aus Hamburg

  22. Danke für das Script, tolle Arbeit.

    Habe das ganze unter Server 2012R2 und Exchange 2016 getestet. Folgendes ist aufgefallen.

    1. Es muss Powershell 5.x installiert werden, sonst schlägt das Installieren des ACME fehl ( Install-Module fehlt wohl im Original Powershell des 2012R2) – habe die Version 5.1 installiert.

    2. autodiscover wurde nicht automatisch erkannt. Warum auch immer. Liegt also offenbar nicht an der Exchange Version (Stephan hatte das gleiche Ergebnis mit 2013) – manuelles hinzufügen hilft.

    Bin jetzt gespannt wie gut die automatische Erneuerung klappen wird.

    Gruß Axel

  23. Let’s encrypt für die Sophos SG steht für die 9.6 au der Roadmap. Ich denke mit der 9.6 dürfte aber eher im Q4 zu rechnen sein. Für die XG kann ich nur mutmaßen, hoffe aber das es auch angeplant ist. Derzeit ist Sophos ja sehr bemüht das funktionale Delta zwischen XG und SG aufzuheben und die XG entsprechend zu erweitern. Anschließend wird es wohl eine XG first Strategie.

  24. Kann ich das Script auch mit einem bereits eingerichteten LetsEncrypt Zertifikat, zwecks Auto Renewal?

  25. Zitat:“
    Hi Thomas,
    „Resolve-DnsName master.xyz.com -Server 8.8.8.8 -ea 0“ löst den DNS Namen via Google DNS Server auf, wenn du hier interne IP Adressen bekommst, liegt entweder ein Problem an deiner DNS Konfiguration vor und die spätere Validierung von Let’s Encrypt schlägt fehl, oder ein Gerät in deinem Netz schreibt die Antwort des Google DNS um.
    Gruß, Frank“

    Das scheint so nicht ganz zu stimmen. Konnte das Verhalten nachvollziehen unter folgender Bedingung (Hostnamen sind nur Beispiele)

    Der Exchange hat als Hostname im LAN ex01.hh.test-domain.de was gleich der Name welcher aufgelöst werden soll ist. Passiert offenbar wenn man die internen URLs = dem Hostnamen gewählt hat.
    mit der Originalzeile des Scripts:
    „$DNSIP = (Resolve-DnsName $CertName -Server 8.8.8.8 -ea 0).IPAddress“

    wird aber scheinbar der DNS Cache des Servers bemüht und es wird die interne LAN IP aufgelöst.

    Habe die Zeile angepasst und dann klappt es:
    $DNSIP = (Resolve-DnsName $CertName -Server 8.8.8.8 -DnsOnly -ea 0).IPAddress

    Hoffe das hilft.

    Zu besagter Zeile habe ich noch eine Frage. Was macht das -ea 0 ??? Kenne mich mit Powershell nur wenig aus.

    Gruß Axel

  26. Hi Axel,

    stimmt, ohne den Parameter -DnsOnly wird der DNS Cache verwendet, was zu dem Problem führen kann. Vielen Dank für den Hinweis.
    Zu deiner Frage: -ea 0 ist die Abkürzung für -ErrorAction SilentlyContinue (welches Fehlermeldungen unterdrückt)

    Gruß, Frank

  27. Hi Peter,
    das müsstest du bitte einmal ausprobieren. Ich habe das bisher nicht getestet, aber es sollte funktionieren. Gruß, Frank

  28. Hallo zusammen,
    das Problem mit der angeblich nicht aufzulösenden IP-Adresse hatte ich auch. Im script habe ich dann die Zeile 208
    $DNSIP = (Resolve-DnsName $CertName -Server 8.8.8.8 -ea 0).IPAddress
    geändert in
    $DNSIP = (Resolve-DnsName $CertName -Server 8.8.8.8 -ea 0).IP4Address
    Bei mir ist jedoch auch ipV6 aktiv, so dass die Abfrage eine Antwort auf IP6Address und IP4Address liefert, jedoch keine IPAdress ohne 4 oder 6.
    Jetzt läuft es einwandfrei.
    Gruß
    Torsten

  29. Zum Problem, dass Autodiscovery nicht mit für das Zertifikat erkannt wird:

    Ich habe die Zeile

    [array]$CertNames += ((Get-ClientAccessService -Identity $ExchangeServer).AutoDiscoverServiceInternalUri.Host).ToLower()

    in

    [array]$CertNames += ((Get-ClientAccessServer -Identity $ExchangeServer).AutoDiscoverServiceInternalUri.Host).ToLower()

    geändert (Exchange 2010). Dann wird auch die Autodiscovery URL mit erkannt.

  30. Der Import des Zertifikats funktioniert im Exchange 2010 leider auch nicht wie im Script angegeben.

    Ich habe deshalb für Exchange 2010 die Zeile

    Import-ExchangeCertificate -FileName $CertPath -FriendlyName $ExchangeSubject -Password $ImportPassword -PrivateKeyExportable:$true | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, IIS“ –force

    durch

    Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path $CertPath -Encoding byte -ReadCount 0)) -FriendlyName $ExchangeSubject -Password $ImportPassword -PrivateKeyExportable:$true | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, IIS“ -force

    ersetzt.

    Damit funktioniert der Zertifikatsimport im Exchange 2010.

  31. Ich habe jetzt eine fertig angepasste Version für Exchange 2010.

    Kann ich dir die evtl irgendwie zukommen lassen?

    Die hauptsächlichen Änderungen waren die beiden oben genannten. Ob die Verlängerung funktioniert sehe ich 4 Tage vor Zertifikatsablauf.

    Müsste aber. Werden ja die gleichen Befehle verwendet.

  32. Die Anpassung, um das Autodiscovery mit zu erkennen funktioniert auch mit Exchange 2013.

  33. Inzwischen konnte ich das Script einmal gegen einen Windows Server 2012R2 und Exchange 2013 testen.
    Hierbei sind keine großartigen Änderungen am Script gegenüber dem Exchange 2016 notwendig. (anders als beim Exchange 2010)
    Nur die abgefragten Pfade müssen geändert werden.

    Mir sind allerdings folgende Probleme aufgefallen:

    1. Zur Ausführung des Scripts ist das Management Framework 5.0 erforderlich. Sobald ich dieses allerdings auf einem Windows Server 2012 R2 mit Exchange 2013 installiere, kann ich keine Management Shell mehr aufrufen bzw. diese nicht mehr mit dem Exchange verbinden. Deinstalliere ich das Framework 5.0 geht das wieder aber das Script kann nicht mehr ausgeführt werden, da das ACME-Modul nicht mehr gefunden wird und nicht installiert werden kann.

    2. Bei der Validierung der DNS-Namen erhalte ich in dieser Konstellation eine Fehlermeldung (Variable $error kann nicht überschrieben werden. Entweder ist die Schreibgeschützt oder eine Konstante)
    Das hat zwar keine Auswirkung auf das Script, ist dennoch seltsam und etwas unschön.

    Ansonsten läuft das Script aber prinzipiell durch. Auch der Import des Zertifikats funktioniert.

  34. Hallo Bjoern,

    danke für deine Feedbacks, welche ich hier auch gerne bestätigen kann. Ich hatte mich zwar bisher noch nicht an den Zertifikatsassistenten getraut, jedoch die manuelle Methode aus dem Beitrag von Januar auf zahlreiche Server (2010, 2012R2, 2013) angewendet. Auch ich hatte dort ein paar Änderungen vorgenommen, welche sich zu großen Teilen mit deinen decken. Du findest sie in meinem Kommentar zur manuellen Anleitung.

    Deine Erfahrungen mit dem WMF5 kann ich auch bestätigen, dies ist übrigens schon ein Problem wenn unter Exchange 2010 noch kein Service Pack installiert war, aber das WMF, dann kann man das SP nicht installieren, da ein Authentifizierungsfehler auftritt. Also wieder deinstallieren, alle SP & UR/CU installieren und erst dann WMF5 installieren. Die Inkompatibilität von WMF5 wird übrigens auch auf einer KB-Seite von Microsoft in einer Matrix erwähnt.

    Übrigens muss für Exchange 2010 mindestens SP1 (evtl. sogar höher) installiert sein, da erst ab dann die CMDlets zum Import des Zertifikats funktionieren.

    Somit wäre es sinnvoll das Skript soweit zu erweitern, dass einerseits die Exchange-Version (<2016 vs 2016) überprüft wird und andererseits dazu auffordert erst alle Updates zu installieren (insbesondere im Fall von Exchange 2010) und WMF5 im Anschluss zu installieren. Letzteres am Besten mit Angabe des Downloadlinks von http://www.powershellgallery.com

    Kannst du dein modifiziertes Skript mal irgendwo posten (bspw. PasteBin)? Ggfs. finde ich nächste Woche die Zeit die Änderungen dort einzupflegen. Ich persönlich würde sogar ein GitHub-Projekt bevorzugen, jedoch muss damit auch Frank einverstanden sein.

    Liebe Grüße,

    Alex

  35. Hallo Alex,

    das Script habe ich Frank bereits zur Verfügung gestellt.
    Ich habe es dahingehend auch noch einmal angepasst, dass aktuell zumindest einmal zwischen Exchange 2010 und Exchange2013/2016 unterschieden und die entsprechenden Verzeichnisse abgefragt und der passende Import-Befehl verwendet wird.

    Vlt. kann er dir das angepasste Script einmal zukommen lassen.
    Dann könnte man das Script natürlich um weitere Abhängigkeitsprüfungen erweitern.

    Schöne Grüße

    Björn

  36. Hi Franky,

    gibt’s schon was neues in Punkto Exchange 2013 Test ? Weißt du schon mehr ob das Script auch mit dem 2013er funktioniert ?
    Vielen Dank für deine super Beiträge !

    Beste Grüße

  37. Hi Gerald,
    vielen Dank für das Lob. Ich habe bisher 4 Rückmeldungen erhalten, dass es auch mit Exchange 2013 auf Windows Server 2012 R2 funktioniert. Es sind kleinere Anpassungen nötig und es gibt demnächst eine neue Version.
    Gruß, Frank

  38. Hallo Franky,
    Ich kann mich Gerald nur anschliessen…herzlichen Dank für die hervorragenden Beiträge!
    Ich habe Schwierigkeiten mit dem Script. (Server2016 mit Exchange 2016)
    Zunächst bei der Installation des ACME Powershellmoduls: Es gibt eine Fehlermeldung, dass das Get-Certificate commandlet schon existiert.(https://github.com/ebekker/ACMESharp/wiki/FAQ)
    Daher habe ich Dein script modifiziert:
    Zeile38 Install-Module -Name ACMESharp -AllowClobber
    Zeile39 Import-Module ACMESharp -ea 0 -Prefix ACME
    Dann erhalte ich aber Fehler. Hast Du eine Idee warum?:
    Herzlichen Dank
    MIchael

    Lese Exchange Konfiguration…
    WARNUNG: Das Cmdlet „Get-ClientAccessServer“ wird in einer künftigen Version von Exchange entfernt. Verwenden Sie stattdessen das Cmdlet „Get-ClientA
    ccessService“. Wenn in Skripts das Cmdlet „Get-ClientAccessServer“ verwendet wird, aktualisieren Sie die Skripts, sodass sie das Cmdlet „Get-ClientAcc
    essService“ verwenden. Weitere Informationen finden Sie unter „http://go.microsoft.com/fwlink/p/?LinkId=254711“.
    Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In C:\Users\ExchangeAdmin\Downloads\CertificateAssistant.ps1:93 Zeichen:4
    + [array]$CertNames += ((Get-OutlookAnywhere -Server $ExchangeServer …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In C:\Users\ExchangeAdmin\Downloads\CertificateAssistant.ps1:95 Zeichen:4
    + [array]$CertNames += ((Get-OabVirtualDirectory -Server $ExchangeSe …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In C:\Users\ExchangeAdmin\Downloads\CertificateAssistant.ps1:97 Zeichen:4
    + [array]$CertNames += ((Get-ActiveSyncVirtualDirectory -Server $Exc …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In C:\Users\ExchangeAdmin\Downloads\CertificateAssistant.ps1:99 Zeichen:4
    + [array]$CertNames += ((Get-WebServicesVirtualDirectory -Server $Ex …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

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

  39. Hallo Franky
    habe den Grund der Fehler ermittelt. NIcht komplette Konfiguration…..
    Sorry

  40. Hallo,

    erstmal vielen Dank für das tolle Script
    Leider erhalte ich am Ende immer die folgenden Meldung:

    Fehler: Validierung für Alias Cert19052017-1 fehlgeschlagen

    Woran könnte das liegen?

    Viele Grüße
    Volker

  41. Ich habe da irgendwie ein kleines Problem…

    Der Exchange 2016 ist hinter einer IPFire Firewall. Im IPFire sind Aliasnamen für die jeweiligen IP/DNS Adressen eingerichtet. Hinter der IPFire sind mehrere Server. Alles andere (andere Dienste usw) funktionieren.
    Wenn ich nun eine DNS Abfrage auf die Adresse des Echange mache kommt die richtige IP dabei raus.
    Die IP/DNS Überprüfung beim Assistenten ergibt hier jedoch eine andere, nämlich die der IPFire.

    Richtig ist: mail.xxxx.de 123.123.123.123
    Falsch ist (die der IPFIre): mail.xxxx.de 456.456.456.456

    Es bricht mir der Assistent nach dem Anlegen des Task ab aufgrund der Fehlerprüfung der DNS Auflösung.
    Wie kann ich das umgehen?

  42. Schnelle Lösung von mir:
    Ich habe den Teil bezüglich der DNS Überprüfung auskommentiert, somit ging es nun fehlerfrei.
    Warum nun der Google DNS und auch andere DNS Server (Hetzner) ein Problem damit haben ist mir noch nicht ganz klar. Evtl. Liegts an der Routine zur Überrpüfung?
    Vielleicht gibt es eine simple Lösung, bzw. Erklärung woran es liegt.

  43. Hi Franky, du hast vor einem Monat geschrieben, dass es demnächst eine neue Version geben wird mit noch kleineren Anpassungen für Exchange 2013.
    Sind diese Anpassungen in die aktuell downloadbare Version schon eingeflossen ?
    Wird es noch eine neue Version geben, oder funktioniert mit der aktuellen alles ohne Probleme mit Exchange 2013 ?

    Beste Grüße
    Gerald

  44. Hi Gerald,
    die Version ist noch aktuell, ich habe es bisher nicht auf Exchange 2013 getestet, allerdings mehrere Mails erhalten, dass es auch bei Exchange 2013 problemlos funktioniert.
    Gruß, Frank

  45. Thanks for the posting and would love an English script is you have those skills?

    Question: The script works of the host names. We have multiple domains and would need SAN certificates for entries like: autodiscover.domain1.com and autodiscover.domain2.com

    It is possible to set the Exchange host names to have multiple names so that this script will pick them all up?

    If so, do you know the format of the settings? we tried: domain.com;domain.com and domain.com,domain.com But can’t think what else it may be?

  46. Vielen Dank erstmal für die Arbeit, habe es eben auf einem Server 2016 + Exchange 2016 ausprobiert. Bei mir klappt es nur bis zur Validierung, da kommt der erste Fehler:
    New-ACMEIdentifier : Error creating new authz :: Name does not end in a public suffix
    In C:\Users\Administrator\Documents\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (ACMESharp.Vault.Model.IdentifierInfo:IdentifierInfo) [New-ACMEI
    AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:malformed (400),ACMESharp.POSH.NewIdentifier
    Validierung vorbereiten:
    Alias Cert08062017-3
    Complete-ACMEChallenge : Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
    In C:\Users\Administrator\Documents\CertificateAssistant.ps1:273 Zeichen:20
    + … lidateReq = Complete-ACMEChallenge $ACMEAlias -ChallengeType http-01 …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Complete-ACMEChallenge], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.CompleteChalle

    Let’s Encrypt kann natürlich die lokale Adresse nicht auflösen, jedoch kommt bei den von außen erreichbaren URLs folgender Fehler wie oben:

    Submit-ACMEChallenge : Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
    In C:\Users\Administrator\Documents\CertificateAssistant.ps1:297 Zeichen:17
    + … $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMEChallenge], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.SubmitChalleng

    Die Validierung ist dann aber ok aber das Zertifikat wird nicht erstellt:

    New-ACMECertificate : Der angegebene Schlüssel war nicht im Wörterbuch angegeben.
    In C:\Users\Administrator\Documents\CertificateAssistant.ps1:323 Zeichen:14
    + … $NewCert = New-ACMECertificate $SubjectAlias -Generate -AlternativeI …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-ACMECertificate], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.NewCertificate

    Submit-ACMECertificate : No certificates found
    In C:\Users\Administrator\Documents\CertificateAssistant.ps1:324 Zeichen:20
    + $SubmitNewCert = Submit-ACMECertificate $SANAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMECertificate], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.SubmitCertificate

    Hat jemand dasselbe Problem bzw. eine Lösung parat? Danke

  47. Hallo Frank,

    Vielen Dankt für das Skript. Bei mir funktionier bis zum Punkt, prüfen ob die DNS-Namen validiert wurde sind alles wunderbar, nur leider dies nicht Gibt es i.wo Logs zum herauszufinden warum die Prüfung fehlschlägt?

    Gruß
    Moritz

    —————————————————————————
    Alle Informationen sind vorhanden, soll das Zertifikat konfiguriert werden?
    —————————————————————————

    Konfiguration starten? (Enter für Weiter / STRG+C zum Abbrechen:

    Prüfe ob bereits ein Vault existiert…
    Prüfe Let’s Encrypt Registrierung…
    Neuer Identifier:
    DNS: hoex01dc1msg01.hoex01.coseon.com
    Alias: Cert14062017-1
    New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
    In C:\ssl\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-ACMEIdentifier], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,ACMESharp.POSH.NewIdentifier

    Validierung vorbereiten:
    Alias Cert14062017-1
    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert14062017-1
    Submit-ACMEChallenge : challenge has not been decoded
    In C:\ssl\CertificateAssistant.ps1:297 Zeichen:17
    + … $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMEChallenge], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.SubmitChallenge

    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert14062017-1
    Fehler: Validierung für Alias Cert14062017-1 fehlgeschlagen
    PS C:\ssl>

  48. Hallo Franky – hallo @ll,

    eine super Anleitung – eigentlich hat alles geklappt… aber nach dem ich fertig war, hatte ich einen OWA Redirect Loop

    Wenn ich die alten Zertifikate wieder an die Dienste binde, ist alles wieder schön….

    Hatte jemand dieses Verhalten schon mal ?

    Viele Grüße Jens

  49. Ich habe das gleiche Problem wie Volker.
    Das Script geht ohne Fehler bis:
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert22062017-1
    Validierung durchführen: Cert22062017-2
    Validierung durchführen: Cert22062017-3
    Validierung durchführen: Cert22062017-4
    Validierung durchführen: Cert22062017-5
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert22062017-1
    Fehler: Validierung für Alias Cert22062017-1 fehlgeschlagen

    Hab schon mehrmals die automatisch erstellen Files auf dem Webserver im acme-challenge gelöscht sowie das sysVault Verzeichnis im C:\ProgramData\ACMESharp und das Script neu gestartet.
    komme immer wieder an gleicher Stelle zum stehen. Mein System (Win2012R2 mit Exch2013 & Powershell 5.0)

  50. Moin. Erstmal vielen Dank für die Mühe.
    Das macht es doch einfacher :)

    Was mir aufgefallen ist, nur am Rande, du nimmst beim Exchange 2016 noch den Befehl Get-ClientAccessServer.
    Er warnt halt, das der Befehl nicht mehr der aktuelle ist.

    BTW: Ich hänge auch hinter der WAF. Hier habe ich mir eine NAT Regel eingerichtet und diese Schalte ich bei Bedarf kurz ein und dann wieder aus. Ist zwar ein Schritt mehr, aber leider nicht anders Regelbar.

    PS: Ich habe nicht alle Kommentare gelesen.

  51. Hallo,
    es funktioniert soweit, aber nach den Import in Exchange 2016 gibt es kein Anzeigename.
    Ich weiß nicht ob es damit zusammenhängt, aber mein Thunderbird was per IMAP zugreift,
    bekommt kurz eine Verbindung, die gleich wieder beendet wird (telnet dito)
    Ich habe nur 1 DNS Namen (remote.xxx.de)

  52. Hi Frank,

    leider funktioniert die Installation mit Server 2016 und Exchange 2016 nicht korrekt. Fehlermeldung andauernd nur mit allowClobber wegen doppeltem get-certificate. Hast du einen Tipp, wie dies zu lösen ist?

    Danke im Voraus

  53. Hi Chris,

    du kannst das ACMESharp Modul separat mit installieren:

    Install-Module -Name ACMESharp -AllowClobber

    Gruß, Frank

  54. Hallo,
    super Script. Kürzlich wurde die erste Erneuerung durchgeführt. In meinem Exchange 2016 ECP wird nun angezeigt, dass das Zertifikat abgelaufen ist und damit ist das alte gemeint. Sollte dies nicht automatisch entfernt werden? Es läuft offensichtlich alles mit dem neuen, aber dennoch stört mich der Hinweis und das noch aufgeführte abgelaufene Zertifikat.

  55. Hi,
    das Script löscht die alten Zertifikate nicht, das wäre ein Punkt für das nächste Update :-)
    Danke für den Hinweis.
    Gruß,
    Frank

  56. Hallo Franky,

    ich hab das Script soweit erfolgreich auf einem Server2012R mit EXS13 eingerichtet.
    Beim ersten Testlauf war allerdings noch nicht der Port 80 am Router weitergeleitet.

    Nun kommt bei jeden Lauf des Script ein Fehler und die Zertifikate sind nicht vorhanden.
    Wie bekommt man das nun zum Laufen?

    —————————————————————————
    Alle Informationen sind vorhanden, soll das Zertifikat konfiguriert werden?
    —————————————————————————

    Konfiguration starten? (Enter für Weiter / STRG+C zum Abbrechen:

    Prüfe ob bereits ein Vault existiert…
    Prüfe Let’s Encrypt Registrierung…
    Neuer Identifier:
    DNS: autodiscover.domain.de
    Alias: Cert04072017-1
    New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
    In C:\BF\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-ACMEIdentifier], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,ACMESharp.POSH.NewIdentifier

    Validierung vorbereiten:
    Alias Cert04072017-1
    Neuer Identifier:
    DNS: mail.domain.de
    Alias: Cert04072017-2
    New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
    In C:\BF\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-ACMEIdentifier], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,ACMESharp.POSH.NewIdentifier

    Validierung vorbereiten:
    Alias Cert04072017-2
    Neuer Identifier:
    DNS: sf-exs-01.domain.de
    Alias: Cert04072017-3
    New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
    In C:\BF\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-ACMEIdentifier], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,ACMESharp.POSH.NewIdentifier

    Validierung vorbereiten:
    Alias Cert04072017-3
    Neuer Identifier:
    DNS: remote.domain.de
    Alias: Cert04072017-4
    New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
    In C:\BF\CertificateAssistant.ps1:270 Zeichen:14
    + $NewID = New-ACMEIdentifier -Dns $ExchangeSAN -Alias $ACMEAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [New-ACMEIdentifier], ArgumentException
    + FullyQualifiedErrorId : System.ArgumentException,ACMESharp.POSH.NewIdentifier

    Validierung vorbereiten:
    Alias Cert04072017-4
    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert04072017-1
    Submit-ACMEChallenge : challenge has not been decoded
    In C:\BF\CertificateAssistant.ps1:297 Zeichen:17
    + $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMEChallenge], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.SubmitChallenge

    Validierung durchführen: Cert04072017-2
    Submit-ACMEChallenge : Unable to update challenge :: The challenge is not pending.
    In C:\BF\CertificateAssistant.ps1:297 Zeichen:17
    + $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (ACMESharp.Vault.Model.IdentifierInfo:IdentifierInfo) [Submit-ACMEChallenge
    ], AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:malformed (400),ACMESharp.POSH.SubmitChallenge
    Validierung durchführen: Cert04072017-3
    Submit-ACMEChallenge : Unable to update challenge :: The challenge is not pending.
    In C:\BF\CertificateAssistant.ps1:297 Zeichen:17
    + $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (ACMESharp.Vault.Model.IdentifierInfo:IdentifierInfo) [Submit-ACMEChallenge
    ], AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:malformed (400),ACMESharp.POSH.SubmitChallenge
    Validierung durchführen: Cert04072017-4
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert04072017-1
    Fehler: Validierung für Alias Cert04072017-1 fehlgeschlagen

  57. Bei mir kommt bei jedem start die Abfrage ob weitere DNS Namen, E-Mail Adresse, automatische Erneuerung, Windows Credentials und ob die Konfiguration gestartet werden soll.

    Wie wird das in der Aufgabenplanung umgangen?

    Mfg
    Stephan

  58. Ich habe auf einem Exchange Server auch noch weitere Virtualdirectorys,
    wenn ich dazu auch noch passende DNS Namen registrieren möchte kommt folgende Meldung:

    New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.
    In C:\ssl\CertificateAssistant.ps1:270 Zeichen:14

    Die Websites habe ich auch über Port 80 von außerhalb erreichbar gemacht.
    Hast du eine Idee, woran dies liegen kann?

  59. Ich bekomme mit Windows-Server 2012r2 leider folgende Fehlermeldung:

    ***
    Lade ACMESharp Modul…
    Warnung: ACME Sharp Module nicht gefunden
    Versuche ACMESharp Modul zu installieren…
    Install-Module : Die Benennung „Install-Module“ wurde nicht als Name eines Cmdlet, einer Funktion, einer Skriptdatei
    oder eines ausführbaren Programms erkannt. Überprüfen Sie die Schreibweise des Namens, oder ob der Pfad korrekt ist
    (sofern enthalten), und wiederholen Sie den Vorgang.
    In C:\Temp\CertificateAssistant.ps1:38 Zeichen:4
    + Install-Module -Name ACMESharp
    + ~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (Install-Module:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

    Fehler: ACME Sharp Modul konnte nicht installiert werden

    ***

    Was kann ich tun?

    Viele Grüße
    Fabian

  60. Fabian,

    wenn du Server2012R2 hast, dann solltest du nicht unbedingt die Powershell 5 installieren.
    Installier lieber die PowerShell Gallery ( https://www.powershellgallery.com ) und anschließend kannst du mit dem Script auch das ACME Modul installieren lassen.

    LG Bernd

  61. Hallo Franky,

    das Script läuft nun bei mir einwandfrei unter Server 2012R2 und Exchange 2013.

    Eine Frage hab ich aber noch: Hast du geplant das Script auf tls-sni-01 umzustellen, sodass man Port 443 statt Port 80 nehmen kann? So müsste nicht Port 80 von Extern offen sein.
    Oder hatte es bestimmte Gründe das du dich für http-01 entschieden hast?

    LG Bernd

  62. Hi Bernd,
    ich plane das Script zu überarbeiten, dabei werde ich auch tls-sni-01 berücksichtigen.
    Gruß, Frank

  63. Da die Frage immer wieder kommt, weshalb der Fehler „New-ACMEIdentifier : Ein Element mit dem gleichen Schlüssel wurde bereits hinzugefügt.“ auftaucht hier ein kurzer „Workaround“, welcher sich jedem der sich den Code des Skripts kurz angesehen hat schnell einfallen sollte.

    Das Skript erstellt Identifier, welche für das lokale System einmalig sein müssen und zur eindeutigen Zuordnung der Zertifikatsabfrage an die Let’s Encrypt Server verwendet werden. Frank hat dabei das folgende Format gewählt „Cert“ + Tag + Monat + Jahr + „-“ + DomainName. Hat man bereits einmal das Skript am selben Tag ausgeführt, so tritt natürlich bei der zweiten Ausführung der besagte Fehler auf. Ich behelfe mir hierbei dabei, dass ich das Format noch um Stunde und Minute erweitere. Hierzu einfach das Skript öffnen und nach dem ersten vorkommen von „Alias“ suchen. In dieser Zeile an das Ende von ddMMyyyy noch ein hhmm hinzufügen: ddMMyyyyhhmm. Danach geht es. Sobald eure anfängliche Generierung erfolgreich war solltet ihr dies wieder entfernen, bspw. bei der automatischen Erneuerung verwendet das Skript noch an anderer Stelle das Format ohne Stunde und Minute, ihr könnt dies natürlich aber auch an entsprechender Stelle anpassen. Viel Erfolg!

  64. Meine Probleme mit den CNAMES bzw. weiteren Websites auf dem IIS habe ich gelöst, indem ich aus dem inetpub\wwwroot\ Ordner harte Verknüpfungen in den anderen Websites auf .well-kown gelegt habe.

    Damit kann man dann mehrere Websites mit den Zertifikaten versehen und diese bekommen dann automatisch das Let’s Encrypt Zertifikat zugewiesen.

  65. hi,

    anscheinend wurde aus dem ACME Plugin der IIS Teil entfernt, dadurch funktioniert das Complete-ACMEChallenge nicht mehr.

    Validierung vorbereiten:
    Alias Cert09082017-1
    Complete-ACMEChallenge : the given identifier was not found in the registry
    At C:\CertificateAssistant\CertificateAssistant.ps1:273 char:20
    + … lidateReq = Complete-ACMEChallenge $ACMEAlias -ChallengeType http-01 …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Complete-ACMEChallenge], KeyNotFoundException
    + FullyQualifiedErrorId : System.Collections.Generic.KeyNotFoundException,ACMESharp.POSH.CompleteChallenge

    sg Philipp

  66. Da in der aktuellen ACMESHarp Version (0.8.5.313) die IIS Handler teilweise nicht funktionieren, hilft es die Version 0.8.1 manuell zu installieren:
    Install-Module -Name ACMESharp -RequiredVersion 0.8.1 -AllowClobber
    Eine eventuell schon vorhandene neuere Version mit
    Uninstall-Module ACMESharp
    deinstallieren.

    Bug Report zum IIS Handler:
    https://github.com/ebekker/ACMESharp/issues/245

  67. In meiner Windows 2016 / Exchange 2016 Umgebung hat das Skript auf anhieb funktioniert, perfekt.
    Einmal noch auf ie Firewall kopieren – fertig.

    Vielen Dank dafür Frank!

  68. Hab das gleiche Problem wie Reto und Volker,

    wie habt Ihr das gelöst ?
    Danke für Rückmeldung
    Grüße
    Sunny

  69. Hallo,

    bei schlägt bei Update Alias immer die Validierung für die interne Adresse fehl:

    —————————————————————————
    Alle Informationen sind vorhanden, soll das Zertifikat konfiguriert werden?
    —————————————————————————

    Konfiguration starten? (Enter für Weiter / STRG+C zum Abbrechen:

    Prüfe ob bereits ein Vault existiert…
    Prüfe Let’s Encrypt Registrierung…
    Neuer Identifier:
    DNS: autodiscover.web.de
    Alias: Cert290820170843-1
    Validierung vorbereiten:
    Alias Cert290820170843-1
    Neuer Identifier:
    DNS: mail.web.de
    Alias: Cert290820170843-2
    Validierung vorbereiten:
    Alias Cert290820170843-2
    Neuer Identifier:
    DNS: mail.int.web.de
    Alias: Cert290820170843-3
    Validierung vorbereiten:
    Alias Cert290820170843-3
    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert290820170843-1
    Validierung durchführen: Cert290820170843-2
    Validierung durchführen: Cert290820170843-3
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert290820170843-1
    Validierung OK
    Update Alias: Cert290820170843-2
    Validierung OK
    Update Alias: Cert290820170843-3
    Fehler: Validierung für Alias Cert290820170843-3 fehlgeschlagen

    Kann mir jemand sagen warum?

    Gruß
    Torsten

  70. Hallo,

    mir ist das vorgehen auf einem 2008 R2 Server und Exchange 2013 noch nicht ganz klar, das script benötigt WMF5, dann funktioniert aber die Management Konsole von Exchange 2013 nicht mehr.
    Was muss ich jetzt genau machen?

    Gruß
    Torsten

  71. Hi,

    in welchem Turnus müsste das Skript die Zertifikate denn automatisch aktualisieren (ich stehe in 27 Tagen davor, dachte allerdings <30 wird bei Letsencrypt aktualisiert?). Oder muss dafür das Skript angepasst werden?

    Umgebung S2016/EX2016.

    Danke im Voraus,

    VG,

    Chris

  72. Hallo
    @Torsten: Hab das gleiche Problem des Validierungsfehlers… Welchen Schritt hast du überlesen? vieleicht hilfts mir ja auch :-) Besten Dank!!

  73. Danke Stephan, bin dem Problem auf der Spur.
    Port 80 ist offen, hab jedoch bemerkt, dass ich über einen externen Zugriff nichts im Verzeichnis acme-challenge lesen kann, sprich die generierte Textdatei nicht aufgerufen werden kann. Benenne ich das Verzeichnis acme-challenge in z.B. acme-challengeold um dann funktioniert der Zugriff.
    Habt jemand eine Idee?

  74. Schau mal im IIS auf dem Challenge Verzeichnis, ob der ein SSL aktiv ist oder nicht. Wird je nach Einstellung vererbt.

  75. Bin der Lösung schon näher:
    @Stephan: Danke für den Tip: Auf der Default Web Site hab ich den SSL aktiviert, jedoch im acme-challenge Verzeichnis (im IIS) ist das SSL deaktiviert.
    Hab nun folgendes festgestellt:
    Blockiert wird der Zugriff in das acme-challenge Verzeichnis, weil dort eine Datei web.config liegt. wird diese gelöscht funktioniert der Zugriff und damit der Abruf der textdateien wieder.
    Das Problem: Die web.config wird während der Laufzeit des CertificateAssistant.ps1 Scripts erstellt. Lösche ich die Datei web.config nachdem meine 5 Domainnamen durch sind und bevor es zur Validierung kommt, läuft das script weiter und ein Zertifikat wird erstellt und ‚teils‘ installiert.
    Leider bricht dann das Script wegen eines weiteren Fehlers ab: beim Enable-ExchangeCertificate kann er das Zertifikat nicht allen Diensten zuordnen. Manuelles Zuordnen des Zertifikates in den Bindungen (IIS) geht dann wieder.
    Trotzdem bleiben für mich ungeklärte Fragen:
    – Warum wird ein web.config automatisch erstellt? Und wie kann dies deaktiviert werden?
    – Warum kann das neue Zertifikat nicht automatisch allen Diensten SMTP, IMAP, POP und IIS zugeordnet werden?

  76. 5 Domänennamen? Zeigen die alle auf die selbe Webseite?
    Ich habe noch mehrere cnames. Da habe ich hardlinks zum challenge ordner erstellt, dann ging es bei mir.

  77. Nein auf der Exchangemaschine läuft nur der Exchange im IIS mit zwei Domainnamen.
    webmail.domain1.com
    autodiscover.domain1.com
    autodiscover.domain2.com
    Exchange.domain1.com
    mail.domain1.com

    Das Zertifikt so läuft ja, halt über die manuelle Erstellung über https://www.sslforfree.com/ und da wird ja auch das ACME Tool benötigt und ins gleiche .well-known\acme-challenge Verzeichnis gelegt.
    Möchte dies nun halt automatisieren steh aber noch irgendwie auf dem Schlauch…
    Deshalb:
    – wo und warum wird dieses web.config im Script erstellt?
    – und warum kann bei mir das neue Zertifikat nicht allen Diensten zugleich zugeordnet werden? (ist im Script ja so vorkonfiguriert)

  78. Franky hat doch in so geniales Script geschrieben.
    Da kommen doch Meldungen was nicht funktioniert.
    Poste doch mal die Fehler.

  79. Nun, das Script ist sicher genial und dafür Danke ich ihm auch!
    Trotzdem hab ichs noch nicht fertig zum laufen gebracht.
    Der gleiche Fehler hat Torsten am 29. August 2017 um 08:49 gepostet (weiter oben). muss ihn ja nicht mehr reinkopieren. Und der Hinweis auf den Port 80 (nach der Meldung) hat mich dann auf den Umstand gebracht, dass ich in nur dieses eine Verzeichnis acme-challenge über Port 80 keinen Zugriff hatte. Und nach langer Sonntagsarbeit bemerkt, dass dieses durch das dortige web.config File gesperrt wird. Einfach Löschen bringt nichts, da dieses während des Scriptes erstellt wird. Also komm ich nun zur Frage: Wie kann ich das automatische Erstellen dieses Files stoppen… :)
    Denn wenn das File nicht im Verzeichnis ist (löschung der Datei während des Scriptsablaufes) können die LetsEnscript Validierungen durchgeführt und das Script erstellt werden… (sogar bei meiner Maschine…)

  80. Es liegt definitiv nicht an der web.config, die gehört da rein.

    Dann kann er einen Domänennamen nicht auf das IIS Verzeichnis auflösen, wenn das der selbe Fehler ist.

  81. Das leuchtet mir nicht ein. Hab gerade nochmals einen Versuch gestartet:
    Während dem Scriptablauf nach der Meldung: ‚Umstellung auf HTTP erfolgreich‘ hab ich die Datei web.config im Verzeichnis acme-challenge gelöscht und siehe da ALLE Validerungen liefen ohne Fehlermeldungen durch, das Zertifikat wird erstellt und diesmal sogar korrekt im IIS installiert. (Script ohne Fehlermeldung abgelaufen). Geht aber nur wenn ich die web.config die erstellt wird im richtigen Moment lösche…
    Das hat doch mit dem Verzeichniszugriff zu tun und nicht mit der Namensauflösung?

  82. Wenn es dann geht, muss irgendwas in deinen IIS EInstellungen nicht passen, die den Zugriff in Verbindung mit der Configdateie verhindert.

  83. Gelöst: @Stephan Danke!
    Das Problem lag an der offenbar doppelten MIME Registration des ‚.‘ zu text/plain.
    In meinem IIS war in den MIME-Typ Erweiterung bereits der Eintrag zu ‚.‘ text/plain vorhanden (neben ganz vielen anderen… Das Löschen im Verzeichnis acme-challenge ging nicht da dieser Vererbt war von der Hauptebene aus ‚Default-Web-Site‘. Das Entfernen dieser MIME-Typ Registration ‚.‘ in dieser Ebene lässt danach den Zugriff auf das acme-challenge Verzeichnis trotz web.config Files zu.
    Das Script kann nun ohne ‚Dazwischenfunken durch mich‘ erfolgreich abgeschlossen werden.
    Hoffe nur das das Löschen des Eintrages keine Auswirkungen auf sonst eine Seite hat :-)

  84. Erst mal vielen Dank für dieses tolle Script, es funktioniert auch einwandfrei.

    Allerdings erhalte ich bei mehreren Windows SBS2011 Servern (Exchange2010, Win2008R2) folgende Fehlermeldung:

    ————————————————————————————————-
    Get-ChildItem : Fehler beim Auflisten der SSL-Bindungen. Fehlercode: 234.
    In C:\CertificateAssistant.ps1:373 Zeichen:29
    + $CurrentCertThumbprint = (Get-ChildItem -Path IIS:SSLBindings | where {$_.port …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Get-ChildItem], ProviderException
    + FullyQualifiedErrorId : Microsoft.IIs.PowerShell.Framework.ProviderException,Microsoft.PowerShell.Commands.GetCh
    ildItemCommand

    Aktivierung ist fehlgeschlagen
    ————————————————————————————————-

    Die Aktivierung und die Zuweisung funktioniert allerdings einwandfrei.

  85. @Reto
    Ich bekomme ebenfalls die selbe Fehlermeldung wie du (Validierung für Alias Cert210920170344-1 fehlgeschlagen).

    Deine Lösung bezüglich MIME Registration des ‚.‘ zu text/plain und übernahme von Default Web Site verstehe ich allerdings nicht. Kannst du hier noch ein paar mehr Angaben geben? Bzw, WO genau das ‚.‘ zu text/plain zu entfernen ist… sollte es dann am gleichen liegen. Danke.

  86. Wir haben ebenfalls SRV 2012 und Ex2013 im Einsatz. Aber eben, bei mir kommt noch Fehler „Validierung für Alias Cert210920170344-1 fehlgeschlagen“… Jemand eine Idee, wo es klemmt?

  87. Server 2012R2 + Exchange 2013 CU17.

    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert161020171149-1
    Submit-ACMEChallenge : challenge has not been decoded
    In C:\Cer\CertificateAssistant.ps1:297 Zeichen:17
    + … $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMEChallenge], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.SubmitChallenge

    Validierung durchführen: Cert161020171149-2
    Submit-ACMEChallenge : challenge has not been decoded
    In C:\Cer\CertificateAssistant.ps1:297 Zeichen:17
    + … $Validate = Submit-ACMEChallenge $ACMEAlias -ChallengeType http-01
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMEChallenge], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.SubmitChallenge

    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert161020171149-1
    Fehler: Validierung für Alias Cert161020171149-1 fehlgeschlagen

  88. Hallo liebe Gemeinde,

    ich habe ein Problem, mit meinem IIS lässt die Überprüfung/Validierung der Let’s Encrypt Schlüssel, durch das Script (in den IIS Ordnern nicht zu). Es sieht aus als wenn nur Port 80 umgeleitet wird auf 443 für das OWA Verzeichnis, jedoch die weiteren Verzeichnisse komplett ignoriert werden. Besonders das /.well-known/acme-challange/ Verzeichnis.
    Habe das sellbe Problem wie Jaroslav

Schreibe einen Kommentar

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