Windows31. August 2026 36 Aufrufe

Let's Encrypt auf IIS installieren: HTTPS und automatische Erneuerung

Let's Encrypt auf IIS installieren: HTTPS und automatische Erneuerung

Diese Anleitung erklärt, wie Sie ein TLS-Zertifikat von Let's Encrypt auf einer IIS-Website installieren, die auf einem Windows-Server-VPS läuft. Das Hauptverfahren nutzt simple-acme. Behandelt werden die HTTP-01-Validierung, Wildcard-Zertifikate über DNS-01, IIS-Bindungen mit SNI, die geplante Erneuerung, HSTS, die Überwachung und die häufigsten Fehler.

Das erwartete Ergebnis:

  • http://example.com antwortet auf Port 80 und leitet auf HTTPS um;
  • https://example.com und https://www.example.com liefern ein gültiges Zertifikat;
  • das Zertifikat enthält die richtigen DNS-Namen in seinen SAN;
  • IIS verwendet die richtige Bindung auf Port 443;
  • eine geplante Aufgabe prüft täglich, ob eine Erneuerung nötig ist;
  • die nächste Erneuerung gelingt ohne menschliches Zutun.

Vorgehen, Umfang und Grenzen dieser Anleitung

Die Angaben wurden am 29. August 2026 mit der offiziellen Dokumentation von Let's Encrypt, Microsoft IIS und simple-acme abgeglichen. Die Befehle wurden mit den von Microsoft veröffentlichten PowerShell- und IIS-Referenzen verglichen.

Versionen, Ausstellungsgrenzen und Gültigkeitsdauern ändern sich regelmäßig. Bevor Sie dieses Verfahren produktiv einsetzen, führen Sie es auf einem Test-VPS mit einer echten Subdomäne durch und prüfen Sie die Zahlenwerte dieses Artikels auf den im Text verlinkten offiziellen Seiten nach.

Diese Anleitung behandelt eine öffentliche IIS-Website mit einem DNS-Namen. Nicht behandelt werden Zertifikate für Domänencontroller, LDAPS oder AD CS, ebenso wenig Exchange, RDS Gateway oder SQL Server, eine interne PKI, ein IIS-Cluster ohne zentrale Zertifikatsverteilung oder ein Proxy, der TLS auf einer anderen Maschine terminiert. In diesen Fällen kann das Zertifikat weiterhin von einer ACME-Instanz stammen, doch Installation und Erneuerung müssen an den Dienst angepasst werden.

Let's Encrypt, ACME, IIS und simple-acme: wer macht was?

KomponenteFunktion
Let's Encryptöffentliche Zertifizierungsstelle, die die Kontrolle über den Namen prüft und das Zertifikat signiert
ACME v2Protokoll zur Automatisierung von Validierung, Ausstellung, Erneuerung und Widerruf
simple-acmeACME-Client eines Drittanbieters, der mit Let's Encrypt spricht und IIS steuert
Windows-Zertifikatspeicherbewahrt Zertifikat und privaten Schlüssel auf dem Server auf
IIS und HTTP.sysverknüpfen das Zertifikat mit Adresse, Port und Hostnamen
Geplante Windows-Aufgabestartet simple-acme regelmäßig zur Prüfung auf Erneuerungen

Let's Encrypt stellt Zertifikate vom Typ Domain Validation aus. Sie belegen die technische Kontrolle über die angeforderten Namen und verschlüsseln die Verbindung. Sie bescheinigen keine juristische Identität eines Unternehmens und beheben weder eine verwundbare Anwendung noch einen kompromittierten Server. Let's Encrypt bietet keine OV- oder EV-Zertifikate an, wie die offizielle FAQ festhält.

Öffentliche Zertifikate werden zudem in Certificate-Transparency-Protokollen eingetragen. Die im Zertifikat enthaltenen DNS-Namen dürfen daher nicht als geheim gelten. Let's Encrypt erläutert das in seiner Dokumentation zu den CT-Logs.

simple-acme oder win-acme: welches Werkzeug?

win-acme bleibt der bekannteste Client im IIS-Umfeld. simple-acme stellt sich auf der eigenen Website als rückwärtskompatibler Ersatz dar, entwickelt von derselben Person. Stand 29. August 2026 veröffentlicht simple-acme die Version 2.4.0, während win-acme weiterhin seine eigene 2.2.9.1 verteilt: Beide Projekte sind verfügbar, und der Wechsel ist eine Entscheidung, keine Pflicht.

Diese Anleitung nutzt simple-acme, weil es der zuletzt aktualisierte Zweig ist. Wenn Sie win-acme bereits betreiben und Ihre Zertifikate korrekt erneuert werden, müssen Sie nicht überstürzt migrieren.

Die Einstiegsdokumentation bestätigt, dass das Werkzeug IIS-Bindungen erkennt, standardmäßig Let's Encrypt verwendet, eine HTTP-Validierung durchführt, das Zertifikat im Windows-Speicher ablegt, die HTTPS-Bindungen anlegt oder aktualisiert und eine geplante Erneuerungsaufgabe erstellt.

simple-acme ist weder ein Microsoft-Produkt noch ein „offizieller Let's-Encrypt-Client“. Es ist quelloffene Software eines Drittanbieters. Laden Sie sie ausschließlich von der simple-acme-Website oder dem dort verlinkten GitHub-Repository und prüfen Sie anschließend die Integrität der Datei.

Wenn Sie bereits win-acme einsetzen

Löschen Sie win-acme und seinen Ordner unter %ProgramData% nicht blind. Beginnen Sie mit einer Bestandsaufnahme:

Get-ScheduledTask |
    Where-Object TaskName -Match "win-acme|simple-acme" |
    Select-Object TaskName, State, TaskPath

