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.

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

Exchange Certificate Assistant: Neue Version

157 thoughts on “Exchange 2016: Zertifikatsassistent für Let’s Encrypt”

  1. LetsEncrypt unterstützt mittlerweile Wildcard-Zertifikate (*.example.org). Diese laufen auf unserem externen Apache Webserver problemlos und werden regelmäßig geupdated.

    Wäre es möglich, diese Zertifikate direkt in Exchange zu importieren? Die Zertifikate liegen allerdings als „.pem“ files vor und irgendwie mag Exchange / IIS das wohl nicht richtig.

    Ich würde gerne den Schritt sparen, neue Zertifikate erzeugen zu lassen schließlich sind sie schon da. Auf den ACME-Client unter Windows könnte ich dann verzichten.

    Reply
  2. Hallo zusammen,
    ich habe das Problem, das ich immer wieder den lokalen Namen mit drin habe obwohl ich alles bereinigt habe und ihn so nicht mehr finden kann. Woher er den nimmt, keine Ahnung. Das einzige was ich mir vorstellen könnte, ist das der Exchange auf einem AD-Controller mit Zertifizierungsstelle installiert ist. Und bevor jetzt der Aufschrei kommt: Ja ich weiß, das soll man nicht machen. Aber Kunden wollen nun mal sparen und leider meist an der IT und den Lizenzen.
    Auch habe ich mit der Validierung das selbe Problem wie schon angesprochen wurde.

    Reply
  3. Moin,

    das Update kann ich nicht mehr herunterladen.
    Version 1 auf ex 2019 gibt folgende Meldung:
    —————————————————————————
    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…
    Kein Vault gefunden, versuche neuen Vault anzulegen…
    Prüfe Let’s Encrypt Registrierung…
    Get-ACMERegistration : No registrations found
    In C:\Users\exadmin\Desktop\exchange scripte\CertificateAssistant.ps1:242 Zeichen:19
    + $Registration = Get-ACMERegistration
    + ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Get-ACMERegistration], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.GetRegistration

    Wsrnung: Es wurde keine Registrierung bei Let’s Encrypt gefunden, neue Registrierung wird durchgeführt
    Registrierung bei Let’s Encrypt wurde durchgeführt
    Neuer Identifier:
    DNS: autodiscover.xxxxxx.de
    Alias: Cert220720190422-1
    Validierung vorbereiten:
    Alias Cert220720190422-1
    Neuer Identifier:
    DNS: outlook.xxxxxx.de
    Alias: Cert220720190422-2
    Validierung vorbereiten:
    Alias Cert220720190422-2
    Neuer Identifier:
    DNS: mail.xxxxxx.de
    Alias: Cert220720190422-3
    Validierung vorbereiten:
    Alias Cert220720190422-3
    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert220720190422-1
    Validierung durchführen: Cert220720190422-2
    Validierung durchführen: Cert220720190422-3
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert220720190422-1
    Fehler: Validierung für Alias Cert220720190422-1 fehlgeschlagen
    PS C:\Users\exadmin\Desktop\exchange scripte>

    Liebe Grüße
    Rene

    Reply
    • Das gleiche Problem hab ich auch,
      hatte dazu auch schon das Kontaktformular bemüht aber kam bis jetzt nichts zurück….

      Reply
  4. Hallo,
    hab auch nen 2019er am laufen.

    Wollte das Beta testen aber kann es nicht laden. Ist dies beabsichtigt?

    Vg
    Matze

    Reply
    • Hallo Matze,

      ich konnte den Anhang auch nicht runterladen. Man kann aber auch die erste Version des Scripts mit Exchange 2019 nutzen (soweit ich das testen konnte). Bei der zweiten Version die es zwischenzeitlich mal gab, ist das Problem, das nur ein DNS-Eintrag zu Let’s Encrypt gemeldet wird. Damit gibt es dann meist einen Fehler, wenn man auch auf autodiscover.example.com setzt. Vielleicht kann das Frank auch noch fixen :)

      VG Shorty

      Reply
  5. Moin Franky,

    habe deinen Assistenten auf Server 2019 & Exchange 2019 getestet und wollte dir ein Feedback geben:

    Funktioniert perfekt!! Vielen Dank!!

    Eine Meldung kommt allerdings, da müsste später was getan werden.
    Hier die Meldung:
    —————————————————————-
    Lade ACMESharp Modul…
    Lade IIS Webadministration Modul…
    Lade Exchange Management Shell…
    Exchange Server 2013/2016 wurde erkannt

    Lese Exchange Konfiguration…
    WARNUNG: Das Cmdlet „Get-ClientAccessServer“ wird in einer künftigen Version von Exchange entfernt. Verwenden Sie
    stattdessen das Cmdlet „Get-ClientAccessService“. Wenn in Skripts das Cmdlet „Get-ClientAccessServer“ verwendet wird,
    aktualisieren Sie die Skripts, sodass sie das Cmdlet „Get-ClientAccessService“ verwenden. Weitere Informationen finden
    Sie unter „http://go.microsoft.com/fwlink/p/?LinkId=254711“.
    —————————————————————-

    Viele Grüße
    Uli

    Reply
  6. Michael sagt:
    3. Juli 2018 um 12:17

    Moin,
    Habe das Script schon für 2010, 2013 und 2016 erfolgreich durchlaufen lassen.
    Leider erhalte ich nun bei einem 2012 R2 2013 eine .local Adresse zum Zertifizieren. Wie auch Michael am 3. Juli 2018 um 12:17, habe im ECP alle Adressen geprüft, bzw. geändert.
    Hat da wer noch ne Idee?

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

    Reply
  8. Submit-ACMECertificate : Der Zugriff auf den Pfad
    „C:\ProgramData\ACMESharp\sysVault\45-KEYPM\8d6d28f1-2a25-4679-9bee-88e376f03792-key.pem“ wurde ver
    In C:\Users\ac-admin\Downloads\CertificateAssistant.ps1:324 Zeichen:20
    + $SubmitNewCert = Submit-ACMECertificate $SANAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Submit-ACMECertificate], UnauthorizedAccessExcepti
    + FullyQualifiedErrorId : System.UnauthorizedAccessException,ACMESharp.POSH.SubmitCertificate

    Irgendjemand eine Idee wie ich das beheben kann?

    Reply
  9. hallo zusammen,
    bei mir steht in 4 tagen der renew am srv2012r2 und exchange 2016 an.

    ich erhalte mit diesem script nun diese fehler. es wird wohl am „alten“ script liegen. gibt es irgendeine möglich es manuell „anzustupsen“? das neue script fnkt. mit 2012er ja leider noch nicht. danke für die info!

    gruß

    Submit-ACMECertificate : Error creating new cert :: authorizations for these names not found or expired:
    autodiscover.xxxx.co.at, outlook.xxxx.co.at
    In C:\CertificateAssistant\CertificateAssistant.ps1:431 Zeichen:6
    + Submit-ACMECertificate $SANAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : PermissionDenied: (ACMESharp.Vault.Model.CertificateInfo:CertificateInfo) [Submit-ACMECe
    rtificate], AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:unauthorized (403),ACMESharp.POSH.SubmitCertificate
    Update-ACMECertificate : Certificate has not been submitted yet; cannot update status
    In C:\CertificateAssistant\CertificateAssistant.ps1:435 Zeichen:6
    + Update-ACMECertificate $SANAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Update-ACMECertificate], Exception
    + FullyQualifiedErrorId : System.Exception,ACMESharp.POSH.UpdateCertificate

    Get-ACMECertificate : Cannot export PKCS12; private hasn’t been imported or generated
    In C:\CertificateAssistant\CertificateAssistant.ps1:438 Zeichen:20
    + $CertExport = Get-ACMECertificate $SANAlias -ExportPkcs12 $CertPath -Certif …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Get-ACMECertificate], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.GetCertificate

    Import-ExchangeCertificate : Zugriffsfehler für die importierte Zertifikatdatei für Server WUNDERER-SRV2. Ursache: Die
    Datei „C:\Users\admininstall\AppData\Local\Temp\1\SAN01032018.pfx“ konnte nicht gefunden werden.
    In C:\CertificateAssistant\CertificateAssistant.ps1:443 Zeichen:8
    + Import-ExchangeCertificate -FileName $CertPath -FriendlyName $ExchangeSub …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [Import-ExchangeCertificate], InvalidOperationException
    + FullyQualifiedErrorId : [Server=xxxxx-SRV2,RequestId=f257fb5e-8b8d-4f73-bd29-9bc95c280f35,TimeStamp=01.03.201
    8 06:32:16] [FailureCategory=Cmdlet-InvalidOperationException] 2402C2F2,Microsoft.Exchange.Management.SystemConfig
    urationTasks.ImportExchangeCertificate

    Reply
  10. Hallo Franky,

    das Skript findet unter anderem auch per DNS ein .local. Wenn ich das Skript weiterlaufen lasse, dann kommen für das .local Fehlermeldungen.

    Wo bekomme ich das .local deaktiviert, damit er es bei der Ausführung des Skriptes nicht findet?

    Gruß
    Christoph

    Reply
  11. Hallo Frank,

    ich habe noch eine Rückfrage zu den Let’s Encrypt-Zertifikaten. Können diese dann mit deinem Script auch für IMAP, POP und SMTP genutzt werden ohne das ständig die Kommandozeile bemüht werden muss? Weil gerade das, würde ja es super vereinfachen.

    Reply
  12. So,

    mal eine Rückmeldung, was ich gemacht habe.
    Ich habe das Zertifikat bei PSW gebucht. (Für drei Jahre).

    Klar, koman hätte es auch kostenlos haben können. Da aber dann alle 12 Wochen der import für die UTM fällig ist, habe ich es gelassen.

    Nachdem ich das PSW Zertifikat eingebunden hatte, musste die UTM noch versorgt werden.
    Der import klappte aber nicht. Die Fehlermeldung hier: Zertifikat schon vorhanden. (Sinngemäß)
    Daraufhn habe ich Zertifikat auf der UTM gelöscht und per Export (Exchange) neu erstellt und in die UTM geladen.

    Dabei sind aber die Regeln auf der Web application FW der UTM teilweise gelöscht worden. Diese musste ich dann neu installieren. Diese Info, fals jemand vor dem gleichen Problem steht.
    evtl. gibt es einen anderen Weg, dies zu umgehen und man muss nicht löschen. Ich habe nur keinen gefunden.

    Frage etwas ausserhalb: Ich möchte mich nun per active Sync und iphone am outlook anmelden.
    Das iphone wird auch ngezeigt in exchange und ich habe es freigegeben.
    Es kommt dennoch nicht zum connect, da das iphone die Verbindung nicht aufnimmt.
    Die Meldung ist hier: (Sinngenäß) Keine verbindung möglich, da die TLD nicht gültig signiert ist.
    Das stimmt, der die TLD hatte einZertifikat. es st aber abgelaufen.
    Nun die Frage: Ist es überhaupt notwendig, dass die TLD signiert ist . Habe ja die Umgebung von dir nachgebaut „kleine Exchange Umgebung“. lediglich die beiden subdomains habe ich, wie oben geschrieben, per SAN zertifikat signiert.

    Grüße

    Reply
  13. Danke für die Rückmeldung.

    Die Nacharbeit bezieht sich auf den Export / Import Exchange -> UTM , ist das richtig?
    Das bedeutet dann, dass diese Arbeit alle 3 Monate notwendig ist, wenn das script automatisiert
    bei letsencrypt ein neues anfordert und installiert?!

    Grüße
    Martin

    Reply
  14. Hallo Frank,

    ich habe eine Frage bzgl. des sciptes, was Du / Ihr so toll weiterpflegt:
    Funktioniert das auch auf der von die beschriebenen Umgebung „Aufbau einer kleinen Exchange Umgebung“?
    Also Fritzbox / UTM / Exchange.

    Zweite Frage: Wurde hier mal ein link angebeben, der auf einen Zertifikatverkäufer verlinkt. Ich finde diese URL aber nicht mehr. Bin aber auch nicht 100% sicher ob es hier in deinem Blog war. Wir suchen einen Anbieter, der 3 Jahres Zertifkate austellt. ca 100 Euro für 3 Jahre.

    Danke Dir und weiter so :-)

    Grüße

    Reply
    • Hallo Martin,
      ja, das Script funktioniert dort auch, benötigt aber etwas händische Nacharbeit um das Zertifikat auf die UTM zu portieren.
      Für die Zertifikate meinst du wahrscheinlich PSW: https://www.psw-group.de/
      (Du musst dich allerdings beeilen, 3-Jahres Zertifikate gibt es nur noch bis zum 20.2.2018)
      Gruß,
      Frank

      Reply
  15. Hallo Frank,

    vielen Dank mit Hilfe des White Papers habe ich alles verstanden und konnte es perfekt umsetzen. So dass jetzt auch der Zertifikat Assistent fehlerfrei durchgelaufen ist. Eine Sache ist mir noch aufgefallen, die automatische Aufgabe zum Erneuern des Zertifikates, zeigt immer eine Fehlermeldung schon beim drauf klicken -> „Mindestens ein Protokoll in der Abfrage enthält Fehler“ Protokoll: Microsoft-Windows-TaskScheduler/Opertational Fehler: Die angegebene Abfrage ist ungültig

    Wenn ich den Fehler mit OK bestätige komme ich in die Eigenschaften der Aufgabe, die Frage ist nur ob diese so auch funktioniert ….
    Programm/Skript: powershell.exe
    Argumente hinzufügen (optional) : -Command „&’C:\powershell\CertificateAssistant.ps1′ -renew:$true“

    Den Pfad C:\powershell\CertificateAssistant.ps1 gibt es und das Skript liegt dort auch.

    Danke und Gruß
    Jens

    Reply
  16. Hi Stephan,

    vielen Dank! Kann ich das „Exchange 2016: Umfangreiches Whitepaper zu Autodiscover“ auch auf Exchange 2013 anwenden?

    Gruß

    Jens

    Reply
  17. Jens,

    du musst die local dns namen auf öffentlich erreichbare FQDNs umstellen, schau dir mal das Autodiscover howto von Franky an, damit sollte das eigentlich klar werden.

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

    Reply
  19. Hi Franky,

    Very nice script!

    Getting following error when running on server 2016/exchange 2016

    Exchange certificate is assigned and activated

    Enable-ExchangeCertificate : A special Rpc error occurs on server C01: An unexpected error occurred while modifyin
    g the forms authentication settings for path /LM/W3SVC/1. The error returned was 5506.
    At C:\Install\CertificateAssistant.ps1:366 char:138
    + … ble:$true | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, II …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Enable-ExchangeCertificate], InvalidOperationException
    + FullyQualifiedErrorId : [Server=C01,RequestId=57360c4a-6deb-4319-8ab7-ba3178aa682e,TimeStamp=5/02/2018 10:2
    6:16] [FailureCategory=Cmdlet-InvalidOperationException] D85212C5,Microsoft.Exchange.Management.SystemConfiguratio
    nTasks.EnableExchangeCertificate

    Checked IIS, picked the certificate manually and assigned services manually in exchange admin.

    Everything seems to be working. There is also no friendly name on the cert.

    Grtz
    Pasqualino

    Reply
  20. Hi Patrick,
    ich hab mir auch mal übers Wochenende einen Test Exchange 2016 CU8 installiert und bei mir passiert das gleiche. Ich bekomme viele Fehlermeldungen im Script und zum Schluss crasht es einfach. Ich hoffe Frank könnte das Script anpassen.
    Danke!
    Grüße

    Reply
  21. Erstmal vielen Dank für das geniale Script!
    Leider crasht es bei mir und schliesst einfach die Powershell. Habe Windows Server 2016 und Exchange 2016 CU8 Version 15.1 ‎(Build 1415.2)‎ am laufen.
    Kennt jemand das Problem und hat eine Lösung?

    Reply
  22. Ok, das kreist es ein:
    ((Get-MapiVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    schmeißt den lokalen internen fqdn des Exchange Servers raus!

    ((Get-MapiVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()
    Gibt eine Fehlermeldung „Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat

    Das MAPI Verzeichnis ist mir bei der Konfiguration der Verzeichnisse (auch in der Anleitung hier auf der Seite) noch nie untergekommen. Gibt es irgendwo eine Info, wie man die URI dafür korrekt setzt?

    Danke schonmal für die schnelle Rückmeldung!!

    Reply
  23. Hallo Achim,

    das kannst du ganz einfach im Skript selbst schauen, was er sich da automatisch holt.
    Ab Zeile 91 findet du den entsprechenden Teil:
    $ExchangeServer = (Get-ExchangeServer $env:computername).Name
    [array]$CertNames += ((Get-ClientAccessServer -Identity $ExchangeServer).AutoDiscoverServiceInternalUri.Host).ToLower()
    [array]$CertNames += ((Get-OutlookAnywhere -Server $ExchangeServer).ExternalHostname.Hostnamestring).ToLower()
    [array]$CertNames += ((Get-OabVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    [array]$CertNames += ((Get-OabVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()
    [array]$CertNames += ((Get-ActiveSyncVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    [array]$CertNames += ((Get-ActiveSyncVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()
    [array]$CertNames += ((Get-WebServicesVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    [array]$CertNames += ((Get-WebServicesVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()
    [array]$CertNames += ((Get-EcpVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    [array]$CertNames += ((Get-EcpVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()
    [array]$CertNames += ((Get-OwaVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    [array]$CertNames += ((Get-OwaVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()
    if ($ExchangeVersion -match „Version 15“)
    {
    [array]$CertNames += ((Get-OutlookAnywhere -Server $ExchangeServer).Internalhostname.Hostnamestring).ToLower()
    [array]$CertNames += ((Get-MapiVirtualDirectory -Server $ExchangeServer).Internalurl.Host).ToLower()
    [array]$CertNames += ((Get-MapiVirtualDirectory -Server $ExchangeServer).ExternalUrl.Host).ToLower()

    Jeweils den Teil ab „Get-…“ kannst du ja bei dir ausführen in der Shell, dann siehst du welche URL falsch konfiguriert ist. Alternativ kannst du auch die Zeile aus dem Skript entfernen, würde ich aber „pauschal“ erst mal nicht empfehlen ;)

    LG Bernd

    Reply
  24. Moinsen,

    ich teste gerade das Script auf unserem Server (Server 2012 R2 / Exchange 2013). Das ACMESharp Modul habe ich, wie in den Kommentaren zu lesen, manuell installiert. Das Script läuft durch, findet aber bei den DNS Namen neben dem korrekten FQDN des Exchange Servers und der Autodiscovery Adresse immer noch den internen FQDN des Servers, der sich ja nicht validieren lässt. Ich habe alle virtuellen Verzeichnisse korrekt konfiguriert, autodiscovery URI ist per EMS gesetzt. DNS ist konfiguriert, alle Adressen sind in- und extern zu erreichen. Woher bekommt das Script noch den internen Namen des Servers her? Ich habe alles durch, lediglich das virtuelle Verzeichnis für Powershell verweist auf diesen Namen, das soll aber laut Konfigurationanleitung für die Zertifikate auch so bleiben.

    Wo könnte ich noch schauen?

    Reply
  25. Hi!

    Danke für den Tipp JensV! Ich bin weiter gekommen, habe aber das Ziel nicht erreicht. Folgender Output am ende:

    Was könnte dies bedeuten? Danke vorab!

    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert100120180950-1
    Validierung durchführen: Cert100120180950-2
    Validierung durchführen: Cert100120180950-3
    Validierung durchführen: Cert100120180950-4
    Validierung durchführen: Cert100120180950-5
    30 Sekunden warten…
    Prüfe ob die DNS-Namen validiert wurden…
    Update Alias: Cert100120180950-1
    Validierung OK
    Update Alias: Cert100120180950-2
    Validierung OK
    Update Alias: Cert100120180950-3
    Validierung OK
    Update Alias: Cert100120180950-4
    Validierung OK
    Update Alias: Cert100120180950-5
    Validierung OK
    New-ACMECertificate : Das Argument kann nicht an den Parameter „IdentifierRef“ gebunden werden, da es NULL ist.
    In C:\CERT\CertificateAssistant.ps1:323 Zeichen:34
    + $NewCert = New-ACMECertificate $SubjectAlias -Generate -Alternative …
    + ~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [New-ACMECertificate], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,ACMESharp.POSH.NewCertificate

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

    30 Sekunden warten…
    Prüfe das Zertifikat…
    Update-ACMECertificate : No certificates found
    In C:\CERT\CertificateAssistant.ps1:332 Zeichen:20
    + $UpdateNewCert = Update-ACMECertificate $SANAlias
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Update-ACMECertificate], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.UpdateCertificate

    Get-ACMECertificate : No certificates found
    In C:\CERT\CertificateAssistant.ps1:333 Zeichen:18
    + $CertStatus = (Get-ACMECertificate $SANAlias).CertificateRequest.St …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Get-ACMECertificate], InvalidOperationException
    + FullyQualifiedErrorId : System.InvalidOperationException,ACMESharp.POSH.GetCertificate

    Fehler: Zertifikat wurde nicht ausgestellt

    Reply
  26. Hallo Frank,
    Ja das mit dem PSremote ist für mich leider komplettes Neuland und da ich keine Ausgewachsene Testumgebung habe könnte ich die OP nur am Offenen Herzen durführen…
    Wäre toll wenn ihr mir wenigstens ein wenig helfen könntet..

    MFG Sven

    Reply
  27. Guten Tag,
    Ich habe einen Exchange 2016 hinter einem Essential Server 2016 geschaltet mit einem Reserv-Proxy von Mircosoft.
    Nun meine Frage, kann man das Script auch erweitern, das es das Zertifikat auch auf eine Freigabe exportiert, damit ich auf den Essentialserver dann dieses Zertifikat in die Webfarm (den Proxy) importieren kann?

    Mein Powershell programmierkünste sind leider nicht so groß..

    MFG Sven

    Reply
    • Hallo Sven,

      ja, das ist mit ein paar Anpassungen am Script durchaus möglich. Das wäre ein guter Einstieg um sich näher mit der PowerShell zu befassen. Das Zertifikat liegt ja schon exportiert vor, du kannst das Script erweitern und auf den Zielserver kopieren. Mit PSRemoting könntest du es dann auch direkt der Farm zuweisen.
      Gruß,
      Frank

      Reply
  28. @MarkusS

    Hallo zusammen,
    hatte das gleiche Problem wie oben beschrieben, nach etwas suchen habe ich dann festgestellt, das zwei ACMESharp Versionen installiert waren. Habe alle ACMESharp Module entfernt und wieder die 0.8.1 installiert. Danach lief alles wieder wie gewünscht.

    Hier mal kurz die benötigten Befehle um das Problem zu verifizieren und zu lösen.
    1. Anzeige der installierten Module mit: Get-Module –ListAvailable
    2. Entfernen der ACMESharp Module: Uninstall-Module ACMESharp
    3. Installation der benötigten ACMESharp Version 0.8.1: Install-Module -Name ACMESharp -RequiredVersion 0.8.1

    Grüße Jens

    Reply
  29. Hallo!

    Ich versuche seit 2 Tagen es zum laufen zu bringen, es kommen bei mir einige Fehler. Ich habe einen neuen Exchange 2016 Server auf Windows 2016 installiert.

    Bitte um Hilfe, und danke für jeden der sich Zeit nimmt!

    Folgende Logs:

    Certificate Assistant v1.1
    Automatische Let’s Encrypt Zertifikate für Exchange 2010/2013/2016

    Frank Zoechling (www.FrankysWeb.de)

    —————————————————————-
    Lade ACMESharp Modul…
    Lade IIS Webadministration Modul…
    Lade Exchange Management Shell…
    Exchange Server 2013/2016 wurde erkannt

    Lese Exchange Konfiguration…
    WARNUNG: Das Cmdlet „Get-ClientAccessServer“ wird in einer künftigen Version von Exchange entfernt. Verwenden Sie stattdessen das Cmdlet „Get-ClientAccessService“. Wenn in Skripts das Cmdlet „Get-ClientAccessServer“ verwendet wird, aktualisieren Sie die Skripts, sodass
    sie das Cmdlet „Get-ClientAccessService“ 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:\CERT\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:\CERT\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:\CERT\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:\CERT\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:\CERT\CertificateAssistant.ps1:101 Zeichen:4
    + [array]$CertNames += ((Get-EcpVirtualDirectory -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:\CERT\CertificateAssistant.ps1:103 Zeichen:4
    + [array]$CertNames += ((Get-OwaVirtualDirectory -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:\CERT\CertificateAssistant.ps1:108 Zeichen:5
    + [array]$CertNames += ((Get-MapiVirtualDirectory -Server $Exchange …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    —————————————————————-

    Die folgenden DNS-Namen wurden gefunden:

    DNS: mail.***.***.net

    ————————

    Prüfe ob bereits ein Vault existiert…
    Prüfe Let’s Encrypt Registrierung…
    Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.
    In C:\CERT\CertificateAssistant.ps1:259 Zeichen:3
    + $CertSubject = ((Get-OutlookAnywhere -Server $ExchangeServer).Exter …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [], RuntimeException
    + FullyQualifiedErrorId : InvokeMethodOnNull

    Neuer Identifier:
    DNS: mail.***.***.net
    Alias: Cert291120171014-1
    Validierung vorbereiten:
    Alias Cert291120171014-1
    Complete-ACMEChallenge : the given identifier was not found in the registry
    In C:\CERT\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

    Let’s Encrypt IIS Verzeichnis auf HTTP umstellen…
    Umstellung auf HTTP erfolgreich
    DNS Namen durch Let’s Encrypt validieren lassen…
    Validierung durchführen: Cert291120171014-1
    Submit-ACMEChallenge : challenge has not been decoded
    In C:\CERT\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: Cert291120171014-1
    Fehler: Validierung für Alias Cert291120171014-1 fehlgeschlagen

    Reply
  30. Hallo,

    ich bin dem Problem etwas näher gekommen. Das Script setzt auf allen Seiten SSL erforderlich auf ein. Somit funktioniert meine Umleitung bzw. der Redirect von HTTP auf HTTPS nicht mehr. Gibt es eine Möglichkeit das abzustellen? Bzw. nachträglich wieder umzustellen?

    Hat jemand einen Tipp?

    Gruß und Danke!

    Reply
  31. Hallo nochmal,

    vergesst die Frage bitte, nach einigem Debuggen habe ich festgestellt, dass isch das Skript beentdete nach der Validierung – es ist lediglich „exit“ zu lesen, von daher dachte ich, es wäre fertig – mittlerweile bin ich einen Schritt weiter, jetzt muss ic hauf die DNS-Server des IoT warten ;-) …

    mfg
    CK

    Reply
  32. Hallo zusammen,
    vielen Dank für für das wunderbare Skript, es funktioniert wirklich hervorragend und fast problemlos – vielen Dank auch an meine Vor-Kommentatoren für folgenden Tipp:
    Uninstall-Module ACMESharp
    und
    Install-Module -Name ACMESharp -RequiredVersion 0.8.1 -AllowClobber
    bei dem Fehler :
    Complete-ACMEChallenge : the given identifier was not found in the registry

    Ich habe als BS Server 2016 und Ex2016

    Nun noch einige Anregungen:
    Ich hatte das Skript umbenannt, deswegen funktionierte die im Skript angelegte Aufgabe leider nicht – könnte das noch eventuell für zukünftige Einsätze geändert werden? M.E. müsste ein hartcodierter Dateiname dynamisch veränderbar gemacht werden – ohne das skript näher betrachtet zu haben.

    Letztendlich noch eine Frage, die mir fast schon unangenehm ist:
    Ich hatte gedacht, dass das Skript mein bestehendes selbstsigniertes Zertifikat (entstanden durch die Exchangeserver-Installation) ändert bzw. ersetzt – leider sind die Exchangeserver-Zertifikatseinstellungen im Exchange Admin Center unberührt – habe ich eventuell einen wichtigen Schritt vergessen?

    Vielen Dank für eure Antworten!

    mfg
    CK

    Reply
  33. Hallo Frank, tausendundeins Dank für diese wunderbare Skript.

    Wir haben vor kurzem von Exchange 2010 und 2013 auf 2016 migriert und bisher immer mit selbst ausgestellten Zertifikaten rum gehampelt.

    Ich hatte keinerlei Probleme mit dem Skript, es hat auf Anhieb funktioniert.
    Wir nutzen Exchange 2016 CU7, installiert auf einem Windows Server 2016.

    Spende folgt! :-)

    Gruß,
    Dominik

    Reply
  34. 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….“

    Nach einmaligem Klicken von „akzeptieren des Zertifikats“ läuft Outlook einwandfrei. Mobile Geräte haben kein Problem. Nur eben Outlook.

    Hat jemand noch eine Idee wo die „.local“ Domain versteckt sein könnte ?

    Reply
  35. @Manu (vom 21. September):
    Sorry hatte kurze Pause.
    Im IIS war bei mir in der Ebene ‚Default Web Site‘ (Startseite), rechts MIME-Typ öffnen der Eintrag ‚.‘ text/plain vorhanden, was bedeutet, das Dateien OHNE Endung durch den MIME-Typ Text/plain geöffnet werden können. Dieser wurde nach unten vererbt, was bedeutet, das im Verzeichnis acme-challenge ebenfalls dieser Eintrag vorhanden ist.
    Durch das Script wird nun im Verzeichnis C:\inetpub\wwwroot\.well-known\acme-challenge automatisch eine Datei web.config erstellt. Diese wiederum gibt dem IIS als XML-File ‚den Auftrag‘ Dateien ‚ohne Endung dem MIME-Typ text/json zuzuweisen.
    Da die Dateien ohne Endung jedoch bereits eine Zuweisung durch den IIS erhalten haben, gibts eine Fehlermeldung bzw. die Validierung schlägt fehl, weil es ein Konflikt gibt beim Versuch eine Datei ohne Endung aufzurufen (beim Versuch die Datei von extern für die Validierung aufzurufen).
    Anfangs hatte ich diese Datei web.config während der Laufzeit des Scriptes von Hand gleich gelöscht und dann lief das Script durch. Deshalb war meine Frage, wie ich diese Erstellung der web.config verhindern kann.
    Konnte es jedoch nun durch ‚korrekte?!? (- jedenfalls funktioniert es) Konfiguration des IIS lösen.
    Der Eintrag der Zuweisung für Dateien Ohne Endung war in meinem acme-challenge verzeichnis vorhanden wurde vererbt durch die ‚root‘ also Default Web Seite.
    Deshalb hab ich dort diese MIME-Typ eintrag einfach gelöscht.
    Im acme-challenge musst Du aber nichts erstellen und Du wirst feststellen, dass dieser Eintrag ‚.‘ (ohne Dateiendnung) nicht vorhanden ist. Sobald aber das script durchläuft und die Datei web.config im acme-challenge Verzeichnis erstellt wurde, wirst Du feststellen, das auch der eintrag ‚.‘ unter MIME-Typ wieder vorhanden ist…
    Hoffe es hilft Dir weiter…

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

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

    Reply
  38. 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?

    Reply
  39. @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.

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

    Reply
  41. 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 :-)

    Reply
  42. 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?

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

      Reply
  43. 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…)

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

      Reply
      • 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)

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

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

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

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

    Reply
      • 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?

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

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

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

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

    Reply
  49. 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!

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

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

    Reply
  52. 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!

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

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

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

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

    Reply
  56. 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?

    Reply
  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

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

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

    Reply
    • 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

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

    Reply
  61. 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)

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

    Reply
  63. 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)

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

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

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

    Reply
  67. 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?

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

    Reply
    • 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

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

    Reply
  70. 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?

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

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

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

    Reply
    • 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

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

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

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

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

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

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

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

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

    Reply
    • 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

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

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

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

    Reply
  85. 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?

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

    Reply
    • 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

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

    Reply
    • 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

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

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

    Reply
    • 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

      Reply
  90. 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?

    Reply
  91. 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?

    Reply
    • 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

      Reply
    • 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

      Reply
  92. 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…

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

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

    Reply
    • 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

      Reply

Leave a Comment