Exchange Certificate Assistant: Neue Version

Ich habe angefangen den “Exchange Certificate Assistant” zu überarbeiten. Die bisherige Version ist nicht mehr kompatibel zum aktuellen ACMESharp Modul und erfordert daher eine alte Version des Moduls. Da sich aber mittlerweile einige relevante Teile des ACMESharp Moduls geändert haben, ist es Zeit für eine neue Version des “Exchange Certificate Assistant”.

Ich habe den “Certificate Assistant” daher grundlegend überarbeitet und dabei auch paar Verbesserungen eingeführt:

  • Es wird ein Logfile erzeugt
  • Das Logfile kann per Mail versendet werden
  • Das Logfile liegt im CSV-Format vor und lässt sich daher weiter verarbeiten und leichter analysieren
  • Die Fehlerbehandlung ist im Script nun nahezu durchgängig
  • Das Script ist zur aktuellen ACMESharp Modul Version kompatibel (derzeit Version 0.9.1.326)

Es gibt aber auch einige Stellen an denen ich noch schrauben muss:

  • Derzeit ist das Script nur mit Exchange 2016 auf Server 2016 getestet worden
  • Support für Server 2012 R2 und Exchange 2013 muss getestet, bzw. hinzugefügt werden
  • Aufräumen der alten / abgelaufenen Zertifikate
  • Das Anlegen einer geplanten Aufgabe für die Erneuerung ist entfallen

Let’s Encrypt Zertifikate sind bekanntlich 3 Monate lang gültig. In der alten Version des Scripts, wurde ein geplanter Task angelegt, der das Zertifikat erneuert. Dies soll auch weiterhin so sein, jedoch soll der Task bestimmen, wann das Zertifikat erneuert wird. Dazu ist nur noch ein erneuter Aufruf des Scripts nötig.

Ich stelle mir das in etwa so vor:

  • Erster Aufruf des Scripts durch Admininistrator
  • Script installiert nötige Voraussetzungen
  • Script konfiguriert das Zertifikat
  • Administrator legt geplante Aufgabe an, die das Script beispielsweise alle 60 Tage startet
  • Script erneuert Zertifikat automatisch, ohne Benutzerinteraktion

Für die Exchange 2013 und Exchange 2010 erstelle ich eigene Versionen des Scripts, so müssen weniger “Versionsabhängigkeiten” innerhalb eines Script berücksichtigt werden. Ich denke dadurch wird es etwas einfacher.

Es gibt natürlich trotzdem ein paar Voraussetzungen:

  • Exchange 2016 auf Server 2016 (Support für weitere Exchange und OS Versionen folgt)
  • Exchange 2016 muss auf Port 80 (http) und Port 443 (https) aus dem Internet erreichbar sein
  • Exchange 2016 muss mit gültigen FQDNs konfiguriert sein, auf .local und .intern (usw) endende FQDNs werden nicht unterstützt
  • Alle konfigurierten Exchange 2016 FQDNs müssen aus dem Internet erreichbar sein (interne, sowie externe FQDNs)

Nach aktuellen Best Practises sollten interne und externe FQDNs eh gleich sein, daher sollten die Voraussetzungen im Normalfall kein Problem darstellen. Der interne Servername spielt dabei keine Rolle, lediglich die konfigurierten URLs der Exchange Dienste sind für das Script relevant. Die entsprechenden Hostnamen werden durch das Script automatisch ermittelt, können im Bedarfsfall aber auch fest im Script hinterlegt werden.

Ich habe hier einmal ein Video eines ersten Durchlaufs auf einem frisch konfigurierten Exchange 2016 Server erstellt:

Den Download für die alte Version lasse ich zunächst online. Ich würde mich freuen, wenn sich jemand bereit erklärt die aktuelle Version zu testen. Falls es Probleme gibt, dann schickt bitte das Logfile und ggf. Screenshots von der Fehlermeldung per Mail an mich. Bitte zunächst aber nur in Verbindung mit Exchange 2016 testen, andere Exchange Versionen teste ich zunächst in meiner Testumgebung.

Hier nun der Download, der noch ein bisschen Beta Charakter hat:

 

Die übrigen Punkte auf meiner ToDo Liste versuche ich so schnell wie möglich abzuarbeiten. Ich würde mich aber freuen, wenn ich möglichst viele Logfiles aus anderen Umgebungen erhalten würde. Auch Logfiles in denen das Script fehlerfrei durchgelaufen ist, können bei der Verbesserung helfen. Verbesserungsvorschläge und Kritik wie immer auch gerne per Mail über das Kontaktformular.

Update 27.02.18

In meiner Testumgebung wird das Zertifikat auch automatisch erneuert, ich habe dazu eine geplante Aufgabe angelegt. Wie oben beschrieben, erstellt das Script die Aufgabe nicht automatisch. Die folgende Aufgabe hat bei mir problemlos funktioniert:

Aufgabe zur Erneuerung

Der ausführende Benutzer muss lokale Admin Rechte auf dem Server haben, aber natürlich auch entsprechende Exchange Berechtigungen. Ich habe hier zum Testen den Domain Administrator verwendet, welche Rechte genau erforderlich sind, muss ich noch testen. Die Einstellungen, die ich verändert habe sind in den Screenshots zu sehen.

Ich habe für meinen Test einen Trigger auf den heutigen Tag gesetzt, es funktioniert hier aber auch ein entsprechend anderer Trigger. Let’s Encrypt Zertifikate sind 3 Monate lang gültig, man könnte also alle 2 Monate das Zertifikat tauschen und hat dann noch genug Zeit zu reagieren, falls etwas schief geht.

Als Aktion wird dann einfach das Script ausgelöst. Pfad zur Powershell:

C:\Windows\System32\WindowsPowerShell\v1.0\powershell.exe

Als Argument wird der Pfad zum Script angegeben, in meinem Fall „C:\CertificateAssistant\CertificateAssistant.ps1“

Ich werde nun noch etwas weiter am Script basteln und Testumgebungen für Exchange 2010 und Exchange 2013 installieren.

Update 04.03.2018

Ich habe gerade eine neue Version hochgeladen. Jetzt mit Support für Exchange 2013 und Server 2012 R2. Siehe hier:

Certificate Assistant jetzt auch für Exchange 2013 und Server 2012 R2

 