Erfassen Sie danach die Erneuerungen und den Ort ihrer Konfiguration. simple-acme gilt als kompatibler Ersatz, doch ein Wechsel des Servers oder des DPAPI-Kontexts erfordert eine Prüfung von Geheimnissen, Pfaden, Plugins und Zertifikaten. Folgen Sie der Migrationsanleitung von simple-acme und legen Sie vor jeder Änderung eine Sicherung an.

HTTP-01, DNS-01 und TLS-ALPN-01 verstehen

Let's Encrypt muss prüfen, dass Sie jeden angeforderten Namen kontrollieren.

MethodeValidierungErforderlicher Port oder DienstWildcardEmpfohlener Einsatz
HTTP-01Ressource unter /.well-known/acme-challenge/öffentlicher TCP 80neineine öffentliche IIS-Website auf einem einzelnen Server
DNS-01TXT-Eintrag unter _acme-challengeöffentliche DNS-APIjaWildcard, Cluster, Port 80 nicht verfügbar
TLS-ALPN-01spezielle TLS-Antwortöffentlicher TCP 443neinfortgeschrittene TLS-Infrastrukturen

Für HTTP-01 verlangt Let's Encrypt eine Ressource dieser Form:

http://example.com/.well-known/acme-challenge/<TOKEN>

Die Validierung trifft zwingend auf Port 80 ein. Let's Encrypt folgt bis zu zehn Weiterleitungen, aber nur zu HTTP oder HTTPS und nur zu den Ports 80 oder 443. Mit HTTP-01 lässt sich *.example.com nicht erhalten. Diese Regeln beschreibt die offizielle Seite Challenge Types.

Bei DNS-01 veröffentlicht der Client einen TXT-Eintrag unter:

_acme-challenge.example.com

DNS-01 erlaubt Wildcards und funktioniert ohne öffentlichen Webserver. Automatisierbar bleibt es nur mit einer DNS-API oder indem Sie _acme-challenge an eine automatisierbare Zone delegieren. Verwenden Sie API-Zugangsdaten mit eingeschränkten Rechten: Ein Schlüssel, mit dem der Webserver sämtliche DNS-Zonen ändern kann, vergrößert die Folgen einer Kompromittierung erheblich.

Voraussetzungen

Sie benötigen einen aktuellen Windows-Server-VPS, Administratorzugang per RDP oder Konsole, ein installiertes IIS mit einer Website, die bereits über HTTP antwortet, eine kontrollierte öffentliche Domäne oder Subdomäne, einen korrekten A-Eintrag und, falls vorhanden, einen korrekten AAAA-Eintrag, die TCP-Ports 80 und 443 offen in der Windows-Firewall und in der Netzwerk-Firewall, ausgehende HTTPS-Verbindungen zur ACME-API, eine überwachte betriebliche E-Mail-Adresse sowie eine Sicherung der IIS-Konfiguration vor jeder Änderung.

Unsere Windows-VPS bieten eine administrierbare Windows-Umgebung mit vollem Administratorzugang. Da Versionen, Ressourcen und Optionen sich ändern können, prüfen Sie beim Bereitstellen die Produktseite.

1. Windows Server und IIS prüfen

Öffnen Sie Windows PowerShell als Administrator:

Get-ComputerInfo |
    Select-Object WindowsProductName, WindowsVersion, OsBuildNumber

Get-WindowsFeature Web-Server
Get-Service W3SVC

Get-NetFirewallProfile |
    Select-Object Name, Enabled, DefaultInboundAction, DefaultOutboundAction

Die Rolle Web-Server muss installiert und der Dienst W3SVC gestartet sein. Falls IIS noch fehlt:

Install-WindowsFeature Web-Server -IncludeManagementTools

Install-WindowsFeature setzt eine erhöhte Konsole voraus, und -IncludeManagementTools installiert die Verwaltungswerkzeuge, gemäß der Referenz für Windows Server 2025. Wenn Sie mit einem frischen Server beginnen, behandelt unsere Anleitung zu den ersten Schritten mit einem Windows-VPS die erste Verbindung und die Updates.

Erfassen Sie die Websites und ihre Bindungen:

Import-Module WebAdministration

Get-Website |
    Select-Object Name, Id, State, PhysicalPath

Get-WebBinding |
    Select-Object protocol, bindingInformation, sslFlags

Notieren Sie Name und ID der abzusichernden Website. Die folgenden Beispiele verwenden:

ParameterBeispiel
IIS-WebsiteMeineSeite
IIS-ID2
Hauptdomäneexample.com
Aliaswww.example.com
Öffentliche IPv4203.0.113.10, ein zu ersetzender Dokumentationswert

Die Bereiche 192.0.2.0/24, 198.51.100.0/24 und 203.0.113.0/24 sind der Dokumentation vorbehalten. Übernehmen Sie sie nicht in eine echte Konfiguration.

Fehlende HTTP-Bindungen ergänzen

simple-acme kann die Namen aus den IIS-Bindungen ableiten. Jeder angeforderte Name muss deshalb ausdrücklich gesetzt sein und tatsächlich auf diesen Server zeigen.

New-WebBinding `
    -Name "MeineSeite" `
    -Protocol "http" `
    -IPAddress "*" `
    -Port 80 `
    -HostHeader "example.com"

New-WebBinding `
    -Name "MeineSeite" `
    -Protocol "http" `
    -IPAddress "*" `
    -Port 80 `
    -HostHeader "www.example.com"

Führen Sie diese Befehle nur aus, wenn die Bindungen noch nicht bestehen. Microsoft dokumentiert New-WebBinding und seine Parameter in der WebAdministration-Referenz.

Prüfen Sie das Ergebnis:

Get-WebBinding -Name "MeineSeite" -Protocol http |
    Select-Object bindingInformation

Eine leere Bindung wie *:80: nimmt alle Namen an, die keine andere Website erfasst. Sie kann einen Konfigurationsfehler verdecken und dazu führen, dass der falsche Inhalt validiert wird. Verwenden Sie auf einem Server mit mehreren Websites präzise Hostnamen.

