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…

9 Gedanken zu “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

Schreibe einen Kommentar

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