137 Gedanken zu „Exchange Certificate Assistant: Neue Version“

  1. @Arthoras probiere mal die Zeile mit Import-ExchangeCertificate durch folgendes zu ersetzen.

    Import-ExchangeCertificate -FileData ([System.IO.File]::ReadAllBytes($CertPath)) -FriendlyName $SANAlias -Password $ImportPassword -PrivateKeyExportable:$true | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, IIS“ –force

    Antworten
  2. Guten Tag zusammen

    Ich habe folgenes Problem beim erneurn des Zertifikates. Das Script hat bis anhin problemlos funktinoiert.
    Die Powerschell zeigt mir folgendes an:

    20.06.2022 14:26:06 – Exchange – Info – Lets try to enable certificate for Exchange Server
    20.06.2022 14:26:13 – Exchange – Info – Exchange Server Version: Version 15.2 (Build 1118.7)
    20.06.2022 14:26:13 – Exchange – Error – Failed to import and enable Certificate

    Im Log file ist folgendes angegeben:
    20.06.2022 14:26:13;Exchange;Error;Failed to import and enable Certificate;A parameter cannot be found that matches parameter name ‚FileName‘.

    Antworten
  3. Help exchange 2019 on windows server2022:
    02.05.2022 15:34:10 – LE System – INFO – Aggiorniamo l’ordine
    02.05.2022 15:34:10 – LE System – INFO – Controlliamo se l’ordine è pronto
    02.05.2022 15:34:10 – LE System – INFO – L’ordine è pronto
    02.05.2022 15:34:10 – LE System – INFO – Otteniamo il certificato
    02.05.2022 15:34:14 – LE System – INFO – L’ottenimento del certificato è andato a buon fine. L’identificazione personale è 1072AE8B32880823C201AD454D62A8F9298BFA69
    02.05.2022 15:34:14 – LE System – INFO – Controlliamo se il PFX è presente
    02.05.2022 15:34:14 – Cert Export – Info – PFX 1072AE8B32880823C201AD454D62A8F9298BFA69 Verificato Correttamente
    02.05.2022 15:34:14 – LE System – INFO – Tipo Mime Type
    02.05.2022 15:34:14 – LE System – INFO – CleanUp Riuscito
    02.05.2022 15:34:14 – Exchange – Info – Consente di provare ad abilitare il certificato per Exchange Server
    02.05.2022 15:34:14 – Exchange – Info – Exchange Server Version: Version 15.2 (Build 1118.7)
    02.05.2022 15:34:14 – Exchange – Error – Impossibile importare e abilitare il certificato
    02.05.2022 15:34:14 – SendMail – Info – Prova a inviare e-mail con file di registro
    02.05.2022 15:34:14 – SendMail – Info – Invio e-mail avviato correttamente
    02.05.2022 15:34:14 – End – Info – End of script

    Antworten
  4. Wir hatten beim aktualisieren der Zertifikate auf einem aktuellen Exchange Server 2016 ein Problem. Das Exchange SnapIn konnte nicht geladen werden.

    Nach einigem testen mit der Syntax scheint das im originalen Script verwendete „Add-PSSnapin *exchange*“ bzw. „Get-PSSnapin *exchange*“ nicht mehr das entsprechende Modul zu laden.

    Ich habe das Script bei mir zum passenden eindeutigen Namen des Snapin’s geändert. Nun tut es wieder seinen Dienst.

    #Load Exchange Modules
    Write-ACMELog „Load Exchange SnapIns“ „Info“ „Try to load Exchange SnapIns“
    Add-PSSnapin microsoft.exchange.management.powershell.snapin -ea 0
    $CheckExchangeSnapin = Get-PSSnapin microsoft.exchange.management.powershell.snapin -ea 0

    Antworten
  5. Wir haben heute das Script zum ersten mal mit 2019 getestet. Leider lief es nicht. nach Analyse haben wir festgestellt, das die verwendetet ACME nicht mehr verfügbar ist und damit auch nicht die Downloads. Folgende Änderungen haben wir durchgeführt:

    Zeile 116

    #Check if ACME Module installed
    Write-ACMELog „Check Posh-ACME“ „Info“ „Check if Module installed“
    $CheckACMEModule = Get-Module Posh-ACME -ListAvailable | where {$_.version.major -ge 4 -and $_.version.minor -ge 10}

    und Zeile 145-151

    #Try to download the Package Management Module
    $PMFile = „$PSScriptRoot“ + „\poshacme.zip“
    Write-ACMELog „Check Posh-ACME“ „Info“ „Try to download PackageManagement-MSI Path: $pmfile“
    #$DownloadPM = Invoke-WebRequest -Uri „https://github.com/rmbolger/Posh-ACME/archive/master.zip“ -OutFile $PMFile
    iex (irm https://raw.githubusercontent.com/rmbolger/Posh-ACME/main/instdev.ps1)
    #Try to Install Posh ACME
    #$ExpandFile = Expand-Archive $PMFile -DestinationPath $PSScriptRoot

    sowie Zeile 168 und 174

    #Load ACME Modules
    Write-ACMELog „Load Posh-ACME“ „Info“ „Posh-ACME is installed, try to load it“
    try
    {
    $CheckACMEModule = Get-Module Posh-ACME -ListAvailable | where {$_.version.major -ge 4 -and $_.version.minor -ge 10}
    #Try to load the ACMESharp Module
    if ($CheckACMEModule) {
    Import-Module Posh-ACME
    }
    else {
    iex (irm https://raw.githubusercontent.com/rmbolger/Posh-ACME/main/instdev.ps1)
    }

    Danach läuft es auch mit der neuen ACME

    Vielen Dank. Hier wurde einem wie immer gut geholfen.

    Gruß

    MeinerEiner

    Antworten
  6. Hallo und HIlfe
    Das swcript hat Jahrelang erfolgreich gelaufen. Heute jedoch haben alle User ein ungültiges Zertifikat gehabt. Nach nerneuten anstossen CertificateAssistant_v3_EX2016 sieht alles gut aus. Bis auf die letzte Zeile.
    Ich komme alleine nicht weiter.
    25.08.2021 17:55:24 – LE System – Info – Asking LE to verify the order
    25.08.2021 17:55:25 – LE System – Info – Successfully informed LE to verify the order
    25.08.2021 17:55:25 – LE System – INFO – Let’s give LE some time to validate (1 min)
    25.08.2021 17:56:25 – LE System – INFO – Time to wake up, need coffee!
    25.08.2021 17:56:25 – LE System – INFO – Let’s check the authorization
    25.08.2021 17:56:27 – LE System – INFO – Authorization for autodiscover.tobien.net is valid
    25.08.2021 17:56:27 – LE System – INFO – Authorization for outlook.tobien.net is valid
    25.08.2021 17:56:27 – LE System – INFO – Authorization for exchange16.tobien.net is valid
    25.08.2021 17:56:27 – LE System – INFO – Let’s refresh the order
    25.08.2021 17:56:27 – LE System – INFO – Let’s check if order is ready
    25.08.2021 17:56:27 – LE System – ERROR – Order is NOT ready

    Bitte Um Hilfestellung

    Antworten
    • Hi,

      soviel ich weiß, wird hier das Script nicht mehr weiterentwickelt. Such mal bei frankysweb.de nach Win-ACME, oder bei Google.
      Das funktioniert sehr gut.

      DM

      Antworten
  7. Hallo zusammen
    Nach einem Windows/Exchange Update funktioniert die Erneuerung des Zertifikats nicht mehr.

    Die Meldung im Logfile ist wie folgt:

    ACME Identifier – Error – Failed to create ACME Identifier for Cert Alias Certxxxx DNSName autodiscover.domain.local

    Kann mir jemand weiterhelfen?

    Vielen Dank für euren Support.

    Beste Grüsse

    Swift

    Antworten
  8. Hallo Mitstreiter,
    zunächst mein großes Dankeschön an Frank, dessen Anleitungen ich immer wieder gerne nehme, um meine Exchange Aufgaben zu bewältigen.
    Jetzt habe ich ein Problem, weil die Weberequests des Skripts mit Authentifizierung durch einen Proxy müssen, das aber nicht können. So sieht der Fehler aus:

    Can’t get authorization info;Der Remoteserver hat einen Fehler zurückgegeben: (407) Proxyauthentifizierung erforderlich.

    Hat jemand eine Idee, wie man dem CertificateAssisstant eine Proxy-Nutzung beibringen kann?
    Danke – Ingo

    Antworten
  9. 26.04.2021 07:41:07 – Exchange FQDNs – Warning – Unroutable Domains were found, sorted out
    26.04.2021 07:41:09 – Cannot issue for „ffff“: Domain name needs at least one dot

    => Die Domäne ffff gibt es nicht. Bitte die URLs im Script anpassen. Bei Bedarf die Konfiguration posten, dann können wir helfen …

    Antworten
  10. Hallo,

    das Script bring auf einen der Server diesen Fehler? Hat jemand eine Idee?

    26.04.2021 07:41:07 – Exchange FQDNs – Info – Make them unique
    26.04.2021 07:41:07 – Exchange FQDNs – Warning – Unroutable Domains were found, sorted out
    26.04.2021 07:41:07 – Exchange FQDNs – Info – FQDNs are unique
    26.04.2021 07:41:07 – LE System – Info – Setting LE Mode
    26.04.2021 07:41:08 – LE System – Info – Setting LE Mode to STAGE MODE (TESTING ONLY)
    26.04.2021 07:41:08 – LE System – Info – Checking for existing LE Account
    26.04.2021 07:41:08 – LE System – Info – Found a existing LE Account
    26.04.2021 07:41:08 – LE Certificate – Info – Trying to create a new order for a certificate
    26.04.2021 07:41:09 – LE Certificate – ERROR – Can’t order certificate: Error creating new order :: Cannot issue for „ffff“: Domain name needs at least one dot
    26.04.2021 07:41:09 – LE System – Info – Creating Autorisation files for LE verification
    Get-PAAuthorization : Das Argument kann nicht an den Parameter „AuthURLs“ gebunden werden, da es NULL ist.
    In C:\CertificateAssistant\CertificateAssistant_v3_EX2016-Test.ps1:501 Zeichen:21
    + $auths = $LEOrder | Get-PAAuthorizations
    + ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Get-PAAuthorization], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorNullNotAllowed,Get-PAAuthorization

    26.04.2021 07:41:09 – LE System – Info – Asking LE to verify the order
    Send-ChallengeAck : Das Argument kann nicht an den Parameter „ChallengeUrl“ gebunden werden, da es sich um eine leere
    Zeichenfolge handelt.
    In C:\CertificateAssistant\CertificateAssistant_v3_EX2016-Test.ps1:517 Zeichen:21
    + $auths.HTTP01Url | Send-ChallengeAck
    + ~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidData: (:) [Send-ChallengeAck], ParameterBindingValidationException
    + FullyQualifiedErrorId : ParameterArgumentValidationErrorEmptyStringNotAllowed,Send-ChallengeAck

    26.04.2021 07:41:09 – LE System – Info – Successfully informed LE to verify the order
    26.04.2021 07:41:09 – LE System – INFO – Let’s give LE some time to validate (1 min)

    Antworten
  11. Hallo Jens,

    danke für die Analyse und die zusätzlichen Befehle. Hat mir echt weiter geholfen. Alledings komme ich jetzt nicht weiter:
    Prüfe Let’s Encrypt Registrierung…
    Get-ACMERegistration : No registrations found
    In C:\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
    New-ACMERegistration : Account creation on ACMEv1 is disabled. Please upgrade your ACME client to a version that
    supports ACMEv2 / RFC 8555. See https://community.letsencrypt.org/t/end-of-life-plan-for-acmev1/88430 for details.
    In C:\CertificateAssistant.ps1:246 Zeichen:21
    + … Registration = New-ACMERegistration -Contacts $contactmail -AcceptTos
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : PermissionDenied: (ACMESharp.Vault.Model.RegistrationInfo:RegistrationInfo) [New-ACMEReg
    istration], AcmeWebException
    + FullyQualifiedErrorId : urn:acme:error:unauthorized (403),ACMESharp.POSH.NewRegistration
    Fehler: Es konnte keine Registrierung bei Let’s Encrypt durchgeführt werden

    Antworten
  12. Hallo @ll,

    Ich hatte am Monatg mal einen richtig spannenden Administrationstag…

    Prolog:

    Ein Kunde mit Exchange 2016 und Zertifikaten von LetsEnrypt und dem CertificateAssistant_v2_EX2016 meldete Zertifikatsfehler… keine große Nummer war mein Gedanke – bestimmt wieder die Aufgabenplanung, aber Fehlanzeige:

    Akt1:
    Der Task lief barv – aber
    29.02.2020 23:00:40;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert290220202300-1 DNSName autodiscover.kunde.de;
    04.03.2020 21:15:53;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert040320202115-1 DNSName autodiscover.kunde.de;
    01.04.2020 00:00:41;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert010420200000-1 DNSName autodiscover.kunde.de;
    30.04.2020 23:00:45;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert300420202300-1 DNSName autodiscover.kunde.de;

    Den Fehler kannte ich schon – aber die gleiche Ursache (IPV6 im DNS) war es nicht.. dieses Mal war es IISCrypto – denn am 26.02. habe ich mich um Verschlüsselungsprobleme auf diesem Server gekümmert – einige Gegenstellen haben gezickt… dummerweise war ich ein wenig forsch – denn LetsEncrypt scheint TLS 1.2 nicht zu reichen.

    Eigentlich hätte ich hier fertig sein können – aber

    Akt2:
    04.05.2020 16:07:56;Certificate;Error;Failed to submit the certificate for signing;Der Zugriff auf den Pfad „C:\ProgramData\ACMESharp\sysVault\45-KEYPM\
    Den Fehler kannte ich – schön, wenn man seine eigenen Einträge hier nutzen kann, um sich zu helfen:
    Default Domain Policy unter Computerkonfiguration, Richtlinien, Windows-Einstellungen, Sicherheitseinstellungen, Richtlinien für öffentliche Schlüssel, Verschlüsseltes Dateisystem.
    Zu Ende? Nöööö

    Akt3:
    04.05.2020 17:51:17;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert040520201751-1 DNSName autodiscover.kunde.de;
    04.05.2020 17:51:18;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert040520201751-2 DNSName owa.kunde.de;

    Jetzt wurde es spannend…
    Geholfen hat mir das CertificateAssistant.ps1 – die Urversion – die sagte mir, dass ich zu viele Fehlversuche bei LetsEncrypt hatte. Also erst mal Abendbrot essen.

    Akt4:
    04.05.2020 20:24:31;Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: autodiscover.kunde.de, owa.kunde.de“,
    „status“: 403
    }

    Port 80 war offen,
    Eine per Hand unter C:\inetpub\wwwroot\Well-Known\acme-challenge\test.html angelegte Datei konnte ich über http und https von außen erreichen
    http://owa.kunde.de/Well-Known/acme-challenge/test.html

    Nun habe ich mir gedacht, probieren wir mal die neue Version des Scripts aus – gedacht habe ich mir das schon vorher aber geklappt hat es nicht:

    Akt 5:
    Das CertificateAssistant_v3_EX2016.ps1 möchte gern eine neue ACME-version benutzen, Posh-ACME, auf einem Server 2016 klappt das aber nicht.
    Diese Befehle helfen:
    [Net.ServicePointManager]::SecurityProtocol = [Net.SecurityProtocolType]::Tls12
    Install-Module PowerShellGet -RequiredVersion 2.2.4 -SkipPublisherCheck
    Install-Module -Name Posh-ACME -force -confirm:$false

    Akt6:
    Die dritte Version des Scripts hat mir die Lösung gebracht: Sie hat geschimpft:
    04.05.2020 21:53:18;IIS;Info;Trying to create .Well-Known Directory;
    04.05.2020 21:53:18;IIS;Info;Well-Known Folder already exists, skipping;
    04.05.2020 21:53:18;IIS;Info;Eroor Creating and enabling Well-Known Folder: Dateiname:
    Fehler: Doppelter Auflistungseintrag vom Typ „mimeMap“ mit auf „.“ festgelegtem eindeutigen Schlüsselattribut „fileExtension“ kann nicht hinzugefügt werden.
    Ich habe die beiden .well-known –Verzeichnisse mit samt Inhalt gelöscht und dann war ich endlich fertig

    Dem 2er Sript war das übrigens egal:
    04.05.2020 21:40:56;IIS;Info;Successfully changed Let’s Encrypt IIS directory to http;
    04.05.2020 21:40:56;IIS;Info;Checking Let’s Encrypt IIS directory to accept validation by http request;
    04.05.2020 21:40:56;IIS;Info;.well-known directory accepts http;
    04.05.2020 21:40:56;LE Challange;Info;Try to submit challenge;
    04.05.2020 21:40:56;LE Challange;Info;Try to submit challenge;

    Finale:
    Gegen halb 11 war ich dann endlich fertig:
    04.05.2020 22:21:42;Exchange;Info;Lets try to enable certificate for Exchange Server;
    04.05.2020 22:21:42;Exchange;Info;Exchange Server Version: Version 15.1 (Build 1415.2);
    04.05.2020 22:21:46;Exchange;Info;Successfully imported and enabled Certificate;
    04.05.2020 22:21:46;SendMail;Info;E-Mail settings are disabled;
    04.05.2020 22:21:46;End;Info;End of script;

    E-Mail-Benachrichtigung habe ich dann noch eingeschaltet… ich brauche nur noch die Zeit, um sie zu lesen…

    Viele Grüße aus Berlin
    Jens

    Antworten
  13. Hezte böse auf die Nase gefallen.

    Das Passwort darf auf KEINEN Fall ein $ enthalten!

    Man hab ich mich tot gesucht.
    Franky, evtl. noch einen kurzen check auf ungültige Zeichen im Kennwort einbauen.

    Antworten
  14. Erstmals Danke für das Script Frank! Echt sehr nützlich.
    Ich hätte vielleicht noch einen Schönheitsfix, bin gerade draufgekommen bei Einrichten als Task.
    Wenn New-PAOrder vor dem RenewAfter Datum ausgeführt wird bleibt das Script hängen und wartet auf Bestätigung. Ist jetzt kein Problem, ich beende den Task nach einer halben Stunde sowieso. Aber mit einem
    (Get-Date) -lt (Get-Date $order.RenewAfter)
    könnte man es in Log schreiben?
    Danke
    Philipp

    Antworten
  15. Leider klappt das aktuell nicht mehr:
    W2k8R2 Ex2010
    PS C:\CertificateAssistant> .\CertificateAssistant_v3_EX2010.ps1
    06.04.2020 11:22:07 – System – Info – Geting system parameters
    06.04.2020 11:22:07 – System – Info – Certificate Assistant Exchange 2010 Version
    06.04.2020 11:22:07 – System – Info – PowerShell Version: 5.1.14409.1018 OSVersion: 6.1.7601.65536
    06.04.2020 11:22:07 – Check Posh-ACME – Info – Check if Module installed
    06.04.2020 11:22:07 – Load Posh-ACME – Info – Posh-ACME is installed, try to load it
    06.04.2020 11:22:08 – Load Posh-ACME – Info – Module Import was successfull, PoshACMEVersion 3.12.0
    06.04.2020 11:22:08 – Load Exchange SnapIns – Info – Try to load Exchange SnapIns
    06.04.2020 11:22:09 – Load Exchange SnapIns – Info – Sucessfully loaded Exchange SnapIns
    06.04.2020 11:22:09 – IIS – Info – Trying to create .Well-Known Directory
    06.04.2020 11:22:09 – IIS – Info – Well-Known Folder already exists, skipping
    06.04.2020 11:22:09 – IIS – Warning – Mime Type was not added to Well-Known folder, maybe it was already added
    06.04.2020 11:22:09 – IIS – Info – Changing Let’s Encrypt IIS directory to http
    06.04.2020 11:22:09 – IIS – Info – Successfully changed Let’s Encrypt IIS directory to http
    06.04.2020 11:22:09 – IIS – Info – Checking Let’s Encrypt IIS directory to accept validation by http request
    06.04.2020 11:22:09 – IIS – Info – .well-known directory accepts http
    06.04.2020 11:22:09 – Custom FQDNs – Info – Using Custom FQDNs is configured
    06.04.2020 11:22:09 – LE System – Info – Setting LE Mode
    06.04.2020 11:22:09 – LE System – Info – Setting LE Mode to PRODUCTION MODE (LIVE SYSTEM)
    06.04.2020 11:22:09 – LE System – Info – Checking for existing LE Account
    06.04.2020 11:22:09 – LE System – Info – Found a existing LE Account
    06.04.2020 11:22:09 – LE Certificate – Info – Trying to create a new order for a certificate
    06.04.2020 11:22:15 – LE Certificate – Info – Successfully ordered certificate
    06.04.2020 11:22:15 – LE System – Info – Creating Autorisation files for LE verification
    06.04.2020 11:22:19 – LE System – Info – Asking LE to verify the order
    06.04.2020 11:22:22 – LE System – Info – Successfully informed LE to verify the order
    06.04.2020 11:22:22 – LE System – INFO – Let’s give LE some time to validate (1 min)
    06.04.2020 11:23:22 – LE System – INFO – Time to wake up, need coffee!
    06.04.2020 11:23:22 – LE System – INFO – Let’s check the authorization
    06.04.2020 11:23:26 – LE System – INFO – Authorization for mail.zzzz.de is valid
    06.04.2020 11:23:26 – LE System – INFO – Authorization for mail.yyyyy.de is valid
    06.04.2020 11:23:26 – LE System – INFO – Authorization for autodiscover.zzzz.de is valid
    06.04.2020 11:23:26 – LE System – INFO – Let’s refresh the order
    06.04.2020 11:23:26 – LE System – INFO – Let’s check if order is ready
    06.04.2020 11:23:26 – LE System – ERROR – Order is NOT ready
    PS C:\CertificateAssistant>

    Antworten
  16. Hallo zusammen,

    ich hatte das gleiche Problem mit der Aufgabenplanung, dass das Script nicht durchlief.
    Im Script für den Exchange 2010 habe ich dann ein Argument hinzugefügt.
    Damit scheint es zu laufen.
    Problem ist, das Powershell stehen bleibt, ob es das bestehenden File überschreiben soll.

    Hier meine Änderung:
    Zeile 471: $LEOrder = New-PAOrder $CertNames -PfxPass $PFXPasswort -Force

    Das Argument -Force brachte die Verbesserung, da das File automatisch überschrieben wird.
    Ich werde es mal testen ob das die Lösung ist.
    Hab das ganze hier gefunden:
    https://github.com/rmbolger/Posh-ACME/blob/master/Posh-ACME/Public/Submit-Renewal.ps1

    Gruß Michael

    Antworten
  17. Hallo – ja das „CertificateAssistant_v3_EX2016.ps1“ benutzt ACMEv2 – bei mir hat er ohne (große) Probleme Exchange 2019 auf Server 2019 mit den gewünschten Zertifikaten versorgt…

    Viele Grüße aus Berlin
    Jens

    Antworten
  18. Nach der letzten Aktualisierung des Zertifikats am 1. Februar erhielt ich von Let’s Encrypt eine EMail mit der Bitte, meine Software zu aktualisieren. ACMESharp verwendet noch das ACMEv1-Protokoll und dieses wird zum 1. Juni eingestellt.
    Auf GitHub (https://github.com/ebekker/ACMESharp) sehe ich, daß für ACMEv2 ich ACMESharp Core verwenden müßte. Muß hierfür das Skript irgendwie aktualisiert werden?

    Antworten
  19. Hallo,
    hatte gestern ein kleines Problem mit dem EX2010 Script auf einem SBS2011 (mit WMF5.1).
    Nach ein wenig debugging habe ich festgestellt, dass Zeile 203 wie folgt angepasst werden müsste:

    $WebsitePath = (Get-Website | Where-Object {$_.Name -eq „Default Web Site“}).PhysicalPath

    Dann funktioniert es wie gewünscht.

    Antworten
  20. Ich bekomme mit dem Skript Ex2013 v3 immer die Meldung „order not ready“.
    Die Autorisierung für insgesamt 4 Namen wird als „valid“ zurückgegeben.
    Wie kommt das ?

    Antworten
  21. Hallo Frank,
    ich nutze seit 2 Jahren dein Tool und es funktioniert wirklich super! Heute habe ich die Meldung bekommen, dass Mitte 2020 von ACME1 auf AVME2 umgestellt wird. Hast du schon etwas in Planung?

    Antworten
  22. Hallo Frank,
    erstmal vielen Dank für deine tollen Ausführungen und den bebilderten Anleitungen, die haben mir schon sehr geholfen!

    Ich habe eine kurze Frage zur Automatisierung über den Aufgabenplaner, bzw. allgemein bei erneutem Aufrufen des Scripts.

    Wenn ich im Aufgabenplaner die Aufgabe anlege, so wie du Sie auch angelegt hast und dann manuell die Aufgabe starte (um zu testen, ob alles korrekt eingetragen wurde und die Berechtigungen passen) dann bleibt das Logfile bei Zeile „Certificate;Info;Trying to create a new order for a certificate;“ stehen.

    Ich habe das Script dann einfach nochmal händisch über die Powershell ausgeführt und gesehen, dass folgender Dialog das weitere ausführen des Scripts verhindert:

    19.12.2019 23:30:23 – LE Certificate – Info – Trying to create a new order for a certificate

    Existing order has not reached suggested renewal window.
    Do you wish to overwrite?
    [J] Ja [N] Nein [H] Anhalten [?] Hilfe (Standard ist „J“):

    Jetzt meine Frage dazu: wie lange ist das „suggested renewal window“ und ab wann? Und wird das Script ohne Dialog durchlaufen, wenn ich in diesem Zeitfenster bin?
    Falls das Script dann trotzdem eine Eingabe benötigt, kann ich diesen Dialog irgendwie zu „J“ forcen, sodass jeden Monat versucht wird das Zertifikat zu erneuern?

    Über kurze Rückmeldung deinerseits würde ich mich freuen,
    danke und Gruß aus der schönen Eifel,
    Dominik

    Antworten
  23. Hallo,
    ich bin gerade dabei eine Migration von einem SBS2011 zu Exchange 2016 durchzuführen.
    Beim neuen Exchange möchte ich ein Let´s Encrypt Zertifkat einsetzen und versuche es mit dem „CertificateAssistant“ zu erstellen.
    Leider kommt bekomme ich immer folgende Fehlermeldung:
    Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: autodiscover.xxxx.de, mail.xxxx.de“,
    „status“: 403
    }
    Die beiden Subdomain habe ich beim Provider angelegt und einen DNS Eintrag auf die Feste IP meines Internetprovider hinterlegt. Die Firewall leitet die Ports 80 und 443 direkt auf den Exchange. Es sind beide Ports von außen erreichbar.
    Es wäre super, wenn ich hierbei einwenig Unterstützung bekäme, bin echt bald am verzweifeln.
    Vielen Dank.

    Antworten
  24. ein Workaround für die aktuell „Exchange 2010 Migratrionsgeplagten“, die schon einen bestehende LE Registrierung haben, hat bei mir Funktioniert. Kopie von des Ordners „.well-known“ von c:\inetpub\wwwroot\ alten Exchange auf neuen Exchange. Kopie des Ordner „ACMEShap“ von c:\programdata alten Exchange in neuen Exchange. Einstellungen im IIS-Manager neuer Server vornehmen: httpHanders, SSL aus, anonymus auth (https://github.com/PKISharp/win-acme/wiki/Validation-issues). Script läuft dann wieder am neuen Server (bitte das Richtige nehmen (2016). Script erkennt bestehende Registrierung und erstellt neues Zertifikat. ( An dieser Stelle auch mal Dank an Franky für seine Arbeit“

    Antworten
  25. Moin,
    der Clou an dem Script war bzw. ist, dass der Exchangeserver selbst sich Zertifikate generieren konnte bzw. kann – das ist mir bewusst. Mit dem Skript bin ich damals gestartet – 1000 Dank nochmals an der Stelle :-)
    Ich benutze seit einigen Monaten „lediglich“ den abgeänderten Skripteil für den Exchangeserver, mit dem das Zertifikat beim Exchangeserver 2016 ausgetauscht wird, da ein Linux-Server (Ubuntu) mein Multi-Wildcard-Zertifikat abholt. Mittels Powershell, openSSL, Putty und PSFtp generiere ich mir -skriptbasiert- vom Windowsserver aus meine PFX-Datei, nachdem die aktuellen Dateien vom Ubuntu-Server heruntergeladen wurden.
    Das Skript(-konstrukt) startet aufgabenbasiert täglich, lädt das aktuelle Zertifikat herunter, vergleicht es mit dem aktuellen – und nur wenn sich das Zertifikat geändert hat wird „die weitere Kette“ in Gang gesetzt.
    Wie ihr euch vorstellen könnt, wird dieses Zertifikat noch an weiteren Stellen benötigt.

    Mir ist bewusst, dass für viele dieser weitere Server und vor allem „das Frickelwerk“ nicht zielführend ist, aber ich finde die Zeit „vorneweg“ ist gut investierte Zeit, damit die Zeit „hinten raus“ gespart wird – und das war wieder allerdings mehr Zeit benötigt, als ich gedacht habe…ihr kennt das :-)

    Bei regem Interesse und Ideen einer Plattform (wie wäre es mit Frankys neuem Forum) kann ich euch „das Zeug“ gerne zukommen lassen.

    Antworten
    • Hallo Chris,

      wärst DU so freundlich mir Dein Script zum Austausch des Exchange Zertifikat zukommen zu lassen? Auch ich lasse von einem Ubuntu Server mein Wildcard Zertifikat abholen und lege es für alle anderen Server auf einem Netzwerkshare ab. Von dort habe ich verschiedene Scripte zum Austausch gebastelt. Unsere Watchguard Firewall und Barracuda Antispam Appliance erhalten dadurch immer das aktuelle Zertifikat. Nur der Exchange fehlt mir noch in der Kette. Wäre echt nett.

      Gruß
      Klaus

      Antworten
  26. Hallo,
    Ich habe heute (11.10.2019) versucht mit Hilfe des downgeloadeten Scripts dieser Seite auf einem Exchange 2016 / Server 2016 ein Let’s Encrypt Zertifikat zu installieren. Leider scheitert die Ausführung des Scipts nach Installation der ACMESharp und ACMESharp.providers.iis Module beim Erstellen des Vaults mit der Fehlermeldung, dass ACMEV1 nicht mehr unterstützt wird. Habe ich etwa ein veraltetes Script oder ist die tolle Zeit für die hier gefundene Lösung tatsächlich vorbei oder habe ich irgendwo etwas „überlesen“?

    Ganz herzliche Grüße und natürlich mal einen herzlichen Dank für die vielen Tips, die ich schon von Franky nutzen konnte.

    Eckhard

    Antworten
  27. Hallo zusammen

    Das Script funktioniert wunderbar, ich konnte es bereits bei einige Kunden erfolgreich einsetzen. Nun habe ich wieder ein Kandidat aber es gibt hier ein „Problem“. Kunde hat keine fixe IP und holt sich seine E-Mails mittels PopConnector. Somit funktioniert die Anlage an sich gut aber ich kann nur DynDNS nutzen um den Host zu finden. Zudem nutzt er ein self-signed Zertifikat in Exchange und das möchte ich loswerden.

    Hat schon jemand die Exchange URI so angepasst, dass sie auf „kunde.dyndns.org“ zeigen und danach das Script in Betrieb genommen? Natürlich müssen CNAME-Einträge „domain.ch“ und „autodiscover.domain.ch“ auch noch erstellt werden, die müssen dann auf den „kunde.dyndns.org“ Host zeigen.
    Gibt es sonst noch etwas zu beachten?

    Vielen Dank und Grüsse
    Eric

    Antworten
    • Hallo Eric,

      bei Kunden mit DynDNS-Adressen setze ich i.d.R. einen CNAME-Eintrag bei dem Provider, der die Maildomain verwaltet, also z.B. autodiscover.kundendomain.ch -> kunde.dyndns.org . Die URI auf dem Exchange setze ich dann auch auf autodiscover.kundendomain.ch .

      Ich passe den lokalen DNS entsprechend an, so dass der interne DNS einen A-Record hat, der autodiscover.kundendomain.ch auf die lokale IP-Adresse des Exchange verweist.

      Dadurch muss im Zertifikat nur die autodiscover.kundendomain.ch erscheinen. Durch den CNAME-Eintrag beim Provider funktioniert auch das Autodiscover von mobilen Clients und dem Exchange-Server hinter der DynDNS-Adresse wunderbar.

      Grüße,
      Jörg

      Antworten
      • Hallo Jörg

        Ah, das leuchtet ein und ist sicher die bessere Lösung als die dyndns.org Domäne in alle URI zu verwenden.
        Vielen Dank für die ausführliche Erklärung, die werde ich diese Woche mal umsetzen.

        Freundliche Grüsse
        Eric

        Antworten
      • Hallo Jörg

        Das hat sehr gut funktioniert. Allerdings gab es direkt nach der Umstellung Probleme mit Outlook. Zuerst hatte ich neue Outlook Profile eingerichtet (ging problemlos mit Autodiscover) und dann gab es „Proxy Fehler“, Zertifikat-Fehler und das „Outlookfenster kann nicht angezeigt werden“. Zudem wollte Outlook ständig verbinden mit einer der alte URI/Hostname. Da ich auch die URI angepasst hatte, habe ich mal ein IISRESET ausgeführt damit die neue Einstellungen neu geladen werden. Damit war das Problem weg.

        Morgen geht es gleich weiter mit der nächste Anlage ;-)

        Nochmals vielen Dank und Grüsse
        Eric

        Antworten
  28. Hi Frank,
    hab das Script auf meinem frischen Exchange 2019 mit Win2019 Datacenter ausprobiert und lief ohne Probleme , top :)
    Vielen dank für deine Tutorials,
    LG Alex

    Antworten
  29. Hallo Franky,

    eventuell gibt es die Möglichkeit ja schon und ich habe sie nur nicht gefunden aber ich habe mich gefragt ob es möglich ist das alte Zertifikat mit dem Skript löschen zu lassen, es sammeln sich ja sonst Unmengen an Zertifikaten auf dem Exchange an.
    Oder macht man das auf einem anderen Weg?

    Viele Grüße
    Michael

    Antworten
  30. Hallo @ll

    den „Error creating new cert :: authorizations for these names not found or expired: „, „status“: 403 hatte ich auch ….

    IPV6 war auch bei mir der Grund für viele Stunden Rätsel raten… beim Provider stand es drin – die Firewall sagte nein…

    Viele Grüße Jens

    Antworten
  31. Neuer Fehler nach der öffnung von Port 80 und 443 auch ausgehend auf der W$ Firewall:

    23.07.2019 12:14:00;Check Vault;Info;Vault found;
    23.07.2019 12:14:00;Check Registration;Info;Lets check if exists a LE registration;
    23.07.2019 12:14:00;Check Registration;Info;Found registration;
    23.07.2019 12:14:01;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert230720191214-1 DNSName autodiscover.meinedomain.de;
    23.07.2019 12:14:02;ACME Identifier;Error;Failed to create ACME Identifier for Cert Alias Cert230720191214-2 DNSName outlook.meinedomain.de;
    23.07.2019 12:14:02;ACME Identifier;Info;Updating ACME Identifiers;
    23.07.2019 12:14:02;IIS;Info;Changing Let’s Encrypt IIS directory to http;
    23.07.2019 12:14:04;IIS;Info;Successfully changed Let’s Encrypt IIS directory to http;
    23.07.2019 12:14:04;IIS;Info;Checking Let’s Encrypt IIS directory to accept validation by http request;
    23.07.2019 12:14:04;IIS;Info;.well-known directory accepts http;
    23.07.2019 12:14:04;LE Challange;Info;Try to submit challenge;
    23.07.2019 12:14:04;LE Challange;Info;Try to submit challenge;
    23.07.2019 12:14:04;Certificate;Info;Try to create the certificate;
    23.07.2019 12:14:04;Certificate;Warning;Using autodiscover.meinedomain.de as certificates CN;
    23.07.2019 12:14:04;Certificate;Error;Failed to create the certificate SAN230720191214;Unable to find an Identifier for the given reference

    Antworten
  32. Moin,

    hier meine Ausgabe aus dem Log:
    TimeStamp;ScriptSection;Type;Message;ErrorDetails
    23.07.2019 11:35:19;System;Info;Geting system parameters;
    23.07.2019 11:35:19;System;Info;Certificate Assistant Exchange 2016 Version;
    23.07.2019 11:35:19;System;Info;PowerShell Version: 5.1.17763.592 OSVersion: 10.0.17763.0;
    23.07.2019 11:35:19;Check ACMEModule;Info;Check if Module installed;
    23.07.2019 11:35:19;Check ACMEModule IIS;Info;Check if IIS Extension is installed;
    23.07.2019 11:35:19;Load ACMEModule;Info;ACMEModule is installed, try to load it;
    23.07.2019 11:35:19;Load ACMEModule;Info;Module Import was successfull, ACMESharpVersion 0.9.1.326;
    23.07.2019 11:35:19;Load ACMEModule IIS;Info;ACMEModule IIS extension is installed, try to load it;
    23.07.2019 11:35:19;Load ACMEModule IIS;Info;ACMEModule IIS extension already loaded;
    23.07.2019 11:35:19;Verify ACME Handler;Info;Successfully verified ACME IIS Challange Handler;
    23.07.2019 11:35:19;Load Exchange SnapIns;Info;Try to load Exchange SnapIns;
    23.07.2019 11:35:19;Load Exchange SnapIns;Info;Sucessfully loaded Exchange SnapIns;
    23.07.2019 11:35:19;Load IIS Module;Info;Try to import IIS Webserver Modules;
    23.07.2019 11:35:19;Load IIS Module;Info;Import successfully;
    23.07.2019 11:35:19;Exchange FQDNs;Info;Getting Exchange FQDNs;
    23.07.2019 11:35:19;Exchange FQDNs;Info;Getting local Exchange Server Name;
    23.07.2019 11:35:19;Exchange FQDNs;Info;Local Exchange Name KS-EX01;
    23.07.2019 11:35:19;Exchange FQDNs;Info;Getting Autodiscover Hostname;
    23.07.2019 11:35:20;Exchange FQDNs;Info;Autodiscover Hostname autodiscover.meine_domain.de;
    23.07.2019 11:35:20;Exchange FQDNs;Info;Getting Exchange Outlook Anywhere External FQDN;
    23.07.2019 11:35:20;Exchange FQDNs;Info;Exchange Outlook Anywhere External FQDN outlook.meine_domain.de;
    23.07.2019 11:35:20;Exchange FQDNs;Info;Getting Exchange Outlook Anywhere Internal FQDN;
    23.07.2019 11:35:21;Exchange FQDNs;Info;Exchange Outlook Anywhere Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:21;Exchange FQDNs;Info;Getting Exchange OAB External FQDN;
    23.07.2019 11:35:22;Exchange FQDNs;Info;Exchange OAB External FQDN outlook.meine_domain.de;
    23.07.2019 11:35:22;Exchange FQDNs;Info;Getting Exchange OAB Internal FQDN;
    23.07.2019 11:35:23;Exchange FQDNs;Info;Exchange OAB Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:23;Exchange FQDNs;Info;Getting Exchange EAS Internal FQDN;
    23.07.2019 11:35:24;Exchange FQDNs;Info;Exchange EAS Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:24;Exchange FQDNs;Info;Getting Exchange EAS External FQDN;
    23.07.2019 11:35:26;Exchange FQDNs;Info;Exchange EAS External FQDN outlook.meine_domain.de;
    23.07.2019 11:35:26;Exchange FQDNs;Info;Getting Exchange EWS Internal FQDN;
    23.07.2019 11:35:27;Exchange FQDNs;Info;Exchange EWS Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:27;Exchange FQDNs;Info;Getting Exchange EWS External FQDN;
    23.07.2019 11:35:28;Exchange FQDNs;Info;Exchange EWS External FQDN outlook.meine_domain.de;
    23.07.2019 11:35:28;Exchange FQDNs;Info;Getting Exchange ECP Internal FQDN;
    23.07.2019 11:35:29;Exchange FQDNs;Info;Exchange EWS Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:29;Exchange FQDNs;Info;Getting Exchange ECP External FQDN;
    23.07.2019 11:35:31;Exchange FQDNs;Info;Exchange ECP External FQDN outlook.meine_domain.de;
    23.07.2019 11:35:31;Exchange FQDNs;Info;Getting Exchange OWA Internal FQDN;
    23.07.2019 11:35:32;Exchange FQDNs;Info;Exchange OWA Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:32;Exchange FQDNs;Info;Getting Exchange OWA External FQDN;
    23.07.2019 11:35:34;Exchange FQDNs;Info;Exchange OWA ExternalFQDN outlook.meine_domain.de;
    23.07.2019 11:35:34;Exchange FQDNs;Info;Getting Exchange MAPI Internal FQDN;
    23.07.2019 11:35:34;Exchange FQDNs;Info;Exchange MAPI Internal FQDN outlook.meine_domain.de;
    23.07.2019 11:35:34;Exchange FQDNs;Info;Getting Exchange MAPI External FQDN;
    23.07.2019 11:35:35;Exchange FQDNs;Info;Exchange MAPI External FQDN outlook.meine_domain.de;
    23.07.2019 11:35:35;Exchange FQDNs;Info;Make them unique;
    23.07.2019 11:35:35;Exchange FQDNs;Info;FQDNs are unique;
    23.07.2019 11:35:35;Check Vault;Info;Lets check if exists a vault;
    23.07.2019 11:35:35;Check Vault;Info;Vault found;
    23.07.2019 11:35:35;Check Registration;Info;Lets check if exists a LE registration;
    23.07.2019 11:35:35;Check Registration;Info;Found registration;
    23.07.2019 11:35:36;ACME Identifier;Info;Successfully added ACME Identifier for Cert Alias Cert230720191135-1 DNSName autodiscover.meine_domain.de;
    23.07.2019 11:35:37;ACME Identifier;Info;Successfully added ACME Identifier for Cert Alias Cert230720191135-2 DNSName outlook.meine_domain.de;
    23.07.2019 11:35:37;ACME Identifier;Info;Using Cert230720191135-2 DNSName outlook.meine_domain.de as certificates CN;
    23.07.2019 11:35:37;ACME Identifier;Info;Updating ACME Identifiers;
    23.07.2019 11:35:38;ACME Identifier;Info;Successfully updated ACME Identifier for Cert Alias Cert230720191135-1;
    23.07.2019 11:35:39;ACME Identifier;Info;Successfully updated ACME Identifier for Cert Alias Cert230720191135-2;
    23.07.2019 11:35:39;ACME Challange;Info;Completed ACME Challenge for Alias Cert230720191135-1;
    23.07.2019 11:35:40;ACME Challange;Info;Completed ACME Challenge for Alias Cert230720191135-2;
    23.07.2019 11:35:40;IIS;Info;Changing Let’s Encrypt IIS directory to http;
    23.07.2019 11:35:41;IIS;Info;Successfully changed Let’s Encrypt IIS directory to http;
    23.07.2019 11:35:41;IIS;Info;Checking Let’s Encrypt IIS directory to accept validation by http request;
    23.07.2019 11:35:41;IIS;Info;.well-known directory accepts http;
    23.07.2019 11:35:41;LE Challange;Info;Try to submit challenge;
    23.07.2019 11:35:42;LE Challange;Info;Submitted challenge for Alias Cert230720191135-1;
    23.07.2019 11:35:43;LE Challange;Info;Submitted challenge for Alias Cert230720191135-2;
    23.07.2019 11:35:43;LE Challange;Info;Try to submit challenge;
    23.07.2019 11:35:44;LE Challange;Info;Updated Identifier for Alias Cert230720191135-1;
    23.07.2019 11:35:44;LE Challange;Info;Updated Identifier for Alias Cert230720191135-2;
    23.07.2019 11:35:44;Certificate;Info;Try to create the certificate;
    23.07.2019 11:35:44;Certificate;Info;Using Cert230720191135-2 as certificates CN;
    23.07.2019 11:35:44;Certificate;Info;Certificate creation successfully, Alias SAN230720191135;
    23.07.2019 11:35:44;Certificate;Info;Try to submit the certificate to Let’s Encrypt;
    23.07.2019 11:35:46;Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: autodiscover.meine_domain.de, outlook.meine_domain.de“,
    „status“: 403
    }

    liebe Grüße
    Rene

    Antworten
  33. Hallo,

    habe das Script heute ausgeführt und auch zum laufen gebracht. Leider ist etwas mit dem Passwort schief gelaufen. Dieses habe ich in den Powershell Datei manuell eingetragen, aber nun sagt er mir beim öffnen der erstellten PFX Datei, dass das Passwort falsch sei. Ich habe es 1:1 aus dem Script kopiert, wie ich es geschrieben habe, aber er behaupten trotzdem, dass es falsch sei. Wo ist da das Problem bzw. kann man das Passwort ändern?

    Vielen Dank

    Antworten
  34. Hallo,

    wie setzt man das Script am besten in einer kleinen DAG Umgebung ein. Würde man das Script auf 2 Servern zum Einsatz bringen, dann entstehen doch zwei Zertifikate mit unterschiedlichem Fingerprint? Wie schaffe ich es also auf dem 2. Server das Zertifikat automatisiert abzulegen?

    Danke für Ideen dazu.

    Antworten
    • In einer DAG sollte das Zertifikat am Load Balancer liegen.

      Ich kann mir jedoch vorstellen, das mit Export-ExchangeCertificate und Import-ExchangeCertificate das Zertifikat auch auf zwei Servern gleichzeit betrieben werden kann.
      Man muss sich darüber Gedanken machen, wie man den ThumbPrint des aktuell gültigen Zertifikats ausliest und diese dem Export-ExchangeCertificate mitgibt.

      Antworten
  35. Hey,
    leider gibts bei mir auch nen Problem:
    28.03.2019 12:26:38 – Check Registration – Info – Lets check if exists a LE registration
    28.03.2019 12:26:38 – Check Registration – Warning – No Registration found, try to create one
    28.03.2019 12:26:40 – Check Registration – Error – Can’t create registration, exiting script

    jemand eine Idee?

    Antworten
    • Bei mir kommt der selbe Fehler:

      4.04.2019 20:22:05 – Check Vault – Info – Lets check if exists a vault
      04.04.2019 20:22:05 – Check Vault – Info – Vault found
      04.04.2019 20:22:05 – Check Registration – Info – Lets check if exists a LE registration
      04.04.2019 20:22:05 – Check Registration – Warning – No Registration found, try to create one
      04.04.2019 20:22:07 – Check Registration – Error – Can’t create registration, exiting script

      Die Powershell wurde als Administrator gestartet.

      Antworten
  36. Hallo Frank, vielen Dank für die tollen Anleitungen!!!!

    Ich habe heute das Script ausgeführt und bekomme folgende Meldung:
    Den AD Server 2016 und Exchange 2016 sind frisch aufgesetzt.

    09.02.2019 11:08:35;Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: autodiscover.hab-ich-hier-ersetzt.de“,
    „status“: 403
    }

    Antworten
  37. Hallo Frank,

    Vielen Dank für die schnelle Antwort!
    Glaubst du es ist möglich automatisiert Zertifikate aus der UTM im Exchange zu „recyclen“, d.h. inklusive dem privaten Teil z zu übertragen und dort ebenfalls zu nutzen (eine korrekte Konfiguration der benötigten Domains in der UTM vorausgesetzt)?

    Danke schon mal vorab!
    Christoph.

    Antworten
    • Hallo Christoph,
      ich denke da ist es anderes herum einfacher. Eine kleine VM welche die Zertifikate holt und dann an alle Zielsysteme verteilt. Dafür gibt es auch schon ein paar Scripte die man weiter verwenden könnte. Man muss da allerdings selbst ein bissel Hand anlegen.
      Gruß,
      Frank

      Antworten
  38. Hallo Frank,
    ist es auch möglich, die let’s encrypt Zertifikate via DNS-TXT-Record auszustellen?
    Hintergrund: Wir haben auf der einzigen DSL-Verbindung auf 443 bereits ein Sophos UTM 9.6 mit Lets Encrypt laufen (für andere Dienste z.B. Nextcloud und Zeiterfassung) und hätten aber trotzdem gerne auch auf dem Exchange Let’s encrypt.

    Hast du da einen heißen Tipp für uns?

    Herzlichen Dank!!!
    Christoph.

    Antworten
    • Hallo Christoph,
      mit diesem Script ist es nicht möglich. Zwar bietet das ACMESharp-Modul die Möglichkeit Domains via DNS zu validieren, im Script wird dies allerdings nicht genutzt. Der Hintergrund: Die DNS Records lassen sich nur schwer automatisieren. Mit etwas Aufwand lässt sich das Script allerdings entsprechend an die eigene Umgebung anpassen.
      Gruß,
      Frank

      Antworten
  39. Wir haben seit etwa einem Monat unseren lokalen Exchange 2016 Hybrid mit Office365 laufen.

    Durch die nötige Anpassung der DNS-Einträge zeigte der Autodiscover-Hostname nun natürlich nicht mehr auf unseren lokalen Exchange sondern auf den von MS.
    Das Skript brach folgerichtig mit einem 403 Error bei der Erneuerung des Zertifikates ab.

    Habe den weiter oben geposteten Tipp durchgeführt und die automatische Erkennung der Hostnamen im Skript deaktiviert, jetzt läuft es wieder!

    Hoffe bis zum Wochenende sind alle Postfächer in der Cloud, dann muss ich mich damit in der Zukunft schon mal nicht mehr mit rum schlagen :-)

    Antworten
  40. Kurzer Test unter Server 2019 mit Exchange 2019: läuft.
    Ich musste allerdings die Domains manuell im Script hinterlegen, sonst kam es hier auch zum Certificate Error wie er schon beschrieben wurde.

    Antworten
  41. Ich habe hier ein ähnliches problem wie Reto. Die Zertifizierungsanforderung und -erstellung läuft durch. Das Zertifikat wird als PFX Datei neben dem Skript angelegt.
    Dazu war lediglich eine Anpassung notwendig – die FQDNs mussten händisch hinterlegt werden. Automatisch wurden sie irgendwie nicht richtig gelesen.
    Leider wars das dann auch. Das Zertifikat liegt dann da, aber hinterlegen muss man es wohl ebenfalls manuell. Ich bin fast sicher, dass das nicht so gewollt ist.

    Antworten
  42. Hallo Frank

    Kompliment, super Script das einem viel Arbeit abnimmt. Ist es richtig, dass nicht alles automatisiert ist?
    Dein Script macht alles was es soll: Es erstellt wir gewünscht das Zertifikat und registriert es in Exchange. Jedoch wird es dann lediglich in Exchange unter Serverzertifikate angezeigt.
    Was ich noch tun muss ist jedesmal die Bindung auf dieses neue Zertifikat von jeder Seite anzupassen.
    (ich verwende Win2012R2 mit Exch2013 und Aufgabenplaner wie von Dir beschrieben)

    Kann dies nicht auch automatisiert werden?
    Ich habe alles wie beschrieben auch als Aufgabe alle zwei Monate eingegeben und erhalte auch das Logfile als Mail. Dies erinntert mich dann, dass ich die Bindungen (Default Web Site/Bindungen bearbeiten….alle HTTPS-Einträge) auf dem IIS noch ‚umhängen‘ muss.

    Antworten
  43. Hi Frank,

    danke für das tolle Script. Die Erstanforderung des Zertifikates hat super funktioniert. Beim verlängern bekomme ich allerdings folgenden Fehler:
    Windows PowerShell
    Copyright (C) 2016 Microsoft Corporation. Alle Rechte vorbehalten.

    PS C:\Users\Administrator.HOME> powershell.exe -Command „&’C:\pop\CertificateAssistant.ps1′ -renew:$true“

    Sicherheitswarnung
    Führen Sie ausschließlich vertrauenswürdige Skripts aus. Skripts aus dem Internet können zwar nützlich sein, stellen
    jedoch auch eine potenzielle Gefahr für Ihren Computer dar. Wenn Sie diesem Skript vertrauen, lassen Sie mit dem Cmdlet
    „Unblock-File“ die Ausführung des Skripts ohne die Warnmeldung zu. Möchten Sie „C:\pop\CertificateAssistant.ps1“
    ausführen?
    [N] Nicht ausführen [M] Einmal ausführen [H] Anhalten [?] Hilfe (Standard ist „N“): m
    C:\pop\CertificateAssistant.ps1 : Die Argumenttransformation für den Parameter „Renew“ kann nicht verarbeitet werden.
    Der Wert „System.String“ kann nicht in den Typ „System.Boolean“ konvertiert werden. Boolesche Parameter akzeptieren
    nur boolesche Werte oder Zahlen wie „$True“, „$False“, „1“ oder „0“.
    In Zeile:1 Zeichen:43
    + &’C:\pop\CertificateAssistant.ps1′ -renew:True
    + ~~~~
    + CategoryInfo : InvalidData: (:) [CertificateAssistant.ps1], ParameterBindingArgumentTransformationExcep
    tion
    + FullyQualifiedErrorId : ParameterArgumentTransformationError,CertificateAssistant.ps1
    Hast du eine Idee

    Antworten
  44. Lösung:
    Am Anfang des Skripts einfügen:
    # Import Exchange Management Shell and connect to Exchange
    . ‚C:\Program Files\Microsoft\Exchange Server\V14\bin\RemoteExchange.ps1‘
    Connect-ExchangeServer -auto

    Und das Skript als Administrator ausführen.

    Antworten
  45. Der Fehler 0xe0434f4d lässt sich vermeiden, wenn das Skript in der Exchange Managment Shell statt der normalen Powershell ausgeführt wird. Aber wie starte ich es darin als geplante Aufgabe?

    Antworten
  46. Hallo,

    ich erhalte folgenden Fehler:

    14.08.2018 15:55:29 – Exchange – Info – Exchange Server Version: Version 14.1 (Build 218.15)
    Import-ExchangeCertificate : Beim Exchange-Zertifikatvorgang ist eine Ausnahme aufgetreten. Die Fehlermeldung lautet: Unknown error (0xe0434f4d)
    At C:\Users\Administrator\Desktop\Exchange 2010\CertificateAssistant_v2_EX2010.ps1:699 char:3
    + Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path $ …
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (:) [Import-ExchangeCertificate], LocalizedException
    + FullyQualifiedErrorId : A8DC66BE,Microsoft.Exchange.Management.SystemConfigurationTasks.ImportExchangeCertificate

    14.08.2018 15:55:30 – Exchange – Info – Successfully imported and enabled Certificate

    Antworten
  47. Hallo Frank,

    vielen Dank für all deine geleistete Arbeit.
    Wir (ein paar engagierte Kollegen eines Systemhauses) würden dich gerne bei deiner Arbeit an diesem Skript unterstützen.

    Wir treffen uns alle 2 Wochen und beackern die Themengebiete Exchange und Powershell.
    Dabei finden wir uns oft auf deiner Webseite wieder. Und gerade dieses Skript war eines unserer Themen bei unserem letzten Treffen. Konkret die erste Version.
    Teil unseres Treffens war ein Code Review. Wir sind also nicht nur an der Oberfläche langgewischt :o).

    Wir wollten fragen ob und wie wir dich hier am Besten unterstützen können?
    Wenn du konkrete Ideen hast, E-Maile mir gerne zurück.

    Vielen Dank,
    Stefan

    PS: Einer meiner geschätzten Kollegen ist gerade dabei, neben dem Exchange 2016 Testsystem (per Cloud) Exchange 2010 zu installieren. Abhängig vom Bedarf könnte er noch mehr Versionen installieren und damit Testfläche zu schaffen.

    Ich selbst bin seit 2004 stetig lernender, githubfähiger, Softwareentwickler und u.a. ein eifriger und interessierter Powershell Schüler (gerne kann ich dir auf anderem Wege Referenzen zukommen lassen).

    Antworten
  48. @Alexander: Es kann aber auch an einer falschen DNS Konfiguration liegen. Bei mir hatte 1&1 zu allen Domänen und Subdomänen ohne AAAA Record einfach selbstständig irgendwelche Records gesetzt. Scheint ein Profi Unternehmen im Bereich Domainverwaltung zu sein.

    @Franky ich habe dir noch ein paar E-Mails geschickt bis ich meinen Fehler gefunden habe. Ich habe bei der automatischen Erneuerung keine E-Mail bekommen, dass ein Fehler vorlag, auch nicht bei meinen ganzen manuellen Tests. Die E-Mail kam dann erst, als das Script erfolgreich abgeschlossen wurde. Sinnvoller fände ich, dass ich auch eine E-Mail bekomme, wenn das Script auf Fehler läuft, da man ja nicht jedes Mal am Datum der automatischen Erneuerung dran denkt, dass man auf dem Exchange Server schaut, ob die E-Mail anbekommen ist.

    Mfg
    Stephan

    Antworten
  49. Für alle, die das „Error creating new cert :: authorizations for these names not found or expired: „,
    „status“: 403 Problem haben. Bei uns lag es daran, dass der Exchange nach außen nicht über Port 80 erreichbar war. Eine Firewall Regel später klappte alles

    Antworten
    • Vielen Dank für den Hinweis Alexander, das hat mein Problem auch gelöst.

      Da sonst kein Bedarf für NAT & Portfreigabe auf Port 80 besteht, hatte ich ein Zeitfenster auf die Firewall konfiguriert. Nur während dieser Zeit ist Port 80 offen. Alles gut und recht, aber die 1. automatische Erneuerung funktionierte nicht. Das Script hatte mehr als 30 Minuten gebraucht um alle Bibliotheken zu laden (sehr alte Server, Kunde macht nicht vorwärtz mit dem Ersatz) und somit war das konfigurierte Zeitfenster abgelaufen. Habe das Zeitfenster nun grosszügiger konfiguriert und es funktioniert wieder.

      Gruss
      Eric

      Antworten
  50. Einen hab ich noch,
    04.07.2018 20:10:56 – ACME Identifier – Error – Failed to create ACME Identifier for Cert Alias Cert040720182010-1 DNSN
    me autodiscover.firma.de
    Hier fehlten wohl die lokalen Zertifikatsanfragen zu den bei lets encrypt gespeicherten Alias(sen).
    (Die hat wohl jemand irgendwann genervt mal gelöscht)
    Nach einigen rumprobieren und acmesharp doku lesen, half folgendes:
    New-ACMEIdentifier -dns autodiscover.firma.de -Alias autodisco (oder irgendwas)
    Das erstellt einen neuen Alias bei LE.
    Danach lief das Skript brav durch und hat auch gleich das alte Alias benutzt.

    Antworten
  51. Zu
    „Error creating new cert :: authorizations for these names not found or expired: „,
    „status“: 403
    das Problem hat mich eben auch gut 1,5 Stunden gekostet.
    Lösung:
    Ich habe bei 1und1 eine Subdomain für Autodiscover.firma.de anlegen müssen.
    Dort wurden aber Standardmäßig ip v6 Adressen mit eingetragen.
    Lets encrypt hat aber laut hier:
    https://www.virtualmin.com/comment/789259#comment-789259
    ip v6 Priorisiert. Damit kommt lets encrypt bei mir aber nicht auf den Exchange Server.
    Nach löschen der IP v6 Einträge lief das Skript durch.
    Danke Frank für das bereitstellen dieses nützlichen Skriptes.
    Schöne Grüße aus Hamburg.

    Antworten
  52. HI ich bekomme auch den 403 Fehler
    {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: „,
    „status“: 403
    }
    dabei ist mein Server aus dem Internet erreichbar und auch bei öffentlichen DNS Servern bekannt.

    Antworten
  53. … und selbst gelöst!
    Ich nutze einen A-Record für die Domain mit Link für den Webserver (xxx.82).
    Der Windows-DNS-Server (xxx.xxx.xxx.81) kreiert sich aber zusätzlich auch für sich selbst einen A-Record auf die Domain. Den kann ich zwar löschen, aber er taucht nach einer Zeit wieder auf. Ob meine Vorgehensweise DNS konform ist, weiss ich nicht 100%, aber so setze ich es aktuell eben um… :-)
    Nachdem der DNS-Server sich selbst zusätzlich auch einen A-Record auf die Domain gegönnt hat, läuft das Script auf den Poller (weil die DNS Abfrage wohl den falschen Record für die Domain zieht). Nachdem ich den Record des DNS Servers wieder gelöscht habe, funktioniert das Script wieder einwandfrei!
    Cheers!

    Antworten
  54. Hi Frank,
    erst einmal Danke: Super Script und klasse Blog!
    Bisher lief das Script bei mir ohne Probleme (zuletzt Mitte Mai), aber beim automatisierten Lauf am 01.07. (und jetzt auch manuell danach) bricht es mit folgender Fehlermeldung ab:
    02.07.2018 20:15:23;Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: „,
    „status“: 403
    }

    Im Log der Firewall bei mir (Sophos UTM) finde ich keinen Eintrag hierzu.
    Any idea?

    Antworten
  55. Hallo Frank,

    ich habe das problem das das Script soweit komplett durch läuft. Bei der übermittlung an Let’s Encrypt bekomme ich aber einen Fehler. Gibt es spezielle Ports die dein Script benötigt außer 80 und 443 ?

    lg

    Marcel

    Antworten
  56. Hello Frank,
    Thanks for this wonderful script! Using it on Exchange 2016 on Win/Server 2016.

    You mention the old certificates. I take it we just manually remove those? They seem to be just hanging there.

    For those with Errors try removing/renaming the old ACMESharp folder in ProgramData. When I first used the script it ran, installed the certificate. Then for some reason errored out on the second try.
    Best,
    Steve

    Antworten
    • Hello Steve,
      Yes, you have to manualy remove the old certificates, currently there is no automatic cleanup process for old certificates, You can remove old certificates within the Exchange Admin Center.
      Kind regards,
      Frank

      Antworten
  57. Hallo und vielen Dank für die Aktualisierung des Skripts.
    Erfolgreicher Test mit Exchange 2016 auf Server 2012 R2 mit WMF 4.0.

    Der Mailserver muss für LE leider direkt per Port 80 ansprechbar sein, ein Reverse Proxy (Synology NAS) der die Subdomain für 80 und 443 weiterverteilt wird leider nicht unterstützt. Da gibt es aber im Netz Infos was man da wohl vielleicht ändern müsste. Oder gibts da schon einen Workaround? Geht jedenfalls mit 2 Minuten Port 80 umschalten in der Firewall.

    Certificate – Error – Failed to submit the certificate for signing <<<< dieser Fehler kam auch beim Proxy in Versuch eins. Bei Synology passiert sowas ähnliches. LE denkt direkt, alle Subdomains die validiert werden, sollten im öffentlichen DNS richtig auf den Host verweisen und Port 80 muss für alle Subdomains auch beim Antragsteller landen. Wenn nur eine Subdomain nicht dort ankommt, wird das SAN-Zertifikat in Gänze abgelehnt.

    Antworten
  58. Hallo Frank,
    vielen Dank für deine tolle Arbeit ! Leider erhalte ich aber auch folgende Fehlermeldung :

    Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: autodiscover.XXX.de, mail.XXX.de“,
    „status“: 403
    }

    Antworten
  59. Also ich habe eben den Fehler mit dem EFS behoben und das Skript nochmal ausgeführt.
    Es lief dann auch bis es diesen – auch schon von anderen angemerkten- Fehler warf:

    Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:
    + Code: Forbidden
    + Content: {
    „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: subd1.domain.de, subd2.domain.de“,
    „status“: 403
    }

    Antworten
  60. Hallo Franky,
    vielen Dank für das Script, die Mühe und Arbeit und vor allem die regelmäßigen Veröffentlichungen!
    Bei unserem Exchange läuft das Script durch bis es versucht das Zertifikat bei LetsEncrypt einzureichen:

    08.06.2018 09:43:23 – Certificate – Info – Certificate creation successfully, Alias SAN080620180943
    08.06.2018 09:43:23 – Certificate – Info – Try to submit the certificate to Let’s Encrypt
    08.06.2018 09:43:26 – Certificate – Error – Failed to submit the certificate for signing

    VG, Christian

    Antworten
  61. Hallo
    Der Fehler „Unable to find an Identifier for the given reference“ lag bei mir daran das nicht für alle Exchange FQDN von mir belegt waren.

    Im Logfile fand sich der Hinweis:
    04.06.2018 12:15:12;Exchange FQDNs;Info;Getting Exchange Outlook Anywhere External FQDN;
    04.06.2018 12:15:15;Exchange FQDNs;Error;Error geting Exchange Outlook Anywhere FQDNs;Es ist nicht möglich, eine Methode für einen Ausdruck aufzurufen, der den NULL hat.

    Nachdem Setzen aller FQDNs läuft alles wie gewünscht.

    MfG Alex

    Antworten
  62. Ergänzung zum Kommentar 5. Juni 2018 um 17:33 :
    Nur für den Fall, dass es von Interesse ist. Meine Umgebung ist ein Hyper-V Gast mit Server 2016 Std und Exchange 2016 Std.

    Antworten
  63. Bei dem Certificate Error half letzlich folgendes „Workaround“:
    1) Script im PS Editor laden
    2) $DetermineExchangeFQDNs = $false
    3) $CustomFQDNs manuell befüllt $CustomFQDNs = @(„mail.domain.de“,“autodiscover.domain.de“)

    Dann habe ich das Script gespeichert und gleich im Editor ausgeführt. So hats zumindest bei mir geklappt.

    Antworten
  64. Hallo Franky,

    auch bei mir meldet der Assistent als Fehler

    04.06.2018 12:39:27;Certificate;Error;Failed to create the certificate SAN040620181239;Unable to find an Identifier for the given reference

    Kannst du helfen?

    Beste Grüße

    Antworten
  65. Hallo,
    habe das selbe Problem wie Thomas:
    22.05.2018 17:27:50;Certificate;Error;Failed to create the certificate SAN220520181727;Unable to find an Identifier for the given reference

    Bin ebenfalls ratlos.

    Antworten
  66. Hallo Frank,
    hab gerade die neue Version des Skripts auf einem neu installieren Server 2016 mit
    Exchange 2016 ausprobiert, bekomme aber am Ende folgende Fehlermeldung:

    18.05.2018 08:51:52 – Certificate – Info – Try to create the certificate
    18.05.2018 08:51:52 – Certificate – Warning – Using as certificates CN
    18.05.2018 08:51:52 – Certificate – Error – Failed to create the certificate SAN180520180851
    Hast du eine Idee, was da passiert ?
    Vielen Dank im Voraus !
    MfG

    Thomas Gebert

    Antworten
  67. Noch ein Nachtrag zu meiner Beschreibung für die Konfiguration ohne EFS. Der Name des benutzerdefinierten Vault-Profils (im Beispiel MyAcmeVault) muss in der Umgebungsvariable „ACMESHARP_VAULT_PROFILE“ hinterlegt werden wenn man das Profil nicht immer mit angeben will. Sorry, hatte ich im Beispiel vergessen. Nähere Infos hier:

    https://github.com/ebekker/ACMESharp/wiki/Vaults,-Vault-Providers-and-Vault-Profiles
    https://pkisharp.github.io/ACMESharp-docs/Local-Vault-EFS.html

    Gruß, Peter

    Antworten
  68. Vielen Dank für die Arbeit Frank!

    Und vielen Dank an Jens Löwe und Peter Klaffehn für die sehr hilfreichen Ergänzungen.

    Tolle Arbeit!

    Gruß,
    Volker

    Antworten
  69. Hi,

    Danke erstmal für das tolle Skript :-)

    Falls jemand ohne EFS auskommen will/muss klappt das so:

    1) Dienstkonto im AD anlegen und auf dem Exchange-Server in die Gruppe „Administratoren“ aufnehmen und in die Exchange-Sicherheitsgruppe „Organization Management“ („Server Management“ geht evtl. auch, habe ich noch nicht getestet).
    2) Mit dem Dienstkonto auf dem Exchange-Server anmelden und ein Verzeichnis (z.B. „C:\Letsencrypt“) erstellen. Darin dieses Skript ausführen:

    Import-Module ACMESharp -MinimumVersion 0.9.1.326
    Set-ACMEVaultProfile -ProfileName MyAcmeVault -Provider local -VaultParameters @{ RootPath =
    C:\Letsencrypt\MyAcmeVault“; CreatePath = $true; BypassEFS = $true }
    Initialize-ACMEVault -VaultProfile MyAcmeVault

    Zeilenumbruch in der 2. Zeile beachten ;-)

    Damit wird ein persönliches Profil für das Dienstkonto angelegt bei dem EFS deaktiviert ist.

    3) Task für die Aktualisierung des Zertifkates anlegen und im Kontext des Dienstkontos laufen lassen

    Gruß, Peter

    Antworten
  70. Hallo @ll
    Den Fehler „Der Zugriff auf den Pfad „C:\ProgramData\ACMESharp\sysVault\45-KEYPM\e8fa163d-f1de-439c-81c1-*********-key.pem“ wurde verweigert“ hatte ich auch.
    Der Test mit:
    $efsTestFile = „$($env:ProgramData)\testing-efs.txt“
    ## If EFS isn’t supported, it will fail with this call to Create
    $x = [System.IO.File]::Create($efsTestFile, 100, „Encrypted“)
    $x.WriteByte(65)
    $x.Close()
    del $efsTestFile
    brachte auf dem problematischen System einen Fehler…

    Das EFS-Wiederherstellungszertifikat war abgelaufen. Zu finden ist dieses in der Default Domain Policy unter Computerkonfiguration, Richtlinien, Windows-Einstellungen, Sicherheitseinstellungen, Richtlinien für öffentliche Schlüssel, Verschlüsseltes Dateisystem.

    Einfach einen neuen Dateiwiederherstellungs-Agent erstellen und schon läuft alles ohne Probleme…

    Viele Grüße aus Berlin
    Jens

    Antworten
  71. Moin,

    vielen Dank erstmal für die saubere Arbeit mit den LE-Skript für Ex-2016.
    In dem Skript wird die Version „ACMESharp 0.9.1.326“ forciert installiert.
    Unterstützt diese ACMESharp-Version bereits die Wildcard-Zertifikate von „Lets Encrypt“?
    Falls ja, könnte das Skript für Ex-2016 das Wildcard-Zertifikat bereits abholen oder müsste es skript-technisch erweitert werden? Was sind an der Stelle die Vorraussetzungen?

    MFG
    CK

    Antworten
    • Hallo Christopher,
      bisher kann das Script keine Wildcard Zertifikate ausstellen. Die ACMESharp Version unterstützt bisher auch nicht das ACMEv2 Protokoll, daher kann ich auch noch keine Unterstützung anbieten. Ich hatte mir vorgenommen, noch etwas abzuwarten und falls es keine Unterstützung für das aktuelle Protokoll geben wird, dann eben einen anderen Client für das Script einzusetzen.
      Gruß,
      Frank

      Antworten
  72. Hi Frank,
    bin erst gestern auf Deinen Blog und Dein LE-Script aufmerksam geworden – richtig coole Arbeit! Hut-ab, sag ich nur. Ich habe die aktuelle Version Deines Scripts hier nun bei mir in einem LAB im Test, schaut jedoch sehr gut aus bis hierher und werde das dann für die Zukunft auch zu meinen Kunden tragen :-)
    VlG, Gerhard
    PS: was mir aufgefallen ist: wenn man mit der „falschen“ Version vom Script in einem „zu neuen“ Umfeld Srv2016/Ex2016 loslegt, muss man vorher die alten Sachen erst wieder loswerden (uninstall-module) bevor man mit dem „richtigen“ Script wieder loslegen kann…

    Antworten
  73. Weis jemand wie ich diesen Fehler beheben kann ?

    Get-ACMEExtensionModule : Der Typ [ACMESharp.POSH.AcmeCmdlet] wurde nicht gefunden.
    In C:\certi\CertificateAssistant_v2_EX2016.ps1:199 Zeichen:18
    + $ACMEIISMocule = Get-ACMEExtensionModule ACMESharp.Providers.IIS
    + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : InvalidOperation: (ACMESharp.POSH.AcmeCmdlet:TypeName) [Get-ACMEExtensionModule], RuntimeException
    + FullyQualifiedErrorId : TypeNotFound,Get-ACMEExtensionModule

    Antworten
  74. Hallo Patrick,

    vielen Dank für Dein schnelles Feedback. Ich bin inzwischen auch auf den link gestoßen und habe besagte Befehle ausgeführt. Diese haben bei mir leider nicht geholen, ich erhalte immer noch die gleiche Fehlermeldung:
    26.03.2018 15:14:53;System;Info;Geting system parameters;
    26.03.2018 15:14:53;System;Info;Certificate Assistant Exchange 2013 Version;
    26.03.2018 15:14:53;System;Info;PowerShell Version: 4.0 OSVersion: 6.2.9200.0;
    26.03.2018 15:14:53;Check ACMEModule;Info;Check if Module installed;
    26.03.2018 15:14:53;Check ACMEModule IIS;Info;Check if IIS Extension is installed;
    26.03.2018 15:14:53;Load ACMEModule;Info;ACMEModule is installed, try to load it;
    26.03.2018 15:14:53;Load ACMEModule;Info;Module Import was successfull, ACMESharpVersion 0.9.1.326;
    26.03.2018 15:14:53;Load ACMEModule IIS;Info;ACMEModule IIS extension is installed, try to load it;
    26.03.2018 15:14:53;Load ACMEModule IIS;Info;ACMEModule IIS extension already loaded;
    26.03.2018 15:14:54;Verify ACME Handler;Info;Successfully verified ACME IIS Challange Handler;
    26.03.2018 15:14:54;Load Exchange SnapIns;Info;Try to load Exchange SnapIns;
    26.03.2018 15:14:56;Load Exchange SnapIns;Info;Sucessfully loaded Exchange SnapIns;
    26.03.2018 15:14:56;Load IIS Module;Info;Try to import IIS Webserver Modules;
    26.03.2018 15:14:56;Load IIS Module;Info;Import successfully;
    26.03.2018 15:14:56;Custom FQDNs;Info;Using Custom FQDNs is configured;
    26.03.2018 15:14:56;Check Vault;Info;Lets check if exists a vault;
    26.03.2018 15:14:57;Check Vault;Info;Vault found;
    26.03.2018 15:14:57;Check Registration;Info;Lets check if exists a LE registration;
    26.03.2018 15:14:57;Check Registration;Info;Found registration;
    26.03.2018 15:14:57;CustomFQDN;Info;Using exchange.xxxxxxxx.de as Certificates Common Name (CN);
    26.03.2018 15:14:59;ACME Identifier;Info;Successfully added ACME Identifier for Cert Alias Cert260320181514-1 DNSName exchange.xxxxxxxx.de;
    26.03.2018 15:14:59;ACME Identifier;Info;Using Cert260320181514-1 DNSName exchange.xxxxxxx.de as certificates CN;
    26.03.2018 15:15:00;ACME Identifier;Info;Successfully added ACME Identifier for Cert Alias Cert260320181514-2 DNSName intranet.xxxxxxxx.de;
    26.03.2018 15:15:00;ACME Identifier;Info;Updating ACME Identifiers;
    26.03.2018 15:15:01;ACME Identifier;Info;Successfully updated ACME Identifier for Cert Alias Cert260320181514-1;
    26.03.2018 15:15:01;ACME Identifier;Info;Successfully updated ACME Identifier for Cert Alias Cert260320181514-2;
    26.03.2018 15:15:03;ACME Challange;Info;Completed ACME Challenge for Alias Cert260320181514-1;
    26.03.2018 15:15:04;ACME Challange;Info;Completed ACME Challenge for Alias Cert260320181514-2;
    26.03.2018 15:15:04;IIS;Info;Changing Let’s Encrypt IIS directory to http;
    26.03.2018 15:15:05;IIS;Info;Successfully changed Let’s Encrypt IIS directory to http;
    26.03.2018 15:15:05;IIS;Info;Checking Let’s Encrypt IIS directory to accept validation by http request;
    26.03.2018 15:15:05;IIS;Info;.well-known directory accepts http;
    26.03.2018 15:15:05;LE Challange;Info;Try to submit challenge;
    26.03.2018 15:15:07;LE Challange;Info;Submitted challenge for Alias Cert260320181514-1;
    26.03.2018 15:15:08;LE Challange;Info;Submitted challenge for Alias Cert260320181514-2;
    26.03.2018 15:15:08;LE Challange;Info;Try to submit challenge;
    26.03.2018 15:15:09;LE Challange;Info;Updated Identifier for Alias Cert260320181514-1;
    26.03.2018 15:15:10;LE Challange;Info;Updated Identifier for Alias Cert260320181514-2;
    26.03.2018 15:15:10;Certificate;Info;Try to create the certificate;
    26.03.2018 15:15:10;Certificate;Info;Using Cert260320181514-1 as certificates CN;
    26.03.2018 15:15:10;Certificate;Info;Certificate creation successfully, Alias SAN260320181514;
    26.03.2018 15:15:10;Certificate;Info;Try to submit the certificate to Let’s Encrypt;
    26.03.2018 15:15:11;Certificate;Error;Failed to submit the certificate for signing;Der Zugriff auf den Pfad „C:\ProgramData\ACMESharp\sysVault\45-KEYPM\a8941605-1fdf-4fe0-a1ce-2fbeec519543-key.pem“ wurde verweigert.

    Antworten
    • Hatte den gleichen Fehler!
      Grund war ein abgelaufenes Zertifikat für das „Verschlüsselte Dateisystem“.
      Auf dem DC in der „Default Domänen Policy“ unter Computerkonfiguration–>Windows-Einstellungen–>Sicherheitseinstellungen–>Richtlineien für öffentliche Schlüssel–>Verschlüsseltes Dateisystem/. Hier das abgelaufene Zertifikat löschen und im gleichen Feld mit der rechten Mousetaste auf „Datenwiederherstellungs-Agents erstellen“ ausführen. Dann „gpupdate“ auf dem DC und dem Exchange und das Script rennt durcht.
      Exchange 2010 mit der Exchange 2010 Version (CertificateAssistant_v2_EX2010.ps1) durchgeführt.

      Antworten
  75. Hallo,

    danke für die Entwicklung dieses genialen Skripts. Leider funktioniert es bei mir auch noch nicht – er schlägt fehl mit der folgenden Fehlermeldung im Skript:

    26.03.2018 13:55:20;Certificate;Info;Try to submit the certificate to Let’s Encrypt;
    26.03.2018 13:55:20;Certificate;Error;Failed to submit the certificate for signing;Der Zugriff auf den Pfad „C:\ProgramData\ACMESharp\sysVault\45-KEYPM\c64a74e7-dbc2-4d1a-9df7-fc8f605927b8-key.pem“ wurde verweigert.

    Hat jemand eine Idee woran das liegen könnte? In besagtem Verzeichnis ist nichts drin. Ich starte das Skript mit einer Powershell, die administrative Rechte hat.

    Viele Grüße

    Matthias

    Antworten
  76. Hi Frank, getestet auf 2016 und 2010.
    Auf den 2010er bekam ich auch den Fehler von Marcel.
    Nach einem Neustart und Änderung der Emailadresse hat es funktioniert.

    Auf dem 2016er klappte es aufs erste mal.

    Vielen Dank!!

    Gruß

    Dani

    Antworten
  77. Hi Frank,

    ich habe den gleichen Fehler wie Nad. seid ihr da zu einer Lösung gekommen?
    14.03.2018 15:40:48;Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:+ Code: Forbidden+ Content: { „type“: „urn:acme:error:unauthorized“,
    „detail“: „Error creating new cert :: authorizations for these names not found or expired: autodiscover.domain.de, mail.domain.de“, „status“: 403}

    Gruß
    Marcel

    Antworten
  78. Hallo Frank,
    wenn ich die Zertifikate installieren versuche, kommt diese Nachricht.

    13:56:38;Certificate;Error;Failed to submit the certificate for signing;Unexpected error
    +Response from server:+ Code: Forbidden+ Content: {„type“: „urn:acme:error:unauthorized“, „detail“: „Error creating new cert :: authorizations for these names not found or expired:autodiscover.example.de,example.de“,“status“:403}

    Gruß,
    Nad.

    Antworten
  79. Hallo Frank
    Habe auf Windows Server 2016 und Exchange Server 2016 leider den gleichen Fehler wie Nad:
    Certificate – Error – Faild to Submit the certificate for signing
    Im Log steht am Schluss:
    Certificate;Error;Failed to submit the certificate for signing;Der Zugriff auf den Pfad „C:\ProgramData\ACMESharp\sysVault\45-KEYPM\c58e49a2-844d-4be5-a66f-c40739ba580c-key.pem“ wurde verweigert.
    Diese pem-Datei ist in diesem Verzeichnis nicht vorhanden. Es ist leer. Zugriffsberechtigungen sind identisch wie für alle Verzeichnisse in sysVault.

    Antworten
  80. Hey frank ich habe einen Exchange Server 2013 auf windows server 2012 R2. vor zwei tage habe ich einen neuen server eingerichtet und installiert Exchange server 2016 auf windows server 2016 und beide arbeiten im gleichen Dömain ich versuche Let’s encrypt Zertifikat installieren aber es geht nicht und ich habe diese Nachricht:
    Certificate – Error – Faild to Submit the certificate for signing

    Antworten
  81. Hallo Frank,
    Das mit dem nicht laufendem Task hat sich auf die alte Version bezogen. Das neue geht, könnte aber den erstellten Task heute nicht mehr testen weil zu viele Anfragen für die gleiche URL.

    Werde ich morgen testen, sonst geht das neue Script super auf 2016/2016.

    Top Arbeit wie immer!

    Antworten
  82. Ein Nachtrag
    wenn man das hier einfügt am Anfang des Scripts muss man es nur starten ohne das man erst die Shell als Admin ausführen muss und man kann sich auch das .\ sparen.

    If (-NOT ([Security.Principal.WindowsPrincipal][Security.Principal.WindowsIdentity]::GetCurrent()).IsInRole([Security.Principal.WindowsBuiltInRole] „Administrator“))
    {
    Write-Host „Running elevated…“
    $arguments = „& ‚“ + $myinvocation.mycommand.definition + „‚“
    Start-Process powershell -Verb runAs -ArgumentList $arguments
    Break
    }

    Aber bei der alten v.1.1 konnte ich auch damit nicht den Erneuerungs Task laufen lassen. Bis heute musste ich das Zertifikat immer von Hand ausführen.

    Antworten
  83. Hallo Frank

    Ich werde es in einer 2016/2016 Umgebung testen, wo auch das alte Skript gelaufen ist, nur mit dem Task hatte ich Probleme, er hat das Zertifikat einfach nicht erneuert, ich musst das Skript auch in der Schell immer als Admin ausführen bzw. .\ beim Starten voranstellen. Ohne das ist es nicht gelaufen.

    Aber das ist ja alles Schnee von gestern, somit werde ich da neue testen und gerne auch ein Log schicken

    Antworten
  84. Hi Frank! Danke für den Post und die Mühe, das Skript zu erneuern!
    Habe mir dein Skript für Lets Encrypt für Exchange schon früher runtergeladen und bei vielen Systemen im Einsatz, SBS2011,W2008R2,2012R2,E2010,2013.Bis auf die automatische Erneuerung funktionierts mit bissi Windows-Fachkenntnis sehr gut und tut was es tun soll.
    Weiter so, top!
    Lg

    Antworten

Schreibe einen Kommentar