2. Öffentliches DNS prüfen, auch IPv6

Vom VPS aus:

Resolve-DnsName example.com -Type A
Resolve-DnsName www.example.com -Type A

Resolve-DnsName example.com -Type AAAA -ErrorAction SilentlyContinue
Resolve-DnsName www.example.com -Type AAAA -ErrorAction SilentlyContinue

Die A-Antworten müssen der öffentlichen IPv4-Adresse entsprechen, über die IIS erreichbar ist. Existiert ein AAAA-Eintrag, muss die Website auch über diese IPv6-Adresse funktionieren.

Let's Encrypt bevorzugt beim ersten Versuch IPv6, sofern ein AAAA-Eintrag veröffentlicht ist. Ein IPv6-Server, der den falschen Inhalt liefert, kann die Validierung scheitern lassen, ohne auf IPv4 zurückzufallen. Die Lösung besteht darin, AAAA auf den richtigen Server zu richten und dieselbe Website auszuliefern, oder AAAA zu entfernen, wenn IPv6 nicht genutzt wird. Es gibt keine Option, mit der Let's Encrypt IPv4 bevorzugen würde. Siehe die Dokumentation IPv6 Support.

Prüfen Sie auch etwaige CAA-Regeln:

Resolve-DnsName example.com -Type CAA -ErrorAction SilentlyContinue

Fehlt CAA, verhindert das die Ausstellung nicht. Ist eine CAA-Richtlinie vorhanden, muss sie Let's Encrypt zulassen, zum Beispiel:

example.com.  CAA 0 issue "letsencrypt.org"

Für eine getrennte Steuerung von Wildcards lässt sich das Tag issuewild nutzen. Der CAA-Bezeichner von Let's Encrypt lautet letsencrypt.org, wie die CAA-Dokumentation angibt. Ein SERVFAIL kann auf eine fehlerhafte DNSSEC-Kette oder einen defekten DNS-Server hinweisen.

3. Nur die nötigen Ports öffnen

Erstellen Sie eingehende Regeln für HTTP und HTTPS:

