Exchange 2016: Kostenlose Zertifikate von Let’s Encrypt

Vorwort

Die Zertifizierungsstelle Let’s Encrypt bietet schon seit Längerem kostenlose Zertifikate an. Im Dezember 2015 hatte ich bereits einen Artikel zu dem Thema geschrieben, allerdings funktionierte zu dem Zeitpunkt der Windows Client noch nicht zuverlässig, sodass ein Umweg über einen Linux Rechner nötig war.

Jetzt ist mittlerweile etwas über ein Jahr vergangen und ich habe einen neuen Versuch gestartet.

Testumgebung

Die Testumgebung ist denkbar einfach aufgebaut. Es gibt nur zwei Windows Server 2016 die über einen Router mit dem Internet verbunden sind:

Testumgebung

Einer der beiden Server ist Domain Controller, auf dem anderen ist Exchange 2016 CU4 installiert. Auf dem Router sind zwei Portweiterleitungen eingerichtet. Port 80 (http) und Port 443 (https) werden auf den Exchange Server weitergeleitet.

Exchange nutzt intern sowie extern den Hostnamen mail.frankysweb.de. Autodisover wird mit den Namen autodiscover.frankysweb.de veröffentlicht. Interne und externe URLs sind gleich konfiguriert.

Exchange ist bereits vollständig konfiguriert, daher behandelt dieser Artikel nur den Let’s Encrypt Teil. Ich brauche also ein Zertifikat mit zwei DNS Namen von Let’s Encrypt: mail.frankysweb.de und autodiscover.frankysweb.de

Zertifikat von Let’s Encrypt anfordern

Es gibt mittlerweile eine ganze Reihe von Clients mit denen Zertifikate von Let’s Encrypt angefordert werden können. Ich habe mich für den ACMESharp Client entschieden, da er sich per PowerShell nutzen lässt.

Das Anfordern der Zertifikate passiert auf dem Exchange Server. Damit die Validierung durchgeführt werden kann, müssen die Let’s Encrypt Server den Exchange Server unter den angeforderten Namen per Port 80 (HTTP) erreichen können.

Zuerst muss daher der ACMESharp Client installiert werden. Die Installation ist dank PSGallery einfach und kann direkt aus der PowerShell erfolgen. Dazu wird eine PowerShell als Administrator gestartet:

image

Die Installation des ACMESharp Clients kann nun mit dem folgenden Befehl durchgeführt werden:

Install-Module -Name ACMESharp -AllowClobber

image

Nun kann das Modul geladen werden und ein neuer Speicher für die Let’s Encrypt Zertifikate angelegt werden:

Import-Module ACMESharp
Initialize-ACMEVault

image

Jetzt kann die Registrierung bei Let’s Encrypt durchgeführt werden, dazu ist nur die Angabe einer E-Mail Adresse nötig:

New-ACMERegistration -Contacts mailto:admin@frankysweb.de -AcceptTos

image

Nach der Registrierung kann das Zertifikat und die Validierung der Domain Namen vorbereitet werden. Ich möchte ein Zertifikat mit zwei Domainnamen (mail.frankysweb.de und autodiscover.frankysweb.de) haben. Die Validierung der Namen soll via HTTP stattfinden:

New-ACMEIdentifier -Dns mail.frankysweb.de -Alias dns1
New-ACMEIdentifier -Dns autodiscover.frankysweb.de -Alias dns2
Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }
Complete-ACMEChallenge dns2 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = 'Default Web Site' }

image

Hinweis: Der Parameter “-ChallengeType http-01” weist Let’s Encrypt an, die Domain Namen mail.frankysweb.de und autodiscover.frankysweb.de per HTTP Protokoll zu prüfen. Dazu bauen die Let’s Encrypt Server eine HTTP Verbindung zu diesen beiden Namen auf und versuchen pro Domain Name jeweils eine Datei abzurufen.

