open-how2 – Entdecke. Verstehe. Nutze.
Veröffentlicht am
How2-Tipps

Apache Reverse Proxy mit SSL: Wenn plötzlich nur noch 500 kommt („Certificate Chain too long“)

Autor
Apache Reverse Proxy mit SSL: Wenn plötzlich nur noch 500 kommt („Certificate Chain too long“)

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.