New-NetFirewallRule `
    -DisplayName "IIS HTTP - TCP 80" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 80 `
    -Action Allow `
    -Profile Any

New-NetFirewallRule `
    -DisplayName "IIS HTTPS - TCP 443" `
    -Direction Inbound `
    -Protocol TCP `
    -LocalPort 443 `
    -Action Allow `
    -Profile Any

Bestehen diese Regeln bereits, prüfen Sie sie, statt Duplikate anzulegen:

Get-NetFirewallRule -DisplayName "IIS HTTP - TCP 80","IIS HTTPS - TCP 443" |
    Get-NetFirewallPortFilter

Die Windows-Firewall und die Netzwerk-Firewall des Anbieters sind zwei getrennte Schichten. Eine korrekte lokale Regel genügt nicht, wenn die vorgelagerte Filterung den Port ablehnt. Unsere Anleitung zum Konfigurieren der Windows-Server-Firewall auf einem VPS beschreibt diese Trennung.

Für HTTP-01 muss Port 80 aus dem Internet erreichbar sein. Let's Encrypt veröffentlicht keinen festen Adressbereich für Validierungen: Eine Beschränkung auf einige willkürliche IP-Adressen führt früher oder später zu einem Fehlschlag.

Prüfen Sie die lokale Portbelegung:

Get-NetTCPConnection -State Listen |
    Where-Object LocalPort -In 80,443 |
    Select-Object LocalAddress, LocalPort, OwningProcess

Testen Sie dann von einer Verbindung außerhalb des VPS:

Test-NetConnection example.com -Port 80
Test-NetConnection example.com -Port 443

Ein Test vom Server selbst belegt die öffentliche Erreichbarkeit nicht immer, insbesondere bei NAT, Proxy oder geografischer Filterung.

4. Die IIS-Konfiguration sichern

Bevor Sie die Bindungen ändern:

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"
& $appcmd add backup "Vor-LetsEncrypt"
& $appcmd list backup

Diese Sicherung schützt die IIS-Konfiguration, nicht die Inhalte der Website, die Datenbank oder die Geheimnisse der Anwendung. Führen Sie zusätzlich eine Systemsicherung gemäß Ihrer Richtlinie durch. Unsere Anleitung zum Sichern eines Windows-VPS stellt mehrere Ansätze vor.

5. simple-acme herunterladen und prüfen

Empfohlener Weg unter Windows Server 2019 und 2022: offizielles Archiv

Laden Sie den Windows-x64-Build von der offiziellen simple-acme-Seite. Wählen Sie:

  • den trimmed-Build für HTTP-01 und ein einfaches IIS: er ist kleiner, unterstützt aber keine Plugins;
  • den full-Build, wenn Sie externe Plugins benötigen, insbesondere für einen DNS-Anbieter.

Entpacken Sie das Archiv an einen dauerhaften Ort:

C:\Program Files\simple-acme

Belassen Sie wacs.exe nicht im Ordner Downloads oder in einem temporären Verzeichnis. Die geplante Aufgabe hängt vom Pfad der ausführbaren Datei ab.

Berechnen Sie vor dem Entpacken den SHA-256-Wert des Archivs:

Get-FileHash `
    -Path "C:\Users\Administrator\Downloads\simple-acme.zip" `
    -Algorithm SHA256

Vergleichen Sie den Wert Zeichen für Zeichen mit dem auf der Download-Seite veröffentlichten Hash. Am 29. August 2026 nennt die offizielle Seite die Version 2.4.0, Build 2.4.0.2350. Schreiben Sie diesen Hash nicht dauerhaft in ein Verfahren fest: Er ändert sich mit jeder Version.

Weg unter Windows Server 2025: WinGet

Die simple-acme-Dokumentation gibt an, dass WinGet unter Windows Server 2025 verfügbar ist:

winget install simple-acme

Prüfen Sie anschließend den tatsächlich installierten Pfad:

Get-Command wacs.exe -ErrorAction SilentlyContinue

Bevorzugen Sie unter Server 2019 oder 2022 das offizielle Archiv, sofern WinGet nicht ausdrücklich in Ihrem Image installiert und gepflegt wird.

Die ausführbare Datei prüfen

Set-Location "C:\Program Files\simple-acme"
.\wacs.exe --version

Starten Sie die erste Konfiguration stets aus einer Administratorkonsole. Die Installationsdokumentation von simple-acme weist darauf hin, dass erhöhte Rechte nötig sind, um IIS zu verwalten, die geplante Aufgabe anzulegen und Validierungsanfragen entgegenzunehmen.

6. Vor der Produktion in Staging testen

Let's Encrypt empfiehlt seine Staging-Umgebung für Versuche. Deren Zertifikate sind Browsern nicht vertrauenswürdig, doch die Grenzwerte eignen sich weit besser zur Fehlersuche. Die ACME-v2-Test-URL steht in der Staging-Dokumentation.

Aus dem simple-acme-Ordner:

.\wacs.exe --test --verbose

Wählen Sie dieselbe Website und dieselben Namen wie für die Produktion. Ein Staging-Zertifikat löst im Browser eine Vertrauenswarnung aus: Das ist normal.

Nach dem Test:

  1. öffnen Sie Manage renewals in simple-acme;
  2. ermitteln Sie die Erneuerung, die zum Staging-Server gehört;
  3. brechen Sie sie ab, wenn Sie sie nicht mehr brauchen;
  4. führen Sie danach das Produktivverfahren aus;
  5. prüfen Sie, dass eine Produktivaufgabe und die richtige IIS-Bindung aktiv sind.

Vermeiden Sie den wiederholten Einsatz von --nocache und --force. Stand 29. August 2026 dokumentiert Let's Encrypt unter anderem 50 neue Zertifikate je registrierter Domäne in 7 Tagen, 5 Zertifikate je exakter Menge von Identifikatoren in 7 Tagen und 5 Autorisierungsfehler je Identifikator und Konto pro Stunde. Über ARI koordinierte Erneuerungen sind von diesen Grenzen ausgenommen. Prüfen Sie bei der Diagnose stets die Seite Rate Limits, da sich diese Werte ändern.

7. Das Zertifikat mit dem interaktiven Assistenten ausstellen

Starten Sie:

Set-Location "C:\Program Files\simple-acme"
.\wacs.exe

Für eine gewöhnliche IIS-Website:

  1. wählen Sie N: Create certificate (default settings);
  2. wählen Sie die IIS-Website MeineSeite;
  3. wählen Sie ausschließlich example.com und www.example.com;
  4. prüfen Sie, dass kein interner Name, alter Alias oder Testumgebungsname enthalten ist;
  5. akzeptieren Sie die Nutzungsbedingungen des ACME-Dienstes;
  6. geben Sie eine betriebliche E-Mail-Adresse an;
  7. belassen Sie HTTP-01 und das voreingestellte Self-hosting-Modul;
  8. belassen Sie die Installation im Windows-Speicher und die IIS-Bindungen.

Buchstaben und Bezeichnungen können sich zwischen Versionen leicht ändern. Verlassen Sie sich auf die Bedeutung der Auswahl und auf die Dokumentation der installierten Version, nicht auf einen alten Screenshot.

Das Self-hosting-Plugin von simple-acme startet vorübergehend einen Listener im Arbeitsspeicher. Er kann Port 80 mit IIS und HTTP.sys teilen. Der Port bleibt dennoch von außen erforderlich. Siehe die Self-hosting-Dokumentation.

Am Ende sollte simple-acme jeden Namen validieren, das Zertifikat bei Let's Encrypt anfordern, Zertifikat und Schlüssel im Windows-Speicher ablegen, die passenden HTTPS-Bindungen anlegen oder aktualisieren, die Erneuerungseinstellungen speichern und die tägliche geplante Aufgabe erstellen.

8. Vollständig automatisierte Variante auf der Kommandozeile

Bestätigen Sie zunächst die IIS-ID:

Get-Website -Name "MeineSeite" |
    Select-Object Name, Id

Passen Sie dann diesen Befehl an:

.\wacs.exe `
    --source iis `
    --siteid 2 `
    --host example.com,www.example.com `
    --validation selfhosting `
    --installation iis `
    --emailaddress [email protected] `
    --accepttos

--source iis löst den nicht interaktiven Modus aus. --siteid beschränkt die Quelle auf die richtige Website und --host filtert die Bindungen präzise. Diese Parameter sind in der IIS-Quelle von simple-acme und in der CLI-Referenz dokumentiert.

Bevor Sie diesen Befehl in ein Bereitstellungswerkzeug einbinden, ersetzen Sie jeden Beispielwert, führen Sie ihn zuerst mit --test --verbose aus, übergeben Sie kein DNS-Geheimnis im Klartext über die PowerShell-Historie, bewahren Sie eine Protokollausgabe auf und nutzen Sie die Option L im Erneuerungsmanager, um die einer manuell erstellten Konfiguration entsprechende Befehlszeile zu erhalten.

Die Kommandozeile legt eine neue Erneuerung an. Um eine bestehende Erneuerung zu ändern, nutzen Sie den interaktiven Manager; neue Parameter an --renew anzuhängen konfiguriert das bestehende Objekt nicht um.

9. Zertifikat und IIS-Bindungen prüfen

Die Bindungen prüfen

Get-WebBinding -Name "MeineSeite" |
    Select-Object protocol, bindingInformation, sslFlags,
                  certificateHash, certificateStoreName

Sie sollten je Namen eine HTTPS-Bindung finden:

*:443:example.com
*:443:www.example.com