Damit sichergestellt ist, dass die autodisover.frankysweb.de und mail.frankysweb.de mir gehören, wird Let’s Encrypt eine HTTP Verbindung zu meinem Exchange Server aufbauen und diese URLs zu:

  • http://autodiscover.frankysweb.de/.well-known/acme-challange/<Zeichenfolge>
  • http://mail.frankysweb.de/.well-known/acme-challange/<Zeichenfolge>

Das entsprechende Verzeichnis lässt sich auch im IIS einsehen:

image

Allerdings akzeptiert die Default Website eines Exchange Servers im Normalfall keine HTTP Verbindungen auf Port 80, daher muss “SSL erforderlich” für das Verzeichnis “.well-known” abgeschaltet werden. Auch das ist per PowerShell schnell erledigt (oder auch mit dem IIS Manager):

Set-WebConfigurationProperty -Location "Default Web Site/.well-known" -Filter 'system.webserver/security/access' -name "sslFlags" -Value None

image

Sofern der Router nun Port 80 auf den Exchange Server weiterleitet und die DNS-Einträge für autodiscover.frankysweb.de und mail.frankysweb.de auf die WAN IP-Adresse des Routers zeigen, kann die Validierung durchgeführt werden:

Submit-ACMEChallenge dns1 -ChallengeType http-01
Submit-ACMEChallenge dns2 -ChallengeType http-01

image

Die Validierung hat nun den Status “Pending” haben. Nach kurzer Zeit sollte die Validierung erfolgt sein und den Status “Valid” bekommen. Der Status der Validierung lässt sich mit den folgenden Befehlen prüfen:

Update-ACMEIdentifier dns1
Update-ACMEIdentifier dns2

image

Sobald die Validierung erfolgt ist, kann das Zertifikat angefordert werden:

New-ACMECertificate dns1 -Generate -AlternativeIdentifierRefs dns1,dns2 -Alias multiNameCert
Submit-ACMECertificate multiNameCert
Update-ACMECertificate multiNameCert

image

Jetzt befindet sich das Zertifikat bereits im Let’s Encrypt Speicher, aber noch nicht im Windows Zertifikatsspeicher, daher wird es zunächst einmal aus dem Let’s Encrypt Speicher exportiert:

Get-ACMECertificate multiNameCert -ExportPkcs12 "D:\Zertifikat\cert1.pfx" -CertificatePassword <a href="mailto:'P@ssW0rd'">'P@ssW0rd'
</a>

image

Nach dem Exportieren ist das Zertifikat als PFX-Datei im entsprechenden Ordner gespeichert:

image

Jetzt kann es in den Windows Zertifikatspeicher importiert werden:

$password = ConvertTo-SecureString -String "P@ssW0rd" -Force –AsPlainText
Get-ChildItem -Path "D:\Zertifikat\cert1.pfx" | Import-PfxCertificate -CertStoreLocation cert:\localMachine\my –Exportable -Password $password

image

Jetzt muss das frische Zertifikat nur noch dem Exchange Server zugewiesen werden:

Add-PSSnapin *exchange*
Enable-ExchangeCertificate -Thumbprint "8ABEDEFDDCF0C82AFDE4E3FE3E80819FBE643AFD" -Services POP,IMAP,SMTP,IIS

image

Das war auch schon alles. Zertifikat angefordert und eingebunden:

Zertifikate von Let's Encrypt

image

Fazit

In meiner Testumgebung hat es wunderbar funktioniert, der Client macht was er soll und das auch komplett via PowerShell.

Let’s Encrypt stellt nur Zertifikate mit 3 Monaten Laufzeit aus, daher ist alle 3 Monate der Austausch der Zertifikate fällig. Mir war es daher wichtig das sich der komplette Prozess mit der PowerShell abbilden lässt. Denn so lässt sich auch der Austausch der Zertifikate komplett automatisieren. Dazu wird es noch entsprechende Beiträge geben.

Ausblick

Vielleicht kennt jemand dieses kleine Script von mir noch?

Exchange Certificate Assistent

Der bekommt mal ein Update…

