aethercert
Dokumentation

Apache HTTP Server: SSL-Zertifikat austauschen

SSL-Zertifikat auf Apache 2.4 (Debian/Ubuntu und RHEL) austauschen: vHost-Dateien finden, Kette bauen, Schlüssel prüfen, apachectl configtest, Graceful Reload und Prüfung.

Apache HTTP Server 2.4 liest Zertifikat und Schlüssel aus SSLCertificateFile und SSLCertificateKeyFile in jedem TLS-VirtualHost. Seit Apache 2.4.8 darf die Zertifikatsdatei die Zwischenzertifikate nach dem Serverzertifikat enthalten, SSLCertificateChainFile wird nicht mehr gebraucht.

Debian / UbuntuRHEL / Rocky / Alma
Konfiguration/etc/apache2//etc/httpd/ (TLS: conf.d/ssl.conf)
Übliche Zertifikatspfade/etc/ssl/certs/, /etc/ssl/private//etc/pki/tls/certs/, /etc/pki/tls/private/
Dienstapache2httpd

Voraussetzungen

  • Ermitteln Sie, welcher VirtualHost welche Dateien nutzt. apachectl -S listet die VirtualHosts und ihre Konfigurationsdateien; grep zeigt die Zertifikatszeilen:

    sudo apachectl -S
    sudo grep -Rn 'SSLCertificate' /etc/apache2 /etc/httpd 2>/dev/null
  • Bereiten Sie Serverzertifikat (leaf.pem), Zwischenzertifikat(e) (intermediates.pem) und privaten Schlüssel (private.key) vor, alle als PEM. Das Stammzertifikat gehört nicht dazu.

  • Sichern Sie die aktuellen Dateien samt Rechten:

    sudo cp -a /etc/pki/tls/certs/www.crt /etc/pki/tls/certs/www.crt.bak
    sudo cp -a /etc/pki/tls/private/www.key /etc/pki/tls/private/www.key.bak

Zertifikat Schritt für Schritt austauschen

  1. Kette bauen - Serverzertifikat zuerst - und prüfen, ob der Schlüssel dazugehört:

    cat leaf.pem intermediates.pem > fullchain.pem
    openssl verify -untrusted intermediates.pem leaf.pem
    openssl pkey -in private.key -pubout | sha256sum
    openssl x509 -in leaf.pem -noout -pubkey | sha256sum

    openssl verify muss OK ausgeben, und die beiden Hashes müssen gleich sein.

  2. Dateien an den Pfaden installieren, die der VirtualHost nutzt. Der Schlüssel darf nur für root lesbar sein: Der Elternprozess von Apache läuft als root und liest ihn, auch bei einem Graceful Reload, bevor er die Arbeit an die Kindprozesse übergibt.

    sudo install -m 0644 fullchain.pem /etc/pki/tls/certs/www.crt
    sudo install -m 0600 private.key   /etc/pki/tls/private/www.key
    sudo restorecon -v /etc/pki/tls/certs/www.crt /etc/pki/tls/private/www.key  # nur SELinux-Systeme
    SSLEngine on
    SSLCertificateFile    "/etc/pki/tls/certs/www.crt"
    SSLCertificateKeyFile "/etc/pki/tls/private/www.key"
  3. Konfiguration testen, dann Graceful Reload:

    sudo apachectl configtest
    sudo systemctl reload httpd      # RHEL
    # sudo systemctl reload apache2  # Debian/Ubuntu

    configtest prüft die Syntax, nicht ob Schlüssel und Zertifikat zusammenpassen - deshalb prüft das Schritt 1. Auf beiden Distributionen löst systemctl reload einen Graceful Restart aus: Laufende Anfragen werden beendet, neue Verbindungen bekommen das neue Zertifikat, niemand wird getrennt.

Verschlüsselte private Schlüssel

Ein Schlüssel mit Passphrase lässt Apache bei jedem Start und Reload danach fragen - ein von systemd gestarteter Dienst kann nicht antworten, der Start schlägt fehl. Verwenden Sie entweder einen unverschlüsselten Schlüssel, geschützt über die Dateirechte (Passphrase entfernen mit openssl pkey -in encrypted.key -out private.key), oder konfigurieren Sie SSLPassPhraseDialog mit einem Programm, das die Passphrase liefert - je nach Ihrer Richtlinie für Schlüssel.

Neues Zertifikat prüfen

openssl s_client -connect www.example.com:443 -servername www.example.com -showcerts </dev/null
sudo journalctl -u httpd --since "10 minutes ago"     # bzw. -u apache2

Prüfen Sie Antragsteller und SAN, Aussteller, Ablaufdatum und ob das Zwischenzertifikat mitgesendet wird - für jeden namensbasierten VirtualHost, mit seinem eigenen Namen als -servername.

Rollback

Kopieren Sie die .bak-Dateien zurück, führen Sie apachectl configtest aus und laden Sie neu. Behalten Sie die Sicherung, bis das neue Zertifikat geprüft ist.

Häufige Probleme

  • Die Änderung erfolgte im falschen Konfigurationsbaum (apache2 statt httpd) oder für den falschen VirtualHost.
  • Die Kette ist unvollständig, oder der Schlüssel passt nicht.
  • Ein verschlüsselter Schlüssel blockiert Start oder Reload.
  • SELinux verweigert den Zugriff auf Dateien ohne passendes Label (restorecon).
  • Ein anderer SNI-VirtualHost wurde getestet.

Zertifikatstausch mit aethercert automatisieren

Die aethercert-Vorlage für Apache schreibt die konfigurierten Zertifikats-/Ketten- und Schlüsseldateien und führt den konfigurierten Reload-Befehl aus. Standard ist systemctl reload apache2; auf RHEL-basierten Systemen setzen Sie systemctl reload httpd.

Unter Deployment-Ziele finden Sie die Felder dieser Vorlage, die Voraussetzungen auf dem Host und den Stand der Verifizierung.

Quellen

Auf dieser Seite