Auf einem VPS, der mehrere Websites über dieselbe IPv4-Adresse und denselben Port 443 bereitstellt, müssen die Bindungen SNI verwenden. In New-WebBinding bezeichnet der Wert SslFlags = 1 eine SNI-Bindung; Microsoft dokumentiert die Werte 0 bis 3 in der Referenz New-WebBinding.

Das Zertifikat in den Windows-Speichern prüfen

$domain = "example.com"
$stores = @(
    "Cert:\LocalMachine\WebHosting",
    "Cert:\LocalMachine\My"
)

Get-ChildItem $stores -ErrorAction SilentlyContinue |
    Where-Object {
        ($_.DnsNameList | ForEach-Object Unicode) -contains $domain
    } |
    Sort-Object NotAfter -Descending |
    Select-Object Subject, Issuer, Thumbprint,
                  NotBefore, NotAfter, HasPrivateKey

Prüfen Sie, dass Issuer der erwarteten Let's-Encrypt-Kette entspricht, dass HasPrivateKey den Wert True hat, dass NotAfter in der Zukunft liegt, dass DnsNameList alle genutzten Namen enthält und dass der Fingerabdruck zur HTTPS-Bindung passt.

Manche modernen Profile füllen den Common Name nicht mehr. Maßgeblich für die Namen ist der Subject Alternative Name; stützen Sie die Prüfung daher nicht allein auf Subject.

HTTP.sys prüfen

netsh http show sslcert

Microsoft empfiehlt, bei einem Zwischenfall die Bindung in ApplicationHost.config mit dem SSL-Speicher von HTTP.sys zu vergleichen. Siehe How to Set Up SSL on IIS und die Referenz netsh http.

Von außen prüfen

Aus einem anderen Netz:

curl.exe -I http://example.com/
curl.exe -I https://example.com/
curl.exe -I https://www.example.com/

Nach Einrichtung der Weiterleitung muss der erste Aufruf ein 301 oder 308 auf HTTPS liefern. Die HTTPS-Aufrufe müssen ohne Namens- oder Kettenfehler antworten.

Testen Sie außerdem einen Browser ohne vorherige Sitzung, ein Mobiltelefon über 4G oder 5G, IPv4 und IPv6, falls AAAA existiert, einen anerkannten externen TLS-Analysedienst sowie Seiten mit Bildern, Skripten und Stylesheets, um gemischte HTTP-Inhalte zu erkennen.

10. Die Weiterleitung von HTTP auf HTTPS einrichten

Aktivieren Sie die Weiterleitung erst, wenn Sie das Zertifikat für jeden Namen geprüft haben.

IIS 10 ab Version 1709 verfügt über einen nativen HSTS-Mechanismus auf Website-Ebene, samt Weiterleitung von HTTP auf HTTPS. Microsoft weist darauf hin, dass das Ziel den Standardport 443 verwendet. Führen Sie aus:

$appcmd = "$env:windir\System32\inetsrv\appcmd.exe"

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MeineSeite'].hsts.enabled:True" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MeineSeite'].hsts.max-age:300" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MeineSeite'].hsts.includeSubDomains:False" `
    /commit:apphost

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MeineSeite'].hsts.redirectHttpToHttps:True" `
    /commit:apphost

Die Attribute und diese appcmd-Syntax sind in der Microsoft-Referenz HSTS settings for a Web Site veröffentlicht.

Beginnen Sie während der Funktionsprüfung mit max-age=300. Sobald HTTPS und die Erneuerung beobachtet wurden, wechseln Sie auf 60 Tage, also 5184000 Sekunden, achten Sie auf Zertifikatsfehler und Subdomänen und erhöhen Sie danach auf ein Jahr, also 31536000, sofern Ihre Organisationsrichtlinie das vorsieht.

Um die Dauer zu ändern:

