Let's Encrypt ist eine gemeinnützige Zertifizierungsstelle (Certificate Authority) der Internet Security Research Group. Sie gibt seit 2015 TLS-Zertifikate kostenlos aus und hat damit HTTPS im Web massiv verbreitet. Bezahlt wird nicht mit Geld, sondern mit Automatisierung: Die Zertifikate laufen nach 90 Tagen ab und werden programmatisch erneuert.

Das ACME-Protokoll

Die Ausstellung läuft über ACME (Automatic Certificate Management Environment, heute RFC 8555). Der Ablauf ist immer gleich:

  1. Der Client erzeugt einen Schlüssel und eine Zertifikatsanfrage (CSR).
  2. Er weist gegenüber Let's Encrypt nach, dass er die Domain kontrolliert (Challenge).
  3. Die CA stellt das Zertifikat aus, der Client installiert es und richtet die Erneuerung ein.

Die drei Challenge-Arten

  • HTTP-01: Eine Datei wird unter /.well-known/acme-challenge/ bereitgestellt. Funktioniert nur auf Port 80.
  • DNS-01: Ein TXT-Record wird gesetzt. Die einzige Variante, die Wildcard-Zertifikate (*.example.de) erlaubt.
  • TLS-ALPN-01: Nachweis über eine eigene TLS-Verhandlung auf Port 443.

Praxis: certbot

# Zertifikat holen und nginx passend konfigurieren
sudo certbot --nginx -d example.de -d www.example.de

# Nur ausstellen, ohne Webserver anzufassen
sudo certbot certonly --webroot -w /var/www/html -d example.de

# Erneuerbare Zertifikate testweise erneuern
sudo certbot renew --dry-run

certbot legt beim Paket-Einbau üblicherweise einen Timer an, der zweimal täglich prüft und fällige Zertifikate erneuert. Das Ergebnis kontrolliert man mit:

openssl s_client -connect example.de:443 -servername example.de \
  < /dev/null 2>/dev/null | openssl x509 -noout -dates -subject

Rate Limits

Weil sich alles automatisieren lässt, gibt es Grenzen gegen Missbrauch. Bekannt sind unter anderem 50 Zertifikate pro registrierter Domain und Woche sowie 5 identische („duplicate") Zertifikate pro Woche. Wer beim Testen gegen diese Grenzen läuft, nutzt die Staging-Umgebung von Let's Encrypt.

Siehe auch