37 Replies to “Exchange 2016: Kostenlose Zertifikate von Let’s Encrypt”

  1. Hallo Frank,

    danke für den Beitrag. Ich habe mich jedoch dann doch gegen den Powershellclient entschieden und lieber auc den cmd-client gedetzs. Er erkennt die Hostnamen automatisch und tauscht auch Zertifikat im iis aus. Für die automatische erneuerung wird dann im Abschluss automatisch ein Task erstellt. Man muss nur einmal die Hostnamen, den Bindungen im IIS hinzufügen.
    Ich persönlich mav die PowerShell auch lieber, aber diese Lösung ist leider nicht vollautomatisiert.

    Beste Grüße
    Chris

  2. Deinem Beitrag entnehme ich das SAN Zertifikate kein Thema sind, auch wildcard Zertifikate mit eventuell mehreren Domänen?

  3. Hallo Franky,

    wie wäre es mit

    Import-ExchangeCertificate -FileName „D:\Zertifikat\cert1.pfx“ -FriendlyName „Mein_Zertifikat“ | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, IIS“ – force

    statt
    Import-PfxCertificate
    Dann könnte man sich das ganze mit dem Thumbprint sparen.
    Habe ich bei http://www.netometer.com gefunden

  4. Hi Bernhard,

    stimmt, an das CMDLet habe ich gar nicht gedacht… Man müsste es etwas anpassen:

    Import-ExchangeCertificate -FileName „D:\Zertifikat\cert1.pfx“ -FriendlyName „Mein_Zertifikat“ -Password P@ssW0rd -PrivateKeyExportable:$true | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, IIS“ – force

    Danke für den Hinweis!

    Gruß und schönes Wochenende,

    Frank

  5. Hallo Franky,

    kennst Du auch eine Variante um LetsEncrypt mit automatischer Aktualisierung unter Exchange 2013 einzusetzen?

    Liebe Grüße
    Michael

  6. Hi,
    generell funktioniert die Vorgehensweise auch mit Exchange 2013. Zur automatischen Erneuerung kommt noch ein Beitrag.
    Gruß, Frank

  7. Vielen Dank für diesen Klasse Beitrag, freue mich schon sehr auf den Beitrag für die automatische Erneuerung. :)

    Gruß Roman

  8. Hallo Franky,

    ich probiere es unter Server 2012R2 mit Exchange 2013 durchzuspielen und scheitere schon beim ersten Schritt:

    PS C:\Windows\system32> Install-Module -Name ACMESharp -AllowClobber
    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 Zeile:1 Zeichen:1
    + Install-Module -Name ACMESharp -AllowClobber
    + ~~~~~~~~~~~~~~
    + CategoryInfo : ObjectNotFound: (Install-Module:String) [], CommandNotFoundException
    + FullyQualifiedErrorId : CommandNotFoundException

    Hast Du da eine entscheidende Starthilfe für mich?

    Vielen Dank und liebe Grüße
    Michael

  9. Hi,
    ich hänge hier an einem Problem gleich am Anfang…
    PowerShellGet für 3/4 habe ich installiert.

    Beim ersten Befehl „Install-Module -Name ACMESharp -AllowClobber“ kommt diese Fehlermeldung:

    Install-Module : Es wurde kein Parameter gefunden, der dem Parameternamen „AllowClobber“ entspricht.

    Habe ich irgendwas vergessen? Es ist ein Win 2012R2, Exchange 2016 CU2 (Update auf CU4 kommt).

    Gruß
    Michael

  10. Hallo,
    leider komme auch ich nicht weiter und evtl. kann mir wer helfen. Hatte das komplette Whitepaper durchstudiert und habe die DNS Einträge soweit alle angepasst und auch verstanden wie Autodiscover nun funktioniert, erstmal danke dafür :). PS Gallery wurde ebenfalls installiert.

    Bei mir ist Server2012R2 und Exchange 2013 installiert.

    Die Installation vom Modul klappe auch nur ohne den Parameter -AllowClobber“. Aber nun kam ich auch nicht mehr weiter:

    PS C:\Users\Administrator> Import-Module ACMESharp
    PS C:\Users\Administrator> Initialize-ACMEVault
    Initialize-ACMEVault : Vault root path contains existing vault data
    In Zeile:1 Zeichen:1
    + Initialize-ACMEVault
    + ~~~~~~~~~~~~~~~~~~~~
    + CategoryInfo : NotSpecified: (:) [Initialize-ACMEVault], Excep
    + FullyQualifiedErrorId : System.Exception,ACMESharp.POSH.InitializeVault

    Beim Import Befehl erscheint noch kein Fehler aber beim Initialize Befehl. Hat jemand eine Ahnung woran es liegt ? Ich komme gerade leider nicht mehr weiter. Was mir noch aufgefallen ist, im IIS ist keine Seite /.well-known vorhanden. Vielleicht kann mir wer helfen.

    Martin

  11. Hallo Martin,

    alternativ (wenn du doch ein neues anlegen willst) musst den folgenden Ordner umbenennen oder löschen:

    C:\ProgramData\ACMESharp

  12. Hallo Frank, Hallo Bernhard,

    ich wollte auch gerade eine Rückmeldung geben, aber habe gesehen ihr seit wieder super schnell gewesen mit dem Antworten :) also es hat jetzt auch bei mir geklappt und alles eingebunden ich bin total happy.

    ich hatte ebenfalls den ACMESHARP Ordner gelöscht und dann klappte es auch bei mir. Es war mir nicht so ganz die Funktionsweise vom Vault Ordner klar. Aber nachdem ich

    Get-ACMEVaultProfile

    eingegeben hatte kam ich der Sache auf die schliche ;-)

    Danke euch. Gruss aus Brandenburg

  13. Hallo,

    ich hänge momentan an der Stelle „Update-ACMEIdentifier dns1“ und bekomme die Rückmeldung Status : invalid
    Route wurde in der Firewall konfiguriert für Port 80. Hat jemand eine Idee

    Danke und Gruß

    Christian

  14. Hallo,
    vielen Dank für die Anleitung.
    Ich habe bei der Ausführung ein paar Probleme.
    So ist die Anfrage seit ein ca. 8h immer noch pending.
    Die Webseite .wellknown.. ist erreichbar per Port 80. Dies habe ich aus einem anderen Netz getestet.

    Ich hatte gestern damit ein paar Probleme und wollte es erneut probieren. Kann man denselben DNS-Identifier noch einmal nehmen oder muss es für jeden Request ein neuer sein?
    Ist dies vielleicht der Grund für den andauernden Status pending?
    Falls ja, soll ich die offenen Requests irgendwo löschen oder laufen diese automatisch ab?

    Ich habe auch den manual Weg per txt-record probiert. Aber es sieht so aus, als wenn 1und1 dies nicht zuläßt. Hat jemand damit Erfahrungen? Ich kann keinen entsprechenden Eintrag anlegen.

    Gruß
    Alex

  15. Hallo Frank,

    da dein Zertifikatsassistent leider noch nicht ältere Exchangeversionen unterstützt (ein paar der CMDlets werden erst ab 2016 unterstützt) habe ich nun auch erstmal manuell das Zertifikat auf einem SBS 2011 (Exchange 2010) erzeugt. Hierbei hatte ich anfangs auch diverse Herausforderungen wie die Installation der PowerShellGallery (WMF 5 installieren), aber auch weil bspw. das CMDlet „Import-PfxCertificate“ bei Windows Server 2008 R2 (SBS 2011) nicht existiert oder „Import-ExchangeCertificate“ bei Exchange 2010 nur „-FileData“ akzeptiert. Um der Nachwelt das Leben ein wenig einfacher zu machen und evtl. die Entwicklung deines Assistenten (wie wäre es mit einem GitHub-Projekt?) zu unterstützen findet ihr nachfolgend eine Auflistung meiner Kommandos. Anbei noch der Hinweis an obige Kommentatoren, dass der Status „invalid“ unbedingt erfordert nochmal vom Neuen zu beginnen mit veränderten Aliasen (ersetze: dns1, dns2 und multiNameCert).

    # Certificate.ps1 for WindowsServer 2008 R2 + Exchange 2010
    Install-Module -Name ACMESharp
    Import-Module ACMESharp
    Initialize-ACMEVault
    New-ACMERegistration -Contacts mail@frankysweb.de -AcceptTos
    New-ACMEIdentifier -Dns mail.frankysweb.de -Alias dns1
    New-ACMEIdentifier -Dns autodiscover.frankysweb.de -Alias dns2
    Complete-ACMEChallenge dns1 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = ‚Default Web Site‘ }
    Complete-ACMEChallenge dns2 -ChallengeType http-01 -Handler iis -HandlerParameters @{ WebSiteRef = ‚Default Web Site‘ }
    Set-WebConfigurationProperty -Location „Default Web Site/.well-known“ -Filter ’system.webserver/security/access‘ -name „sslFlags“ -Value None
    Submit-ACMEChallenge dns1 -ChallengeType http-01
    Submit-ACMEChallenge dns2 -ChallengeType http-01
    Update-ACMEIdentifier dns1
    Update-ACMEIdentifier dns2
    New-ACMECertificate dns1 -Generate -AlternativeIdentifierRefs dns1,dns2 -Alias multiNameCert
    Submit-ACMECertificate multiNameCert
    Update-ACMECertificate multiNameCert
    Get-ACMECertificate multiNameCert -ExportPkcs12 „D:\Zertifikat\cert1.pfx“ -CertificatePassword ‚P@ssW0rd‘
    Add-PSSnapin *exchange*
    Import-ExchangeCertificate -FileData ([Byte[]]$(Get-Content -Path „D:\Zertifikat\cert1.pfx“ -Encoding byte -ReadCount 0)) -FriendlyName „Mein_Zertifikat“ -Password (ConvertTo-SecureString -String „P@ssW0rd“ -Force -AsPlainText) -PrivateKeyExportable:$true | Enable-ExchangeCertificate -Services „SMTP, IMAP, POP, IIS“ –force

  16. Hallo Frank,

    ich bin vermutlich „Betriebsblind“, oder einfach Dusselig.

    Da StartSSL nicht mehr von Apple unterstützt wird, habe ich LetsEncrypt installiert, Dein Howto war absolut hilfreich. Nur bekomme ich seit dem teilweise keine Emails mehr und mein iPad verweigert die Aktualisierung vom Exchange-Konto, weder Mail noch Kalender.

    Also habe ich mit Hilfe von Deinem Script die DNS-Namen ermittelt und siehe da, autodiscover wird nicht mehr als DNS aufgeführt.

    Und jetzt kommt die Betriebsblindheit: Wo zum Henker bringe ich diesen DNS-Eintrag ein? Ich habe ja schon den DNS-Eintrag „mail.domin.de“, „mail.domain.int“, „win2016exc.domain.de“ und „win2016exc.domain.int“ drin, aber „discover.domain.int“ und „discover.domain.de“ einzufügen gelingt mir nicht.

    Ich hoffe, Du kannst mir auf die Beine helfen…

  17. Nachtrag:

    Interessant ist vielleicht, dass „mail“ auf dem iPad funktioniert, genauso wie der Web-Zugriff auf die HTTPS-Seite der Domain.

  18. Ich hatte vermutlich einen Fehler in der Zertifizierung. Mit Deinem neuen Script funktionierte es, interessanterweise.

    Zumindest werde ich erst mal nix mehr dran machen, außer eine Gesamtsicherung :)

    Unabhängig davon, Deine Blog-Einträge haben mir in vielen Punkten schon die Augen geöffnet, danke dafür und gerne weiter so…

  19. Hallo zusammen,

    noch eine kleine Anmerkung für Exchange 2013:

    mittels „Import-PfxCertificate -CertStoreLocation“ (KSP / CNG) hatte ich einen OWA Loop.

    Mit „certutil -csp „Microsoft RSA SChannel Cryptographic Provider“ -importpfx “ (CSP) läuft es bislang problemlos.

    Hier noch nen Link auf ne kurze mögliche Erklärung:

    https://blogs.technet.microsoft.com/jasonsla/2015/01/15/the-one-with-the-fba-redirect-loop/

    Die Zusammenfassung ist, Exchange 2013 unterstützt die CNG (Cryptography API Next Generation) nicht…

    Beste Grüße

    Chris

  20. Hi Chris,

    ich habe ebenfalls die Anleitung von Franky auf einem Exchange 2013 durchgeführt und habe soweit alles erfolgreich abschließen können. Leider habe ich nun ebenfalls einen OWA Loop.
    Den ganzen Step by Step Guide nochmal durchzuführen mit „certutil -csp…“ funktioniert aber leider nicht, weil die Zertifikate ja schon eingespielt sind.
    Das Erneuerungsscript für Exchange 2013 gibt es leider noch nicht.
    Könntest du mir eventuell kurz die Schritte schreiben, wie ich den OWA Loop beseitigen kann, trotzdem ich Frankys Anleitung schon durchgeführt habe.

    Besten Dank im Voraus.

    LG Gerald

  21. Hallo zusammen,

    Habe ein Exchange 2016 Zertifikat mit der Anleitung und ebenfalls zwei DNS Namen (mail. und autodiscover.)erfolgreich importiert. Soweit super. Leider prangern die Clients nun den FQDN des Exchange Servers an „Der Name auf dem Sicherheitszertifikat ist ungültig oder stimmt nicht mit der Website überein“ Muss der auch noch irgendiwe ins Zertifikat?

    Gruß jens

  22. Hallo Frank,
    super vielen Dank für Deine geniale Beschreibung, ich hätte nur eine Frage, es hat alles klappt, ich konnte das Zertifikat einpflegen, ich kann mich auch in der OWA anmelden, nur wenn ich mich auf der ECP mit dem Admin anmelden möchte, bekomme ich das Fenster zum PW eingeben, das mache ich auch aber es passiert nicht, keine Fehlermeldung – einfach nichts, er bleibt auf der Webseite.
    Ich hab jetzt die Default Webseite der ECP auch schon nach Deiner Beschreibung rückgesetzt, leider auch kein Erfolg, DNS Einträge geprüft sieht alles gut aus, nur die Anmeldung klappt nicht – hättest Du evtl. noch eine Idee?
    Vielen Dank
    Claus

  23. Hallo Frank,
    noch ein Nachtrag, ist mir gerade aufgefallen – ich melde mich an der ECP an und nach dem ich das Passwort eingeben habe werde ich auf die OWA umgeleitet wo ich das Passwort wieder eingeben soll – vielleicht hilft das?
    Nochmals Danke
    Claus

  24. Hallo,

    wie kann man nachträglich das Passwort ändern des Zertifikats ändern? Probeweise hatte ich ein sehr einfaches genutzt, und wie es so ist alles läuft und es gerät in Vergessenheit. Nun würde ich es gerne gegen ein „sicheres“ Passwort ändern.

    Gruss Peter

  25. Soweit mir bekannt ist, kann das Kennwort vom Zertifikat nicht geändert werden. Entweder damit leben, oder eine neues ausstellen lassen…

  26. Achtung die aktuelle Version (Stand 30.08.17) der ACMESharp hat einen Fehler, daher läuft das Skript (und die Registrierung von Hand nicht)!
    Workaround:

    List installed modules Get-Module –ListAvailable
    Remove module Uninstall-Module ACMESharp
    Install stable Install-Module -Name ACMESharp -RequiredVersion 0.8.1

    https://github.com/ebekker/ACMESharp/issues/245

  27. Hallo zusammen,

    ich scheitere schon bei der Installation von PowerShellGet.

    Hier bringt er mir folgendes:
    PS C:\Windows\system32> Install-Module -Name PowerShellGet -Force
    WARNUNG: The version ‚1.0.0.1‘ of module ‚PackageManagement‘ is currently in use. Retry the operation after closing the applications.
    PS C:\Windows\system32>

    Wieso ist das „PackageManagement“ Module aktuell in Benutzung und wie kann ich dennoch das PowerShellGet installieren?

    LG Michael

Schreibe einen Kommentar

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