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:
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:
Die Installation des ACMESharp Clients kann nun mit dem folgenden Befehl durchgeführt werden:
Install-Module -Name ACMESharp -AllowClobber
Nun kann das Modul geladen werden und ein neuer Speicher für die Let’s Encrypt Zertifikate angelegt werden:
Import-Module ACMESharp Initialize-ACMEVault
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
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' }
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:
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
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
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
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
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>
Nach dem Exportieren ist das Zertifikat als PFX-Datei im entsprechenden Ordner gespeichert:
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
Jetzt muss das frische Zertifikat nur noch dem Exchange Server zugewiesen werden:
Add-PSSnapin *exchange* Enable-ExchangeCertificate -Thumbprint "8ABEDEFDDCF0C82AFDE4E3FE3E80819FBE643AFD" -Services POP,IMAP,SMTP,IIS
Das war auch schon alles. Zertifikat angefordert und eingebunden:
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…