& $appcmd set config `
    -section:system.applicationHost/sites `
    "/[name='MeineSeite'].hsts.max-age:5184000" `
    /commit:apphost

Aktivieren Sie includeSubDomains nur, wenn alle Subdomänen dauerhaft über HTTPS laufen. Aktivieren Sie das HSTS-Preloading nicht bloß, um eine Bewertung zu verbessern: Die Aufnahme in die Preload-Liste ist eine eigenständige Verpflichtung und lässt sich nur schwer kurzfristig rückgängig machen.

HSTS verwandelt Zertifikatsfehler in nicht umgehbare Fehlschläge für Browser, die die Richtlinie gespeichert haben. Let's Encrypt empfiehlt eine vorsichtige Einführung und warnt vor diesem Risiko in seinem Integration Guide.

Muss Port 80 nach der Weiterleitung offen bleiben?

Ja, wenn die Erneuerung HTTP-01 verwendet. Port 80 kann ausschließlich der Weiterleitung und /.well-known/acme-challenge/ dienen, muss für künftige Validierungen aber öffentlich erreichbar bleiben. Let's Encrypt folgt einer gültigen Weiterleitung auf 443, und der Self-hosting-Listener von simple-acme kann sich den Port mit IIS teilen.

Verlangt Ihre Richtlinie das dauerhafte Schließen von Port 80, stellen Sie die Erneuerung zuvor auf DNS-01 oder ein anderes kompatibles Verfahren um. Schließen Sie den Port nicht und warten Sie bis zum Ablauf, um dann festzustellen, dass die Erneuerung defekt ist.

11. Die automatische Erneuerung prüfen und überwachen

simple-acme legt nach dem ersten erfolgreichen Zertifikat eine geplante Aufgabe an. Standardmäßig läuft sie täglich unter dem Konto SYSTEM, zu einer zufällig zwischen 9 und 11 Uhr gewählten Zeit, um die Last zu verteilen. Erneuert wird nur, wenn eine Bedingung es verlangt, insbesondere die verbleibende Laufzeit des Zertifikats, eine Änderung der Namen, ein Widerruf, eine unvollständige Installation oder eine ARI-Empfehlung. Siehe Automatic renewal.

Listen Sie die Aufgabe auf:

Get-ScheduledTask |
    Where-Object TaskName -Match "simple-acme|win-acme" |
    Select-Object TaskName, State, TaskPath

Zeigen Sie ihren Zustand an:

$task = Get-ScheduledTask |
    Where-Object TaskName -Match "simple-acme" |
    Select-Object -First 1

if ($task) {
    Get-ScheduledTaskInfo `
        -TaskName $task.TaskName `
        -TaskPath $task.TaskPath
}

Prüfen Sie LastTaskResult, LastRunTime und NextRunTime. Die Aufgabe muss aktiviert bleiben und auf den dauerhaften simple-acme-Ordner zeigen.

Testen, ohne wiederholte Ausstellungen auszulösen

Eine normale Prüfung erzwingt kein neues Zertifikat:

.\wacs.exe --renew --verbose

Dieser Befehl erneuert nur Objekte, die ihr Zeitfenster erreicht haben. Für einen einmaligen Test des gesamten Ablaufs schlägt die Dokumentation vor:

.\wacs.exe --renew --force --verbose

Führen Sie --force nicht in einer Schleife aus und ergänzen Sie --nocache nicht ohne Grund. Nutzen Sie für wiederholte Fehlersuche das Staging. Der Cache schützt teilweise vor den Grenzwerten, ersetzt aber keine Diagnosemethode.

Die Protokolle einsehen

Die Protokolle liegen normalerweise unter:

%ProgramData%\simple-acme\<acme-server>\Log

So finden Sie die aktuellen Dateien:

Get-ChildItem "$env:ProgramData\simple-acme" -Recurse -File |
    Where-Object Extension -In ".log",".txt" |
    Sort-Object LastWriteTime -Descending |
    Select-Object -First 20 FullName, LastWriteTime, Length

Sehen Sie auch in die Windows-Ereignisanzeige. simple-acme bewahrt seine Protokolle standardmäßig 120 Tage auf und kann Benachrichtigungen senden, wenn ein SMTP-Server konfiguriert ist.

Vor einem nahen Ablauf warnen

Diese lokale Prüfung lässt sich in Ihre Überwachung einbinden:

$warningDate = (Get-Date).AddDays(21)

$expiring = Get-ChildItem `
    "Cert:\LocalMachine\WebHosting",
    "Cert:\LocalMachine\My" `
    -ErrorAction SilentlyContinue |
    Where-Object {
        $_.HasPrivateKey -and
        $_.NotAfter -lt $warningDate -and
        $_.NotAfter -gt (Get-Date)
    } |
    Sort-Object NotAfter |
    Select-Object Subject, Thumbprint, NotAfter

$expiring

Überwachen Sie das Datum, das dem entfernten Client präsentiert wird, nicht nur die lokal gespeicherten Zertifikate. Ein altes Zertifikat kann weiterhin ausgeliefert werden, wenn die IIS-Bindung oder der Proxy nicht aktualisiert wurde.

Am 29. August 2026 sind Let's-Encrypt-Zertifikate standardmäßig 90 Tage gültig, und die große Mehrheit der ausgestellten Zertifikate nutzt diese Laufzeit. Ein kurzes Profil von etwa 6 Tagen steht allen Abonnenten optional zur Verfügung. Let's Encrypt kündigt außerdem an, die maximale Laufzeit seiner Zertifikate bis Februar 2028 auf 45 Tage zu senken; Branchenregeln begrenzen die Laufzeit ab dem 15. März 2029 auf höchstens 47 Tage. Die offizielle Seite zu den Zertifikatslaufzeiten zeigt, warum eine überwachte Automatisierung unverzichtbar ist.

12. Wildcard-Zertifikat mit DNS-01

Für *.example.com funktioniert HTTP-01 nicht. Starten Sie simple-acme erneut und wählen Sie M: full options:

  1. Quelle: IIS-Bindungen oder manuell eingegebene Namen;
  2. Namen: example.com und *.example.com, falls beide nötig sind;
  3. Validierung: DNS-01;
  4. Plugin: das Ihres DNS-Anbieters;
  5. Schlüssel: RSA oder EC, je nach Richtlinie und Clients;
  6. Speicherung: Windows-Zertifikatspeicher;
  7. Installation: IIS-Bindungen.

Das Wildcard *.example.com deckt www.example.com oder app.example.com ab, nicht aber die nackte Domäne example.com und nicht a.b.example.com. Fordern Sie die nackte Domäne ausdrücklich an, wenn sie abgedeckt sein soll.

Für externe Plugins ist der full-Build von simple-acme erforderlich, da der trimmed-Build sie nicht unterstützt. Plugins werden unter %ProgramData%\simple-acme\plugins installiert. Die aktuelle Liste steht in der Dokumentation zur DNS-Validierung.

Sicherheit der DNS-Zugangsdaten

  • erstellen Sie ein eigenes Token für die ACME-Validierung;
  • beschränken Sie es auf die unbedingt nötigen Zonen und Aktionen;
  • nutzen Sie den Geheimnisspeicher von simple-acme statt eines Klartextarguments;
  • schützen Sie den Ordner %ProgramData%\simple-acme;
  • planen Sie Rotation und Widerruf des Tokens;
  • verwenden Sie keinen globalen Kontoschlüssel, wenn ein eingeschränktes Token existiert.

Bietet Ihr DNS-Anbieter keine geeignete API, delegieren Sie _acme-challenge.example.com per CNAME oder NS an eine automatisierbare Validierungszone. So vermeiden Sie es mitunter, dem Webserver Zugriff auf Ihre gesamte Hauptzone zu geben.

13. TLS härten, ohne Windows zu zerlegen

Das Zertifikat wählt die TLS-Versionen und Cipher Suites nicht allein. IIS stützt sich auf Schannel, die Konfiguration ist also weitgehend auf Systemebene festgelegt.

Erfassen Sie die Suites:

Get-TlsCipherSuite |
    Select-Object Name, Cipher, Hash, Exchange

Microsoft empfiehlt Anwendungen, die Systemvorgaben zu verwenden, statt willkürlich eigene Protokollversionen zu erzwingen. Die Dokumentation TLS registry settings weist zudem darauf hin, dass eine Schannel-Änderung auch andere Dienste als die IIS-Website betrifft.

Kontrollpunkte: installieren Sie die Windows-Updates, behalten Sie TLS 1.2 aus Kompatibilitätsgründen, beachten Sie, dass TLS 1.3 ab Windows Server 2022 unterstützt wird, deaktivieren Sie veraltete Protokolle erst nach einer Bestandsaufnahme Ihrer Clients, testen Sie Anwendung, APIs, Überwachungsagenten und ältere Clients, sichern Sie die Einstellungen vor jeder Änderung und vermeiden Sie es, ein nicht versioniertes Registry-Skript aus einem Blog zu übernehmen.

Die Support-Matrix steht in Protocols in TLS/SSL (Schannel SSP). Eine zu strenge Richtlinie kann auch verhindern, dass der ACME-Client die API erreicht.

14. Fehlerbehebung: Symptome, Ursachen und Maßnahmen

SymptomWahrscheinliche UrsachePrüfungBehebung
connection timed out bei HTTP-01Port 80 vorgelagert gefiltertexterner TCP-80-TestWindows-Firewall und Netzwerk-Firewall öffnen
unauthorized mit 404falscher Server oder falsche BindungDNS, IIS-Protokolle, BindungenA/AAAA und den Host-Header korrigieren
Validierung versucht eine falsche IPv6veralteter oder widersprüchlicher AAAAResolve-DnsName -Type AAAAAAAA korrigieren oder entfernen
CAA forbids issuanceCAA lässt Let's Encrypt nicht zuResolve-DnsName -Type CAAletsencrypt.org zulassen, sofern richtlinienkonform
DNS-SERVFAILDNSSEC oder autoritatives DNS defektAbfragen an jeden NSDNSSEC oder DNS-Server reparieren
Self-hosting-Listener startet nichtURL-Reservierung oder inkompatible Softwarenetsh http show urlaclReservierung korrigieren oder filesystem/DNS-01 nutzen
falsches Zertifikat ausgeliefertfehlerhafte SNI-Bindung oder falscher FingerabdruckGet-WebBinding, netsh http show sslcertHost-Header, SNI und Zertifikat korrigieren
Browser meldet gemischte InhalteRessourcen weiterhin über HTTP geladenEntwicklerkonsoleRessourcen-URLs auf HTTPS umstellen
Erneuerung fehltAufgabe gelöscht oder Pfad verschobenAufgabenplanungAufgabe aus simple-acme neu erstellen
Erneuerung erfolgreich, altes Zertifikat ausgeliefertIIS-Schritt nicht installiert oder zwischengeschalteter ProxyIIS-Bindung und Test von außenInstallation neu konfigurieren, TLS-Terminator aktualisieren
zu viele AnfragenTests im Produktivbetrieb durchgeführtACME-Protokoll und Header Retry-Afterwarten, Retry-After beachten und Staging nutzen

Den HTTP-01-Pfad testen

Die voreingestellte Validierung läuft im Arbeitsspeicher, während simple-acme ausgeführt wird. Um eine Route oder einen Proxy zu diagnostizieren, können Sie dennoch prüfen, ob eine Regel das Präfix blockiert:

curl.exe -I http://example.com/.well-known/acme-challenge/test

Ein 404 außerhalb einer Validierung ist normal; eine Netzwerkabweisung, eine erzwungene Authentifizierung, eine WAF-Sperre oder eine Weiterleitung auf einen ungewöhnlichen Port sind es nicht. Beobachten Sie bei einer echten Validierung mit --test --verbose die ausführliche Antwort und die Protokolle.

Den Prozess auf Port 80 ermitteln

$connection = Get-NetTCPConnection -LocalPort 80 -State Listen |
    Select-Object -First 1

if ($connection) {
    Get-Process -Id $connection.OwningProcess
}

netsh http show urlacl

Der Prozess System ist bei HTTP.sys und IIS üblich; er bedeutet nicht automatisch, dass Schadsoftware den Port belegt.

Ein falsches SNI-Zertifikat diagnostizieren

Zeigen Sie die HTTPS-Bindungen an:

Get-WebBinding -Protocol https |
    Select-Object ItemXPath, bindingInformation, sslFlags,
                  certificateHash, certificateStoreName

Teilen sich mehrere Websites *:443, braucht jeder Name seine eigene Bindung und SNI muss aktiv sein. Die leere Bindung *:443: kann für Clients ohne SNI zur Standardbindung werden und ein unerwartetes Zertifikat ausliefern.

15. Wartung, Aktualisierung und Reaktion auf Zwischenfälle

simple-acme aktualisieren

Unter Windows Server 2025 mit WinGet:

winget upgrade simple-acme

Bei manueller Installation laden Sie das neue offizielle Archiv, prüfen den Hash, sichern den Ordner und ersetzen die Programmdateien. Die Erneuerungen liegen getrennt unter %ProgramData% und müssen erhalten bleiben. Nach der Aktualisierung:

.\wacs.exe --version
.\wacs.exe --list
.\wacs.exe --renew --verbose

Lesen Sie vor einem Wechsel auf einen neuen Hauptzweig stets die Versionshinweise.

Bei einem Leck des privaten Schlüssels

  1. isolieren und analysieren Sie den kompromittierten Server;
  2. widerrufen Sie das Zertifikat;
  3. beheben Sie die Ursache des Lecks;
  4. erzeugen Sie einen neuen Schlüssel und ein neues Zertifikat;
  5. ersetzen Sie alle betroffenen Bindungen;
  6. suchen Sie nach weiteren offengelegten Zertifikaten oder Geheimnissen;
  7. dokumentieren Sie den Vorfall.

In simple-acme steht der Widerruf unter Manage renewals > Revoke certificate oder über --revoke mit der Kennung der Erneuerung zur Verfügung. Let's Encrypt hält fest, dass ein Widerruf bei kompromittiertem privatem Schlüssel erforderlich ist, und beschreibt die zulässigen Gründe in Revoking Certificates.

Eine Erneuerung abzubrechen ist nicht dasselbe wie ein Zertifikat zu widerrufen. Der Abbruch beendet die künftige Verwaltung; der Widerruf signalisiert, dass einem bereits ausgestellten Zertifikat nicht mehr vertraut werden darf.

Checkliste für die Inbetriebnahme

  • Windows Server und IIS sind aktuell.
  • Die IIS-Website hat ausdrückliche Host-Header.
  • A zeigt auf die richtige öffentliche IPv4-Adresse.
  • Jeder veröffentlichte AAAA liefert korrekt dieselbe Website aus.
  • Die Ports 80 und 443 sind von außen erreichbar.
  • Die IIS-Konfiguration wurde gesichert.
  • simple-acme stammt aus der offiziellen Quelle und der Hash wurde geprüft.
  • Für die anfängliche Fehlersuche wurde Staging verwendet.
  • Das Zertifikat enthält alle erwarteten SAN.
  • Die HTTPS-Bindungen nutzen SNI, wenn die IP-Adresse geteilt wird.
  • HTTP leitet ohne Schleife auf HTTPS um.
  • HSTS wurde schrittweise eingeführt.
  • Die geplante Aufgabe existiert, ist aktiviert und war bereits erfolgreich.
  • Protokolle und Ablaufdatum werden überwacht.
  • Das Validierungsverfahren steht auch bei der nächsten Erneuerung zur Verfügung.
  • Ein Verfahren für Widerruf und Wiederanlauf existiert.

Häufige Fragen

Ist Let's Encrypt auf IIS wirklich kostenlos?

Ja. Let's Encrypt berechnet für die Ausstellung seiner DV-Zertifikate nichts. Der Windows-VPS, der Domänenname, die Administration und etwaige DNS-Dienste bleiben bei ihren Anbietern kostenpflichtig.

Ist das Zertifikat 90 Tage gültig?

Am 29. August 2026 ist das klassische Profil weiterhin standardmäßig 90 Tage gültig. Ein kurzes Profil von etwa 6 Tagen ist optional verfügbar, und Let's Encrypt plant, die Höchstlaufzeit bis Februar 2028 auf 45 Tage zu senken. Bauen Sie den Betrieb niemals auf eine manuelle vierteljährliche Erneuerung auf.

Ist Port 80 zwingend?

Für HTTP-01 ist er zwingend, auch wenn der interne Listener hinter einer Weiterleitung oder NAT einen anderen Port nutzt. Für DNS-01 ist er nicht nötig. TLS-ALPN-01 nutzt 443, eignet sich aber vor allem für fortgeschrittene Infrastrukturen.

Kann Port 80 nach der Installation geschlossen werden?

Nicht, wenn die Erneuerung bei HTTP-01 bleibt. Halten Sie ihn für die Weiterleitung und die Validierungen erreichbar oder stellen Sie die Erneuerung vor dem Schließen auf DNS-01 um.

Wie erhalte ich ein Wildcard *.example.com?

Nutzen Sie DNS-01 mit einem automatisierten API-Plugin, verfügbar im full-Build von simple-acme. Fügen Sie dem Zertifikat auch example.com hinzu, wenn die nackte Domäne abgedeckt sein soll.

Deckt ein Wildcard-Zertifikat alle Ebenen ab?

Nein. *.example.com deckt eine einzige Ebene wie www.example.com ab, aber weder example.com noch a.b.example.com.

RSA oder ECDSA?

RSA bietet sehr breite Kompatibilität. ECDSA liefert kompaktere Schlüssel und Signaturen, muss aber mit Ihren ältesten Clients geprüft werden. Für eine erste, breit genutzte IIS-Bereitstellung ist die Voreinstellung des Werkzeugs meist die sicherste Wahl.

Genügt HTTPS zur Absicherung der Website?

Nein. HTTPS verschlüsselt den Transport und authentifiziert den präsentierten Namen. Es ersetzt weder Updates noch Zugriffskontrolle, Sicherungen, Anwendungssicherheit, Schutz der Geheimnisse und Überwachung.

Und auf einem Linux-VPS?

Das Vorgehen ist dasselbe, das Werkzeug jedoch ein anderes: Unter Nginx oder Apache verwendet man üblicherweise Certbot. Siehe unsere Anleitung zum Installieren eines Let's-Encrypt-SSL-Zertifikats mit Certbot unter Nginx oder Apache.

Fazit

Unter IIS dauert es mit simple-acme nur wenige Minuten, ein Let's-Encrypt-Zertifikat zu erhalten. Aufmerksamkeit verlangt alles, was danach kommt: die richtige HTTPS-Bindung für jeden Namen, eine Weiterleitung ohne Schleife, ein schrittweise eingeführtes HSTS und vor allem eine Erneuerung, die auch in drei Monaten ohne Sie funktioniert.

Merken Sie sich die drei häufigsten Fallen: ein AAAA-Eintrag, der woandershin zeigt und die Validierung scheitern lässt; ein nach der HTTPS-Umstellung geschlossener Port 80, obwohl die Erneuerung davon abhängt; und eine IIS-Bindung, die nie aktualisiert wurde und weiterhin das alte Zertifikat ausliefert. Prüfen Sie diese drei Punkte, dann hält die Automatisierung.

Wichtigste technische Quellen

Let's Encrypt

simple-acme

Microsoft