- Veröffentlicht am
- • How2-Tipps
Apache Reverse Proxy mit SSL: Wenn plötzlich nur noch 500 kommt („Certificate Chain too long“)
- Autor
-
-
- Benutzer
- tmueller
- Beiträge dieses Autors
- Beiträge dieses Autors
-
Du richtest einen Apache Reverse Proxy ein, alles sieht korrekt aus – und trotzdem bekommst du beim Aufruf nur:
500 Internal Server Error
Im Error-Log taucht stattdessen sowas auf:
AH00898: Error during SSL Handshake with remote server
AH02040: Certificate Verification: Certificate Chain too long
Willkommen in einer der subtileren Ecken von TLS + mod_proxy_ssl.
In diesem Artikel zeige ich Schritt für Schritt:
✅ was dieser Fehler wirklich bedeutet ✅ warum er vor allem auf modernen Debian/OpenSSL-Systemen auftaucht ✅ wie man ihn sauber behebt ✅ und wie eine stabile Produktions-Config aussieht
Ausgangslage
Setup:
- Reverse Proxy mit Apache HTTP Server
- System: Debian (aktuell)
- Frontend:
network.example.de - Backend:
https://backend.example.de/backup/ - TLS auf beiden Seiten aktiv
Typischer vHost-Start:
ProxyPass / https://backend.example.de/backup/
ProxyPassReverse / https://backend.example.de/backup/
SSLProxyEngine On
SSLProxyVerify require
SSLProxyCheckPeerName on
SSLProxyCheckPeerExpire on
Sieht erstmal korrekt aus.
Symptom
Frontend liefert sofort HTTP 500.
Im Apache Error-Log:
AH00898: Error during SSL Handshake with remote server
AH02040: Certificate Verification: Certificate Chain too long
Manchmal zusätzlich:
unable to get local issuer certificate
Warum passiert das?
Kurzfassung
Apache prüft das TLS-Zertifikat des Backends – und scheitert, weil:
die Zertifikatskette mehr als ein Zertifikat enthält
Moderne TLS-Setups bestehen fast immer aus:
- Leaf Certificate (Domain)
- Intermediate CA
- Root CA
Das sind mindestens zwei Zertifikate, oft drei.
Der entscheidende Punkt
mod_proxy_ssl verwendet intern OpenSSL.
Wenn du:
SSLProxyVerify require
setzt, aber keine VerifyDepth angibst, landet Apache in einem extrem restriktiven Default:
Maximal erlaubte Kettentiefe = 1
Sobald dein Backend ein Intermediate mitsendet:
Certificate Chain too long
Das ist kein Bug — das ist schlicht fehlende Konfiguration.
Diagnose
Auf dem Proxy-Server:
openssl s_client -connect backend.example.de:443 -servername backend.example.de -showcerts
Danach zählen:
awk '/BEGIN CERTIFICATE/{c++} END{print c}'
Ergebnis meist:
2
Oder:
3
Damit ist klar:
➡ Apache erlaubt aktuell nur 1
Die Lösung
Du musst Apache mitteilen, dass Zertifikatsketten normal sind.
VerifyDepth setzen
SSLProxyVerifyDepth 5
5 ist Standard in vielen TLS-Stacks und völlig unkritisch.
System-CA-Store explizit angeben
Auf Debian:
SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
SSLProxyCACertificatePath /etc/ssl/certs
Sonst weiß Apache nicht, womit er überhaupt prüfen soll.
Saubere finale Reverse-Proxy-Config
So sieht ein stabiler Produktions-vHost aus:
<VirtualHost *:443>
ServerName network.example.de
SSLEngine on
SSLCertificateFile /etc/letsencrypt/live/network.example.de/fullchain.pem
SSLCertificateKeyFile /etc/letsencrypt/live/network.example.de/privkey.pem
ProxyRequests Off
SSLProxyEngine On
SSLProxyVerify require
SSLProxyVerifyDepth 5
SSLProxyCheckPeerName on
SSLProxyCheckPeerExpire on
SSLProxyCACertificateFile /etc/ssl/certs/ca-certificates.crt
SSLProxyCACertificatePath /etc/ssl/certs
RequestHeader set X-Forwarded-Proto "https"
ProxyPass / https://backend.example.de/backup/ retry=0 timeout=120 connectiontimeout=10
ProxyPassReverse / https://backend.example.de/backup/
ErrorLog ${APACHE_LOG_DIR}/proxy-error.log
CustomLog ${APACHE_LOG_DIR}/proxy-access.log combined
</VirtualHost>
Reload:
apachectl -t
systemctl reload apache2
Danach:
- 500 weg
- TLS sauber geprüft
- Reverse Proxy läuft stabil
Bonus: Die klassische AH00558-Warnung
Could not reliably determine the server's fully qualified domain name
Fix:
nano /etc/apache2/conf-available/servername.conf
ServerName network.example.de
Dann:
a2enconf servername
systemctl reload apache2
Fazit
Wenn Apache als Reverse Proxy plötzlich mit 500 antwortet und im Log:
Certificate Chain too long
steht, liegt es fast nie am Backend.
Es fehlt schlicht:
👉 SSLProxyVerifyDepth
Ein einzelner Parameter entscheidet über Stunden Fehlersuche.
Merksatz
Reverse Proxy + TLS + Verify = immer VerifyDepth setzen.