Diese Anleitung führt Sie durch die Installation eines SSL-Zertifikats auf dem Apache HTTP Server mit mod_ssl — vom Hochladen der Dateien über gehärtete TLS-Einstellungen bis zur Fehlerbehebung häufiger Fehler. Funktioniert mit Zertifikaten von GetHTTPS, Certbot oder jeder anderen CA.
Wenn Sie noch kein Zertifikat haben, erhalten Sie eines kostenlos in 5 Minuten.
Voraussetzungen
- Apache 2.4+ installiert und Ihre Website über HTTP (Port 80) bereitstellend
- Root-/sudo-Zugriff auf den Server
- Zertifikatsdateien — Apache benötigt drei separate Dateien:
cert.pem— Ihr Zertifikat (nur End-Entity)privkey.pem— Ihr privater Schlüsselchain.pem— Zwischen-CA-Zertifikatskette
Warum drei Dateien? Im Gegensatz zu Nginx (das eine einzelne
fullchain.pemverwendet), erwartet Apache traditionell das Zertifikat und die Kette als separate Dateien. Apache 2.4.8+ kannfullchain.peminSSLCertificateFileverwenden undSSLCertificateChainFileüberspringen. Formatdetails →
Schritt 1: Zertifikatsdateien hochladen
# Sicheres Verzeichnis erstellen
sudo mkdir -p /etc/ssl/gethttps
# Dateien auf den Server kopieren
sudo cp cert.pem chain.pem privkey.pem /etc/ssl/gethttps/
# Privaten Schlüssel absichern
sudo chmod 600 /etc/ssl/gethttps/privkey.pem
sudo chmod 644 /etc/ssl/gethttps/cert.pem /etc/ssl/gethttps/chain.pem
sudo chown root:root /etc/ssl/gethttps/*
Bei Übertragung via SCP:
scp cert.pem chain.pem privkey.pem user@your-server:/tmp/
# Auf dem Server:
sudo mv /tmp/{cert,chain,privkey}.pem /etc/ssl/gethttps/
Schritt 2: Erforderliche Apache-Module aktivieren
# Debian/Ubuntu
sudo a2enmod ssl # Kern-SSL-Modul
sudo a2enmod headers # Für HSTS und Sicherheitsheader
sudo a2enmod rewrite # Für HTTP→HTTPS-Weiterleitung (bei Verwendung von .htaccess)
sudo systemctl restart apache2
# CentOS/RHEL/Amazon Linux
sudo yum install mod_ssl # Installiert und aktiviert normalerweise in einem Schritt
sudo systemctl restart httpd
Überprüfen, ob mod_ssl geladen ist:
apachectl -M | grep ssl
# Erwartet: ssl_module (shared)
Schritt 3: Den HTTPS-VirtualHost konfigurieren
Erstellen oder bearbeiten Sie die SSL-Konfiguration Ihrer Website. Unter Debian/Ubuntu ist dies typischerweise /etc/apache2/sites-available/yourdomain-ssl.conf:
# ─── HTTPS-Server ────────────────────────────
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
# Zertifikatsdateien
SSLEngine on
SSLCertificateFile /etc/ssl/gethttps/cert.pem
SSLCertificateKeyFile /etc/ssl/gethttps/privkey.pem
SSLCertificateChainFile /etc/ssl/gethttps/chain.pem
# TLS-Protokoll — nur 1.2 und 1.3
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLHonorCipherOrder off
SSLCompression off
# OCSP-Stapling (schnellere Zertifikatsverifizierung für Clients)
SSLUseStapling on
SSLStaplingCache "shmcb:/var/run/apache2/ssl_stapling(128000)"
# Sicherheitsheader
Header always set Strict-Transport-Security "max-age=63072000; includeSubDomains"
Header always set X-Content-Type-Options "nosniff"
Header always set X-Frame-Options "SAMEORIGIN"
# Ihre Website
DocumentRoot /var/www/html
<Directory /var/www/html>
AllowOverride All
</Directory>
</VirtualHost>
# ─── HTTP-Weiterleitung ───────────────────────────
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
Was jede Direktive bewirkt:
| Direktive | Zweck |
|---|---|
SSLEngine on | Aktiviert SSL/TLS für diesen VirtualHost |
SSLCertificateFile | Pfad zu Ihrem Zertifikat |
SSLCertificateKeyFile | Pfad zu Ihrem privaten Schlüssel |
SSLCertificateChainFile | Pfad zum Zwischen-CA-Zertifikat |
SSLProtocol | Nur TLS 1.2/1.3 — ältere Versionen veraltet |
SSLHonorCipherOrder off | Lässt den Client die beste Cipher-Suite wählen |
SSLCompression off | Verhindert CRIME-Angriff |
SSLUseStapling | Server ruft OCSP-Antwort vorab ab |
Strict-Transport-Security | HSTS — Browser merken sich, immer HTTPS zu verwenden |
Redirect permanent | 301-Weiterleitung HTTP → HTTPS |
Schritt 4: Website aktivieren und testen
# Debian/Ubuntu
sudo a2ensite yourdomain-ssl.conf
sudo apachectl configtest # Muss "Syntax OK" ausgeben
sudo systemctl reload apache2
# CentOS/RHEL
sudo apachectl configtest
sudo systemctl reload httpd
Wenn configtest einen Fehler meldet, nennt es die genaue Zeile — beheben Sie ihn vor dem Neuladen.
Schritt 5: Überprüfen
Browser: Besuchen Sie https://yourdomain.com. Klicken Sie auf das Schloss → überprüfen Sie “Let’s Encrypt” als Aussteller.
Kommandozeile:
echo | openssl s_client -connect yourdomain.com:443 -servername yourdomain.com 2>/dev/null \
| openssl x509 -noout -subject -issuer -dates
Online: Verwenden Sie den SSL Labs Server Test für eine umfassende Bewertung. Ziel: A oder A+.
Apache vs Nginx: Unterschiede bei Zertifikatsdateien
| Apache | Nginx | |
|---|---|---|
| Zertifikat | SSLCertificateFile cert.pem | ssl_certificate fullchain.pem |
| Privater Schlüssel | SSLCertificateKeyFile privkey.pem | ssl_certificate_key privkey.pem |
| Kette | SSLCertificateChainFile chain.pem | In fullchain.pem enthalten |
| Benötigte Dateien | 3 separate Dateien | 2 Dateien (Kette kombiniert) |
Apache 2.4.8+ kann auch die kombinierte fullchain.pem in SSLCertificateFile verwenden — dann können Sie SSLCertificateChainFile weglassen.
Erneuerung
Wenn sich Ihr Zertifikat dem Ablauf nähert (hier prüfen):
# Dateien ersetzen
sudo cp new-cert.pem /etc/ssl/gethttps/cert.pem
sudo cp new-chain.pem /etc/ssl/gethttps/chain.pem
sudo cp new-privkey.pem /etc/ssl/gethttps/privkey.pem
# Neuladen (nicht neu starten) — keine Ausfallzeit
sudo systemctl reload apache2 # Debian/Ubuntu
sudo systemctl reload httpd # CentOS/RHEL
Vollständige Erneuerungsanleitung → | Mit Certbot automatisieren →
Fehlerbehebung
”AH02572: Failed to configure certificate” / Schlüssel stimmen nicht überein
Das Zertifikat und der private Schlüssel passen nicht zusammen. Überprüfen Sie die Übereinstimmung:
# Diese beiden Hashes müssen identisch sein
openssl x509 -noout -modulus -in /etc/ssl/gethttps/cert.pem | md5sum
openssl rsa -noout -modulus -in /etc/ssl/gethttps/privkey.pem | md5sum
Wenn sie sich unterscheiden, verwenden Sie Dateien aus verschiedenen GetHTTPS-Sitzungen. Laden Sie beide aus derselben Sitzung erneut herunter.
”AH01909: server certificate does NOT include an ID”
Ihr ServerName stimmt mit keiner Domain im SAN-Feld des Zertifikats überein:
openssl x509 -noout -text -in /etc/ssl/gethttps/cert.pem | grep -A1 "Subject Alternative Name"
Stellen Sie sicher, dass Ihr Apache ServerName exakt mit einem der aufgeführten DNS-Namen übereinstimmt.
Browser zeigt “Zertifikat nicht vertrauenswürdig”
Die Zwischenzertifikatskette fehlt. Überprüfen Sie, ob SSLCertificateChainFile auf chain.pem (das Zwischenzertifikat) zeigt, nicht auf cert.pem. Testen Sie die Kette:
echo | openssl s_client -connect yourdomain.com:443 2>/dev/null | grep "Verify return code"
# "Verify return code: 0 (ok)" = gut
# "Verify return code: 21 (unable to verify)" = Kette unvollständig
“AH00526: Syntax error on line X”
Apache-Konfigurationssyntaxfehler. Häufige Ursachen:
- Fehlender schließender
</VirtualHost>-Tag SSLCertificateChainFilefalsch geschrieben- Fehlende Anführungszeichen um Header-Werte
- Dateipfad existiert nicht
HTTPS funktioniert, zeigt aber “Nicht sicher”
Mixed Content — Ihre Seite lädt Ressourcen über HTTP. Öffnen Sie DevTools → Konsole → korrigieren Sie die http://-URLs.
Häufig gestellte Fragen
Kann ich fullchain.pem statt separatem Zertifikat + Kette verwenden?
Ja, ab Apache 2.4.8+. Verwenden Sie SSLCertificateFile /path/to/fullchain.pem und entfernen Sie die SSLCertificateChainFile-Direktive vollständig. Bei älteren Apache-Versionen benötigen Sie separate Dateien.
Wie prüfe ich, welche Apache-Version ich habe?
apachectl -v
# oder
httpd -v
Muss ich Apache neu starten oder reicht ein Neuladen?
Neuladen (systemctl reload) reicht aus und verursacht keine Ausfallzeit. Ein Neustart (systemctl restart) unterbricht alle aktiven Verbindungen. Verwenden Sie für Zertifikatsänderungen immer Neuladen.
Kann Apache verschiedene Zertifikate für verschiedene Domains bereitstellen?
Ja. Erstellen Sie separate <VirtualHost *:443>-Blöcke mit unterschiedlichen ServerName- und SSLCertificate*-Direktiven. Apache verwendet SNI (Server Name Indication), um das richtige Zertifikat auszuwählen.
Unterstützt Apache ECDSA-Zertifikate?
Ja. Apache 2.4+ behandelt ECDSA genauso wie RSA — gleiche Direktiven, gleiches Dateiformat. GetHTTPS generiert standardmäßig ECDSA P-256.
Wo befinden sich die SSL-Fehlerprotokolle von Apache?
# Debian/Ubuntu
tail -f /var/log/apache2/error.log
# CentOS/RHEL
tail -f /var/log/httpd/ssl_error_log