Das ist einer der verwirrendsten Zertifikatsfehler, weil er bei Ihnen funktioniert. Desktop-Browser speichern Zwischenzertifikate von anderen Websites und füllen die Lücke stillschweigend; ein Telefon, das dieses Zwischenzertifikat nie gesehen hat, und jeder Kommandozeilen-Client können das nicht.
Das Symptom
- Auf Ihrem Laptop in Ordnung, auf dem Telefon nicht vertrauenswürdig.
- curl sagt unable to get local issuer certificate.
- Ein Zahlungsdienst oder Webhook kommt nicht durch, während die Browser zufrieden sind.
Bestätigen
openssl s_client -connect yourdomain.com:443 -servername yourdomain.com < /dev/null 2>/dev/null \
| grep -E '^ *[0-9]+ s:|Verify return code'
Es sollten mindestens zwei Zertifikate aufgeführt sein — Ihres und das Zwischenzertifikat — und Verify return code: 0 (ok) stehen. Ein Zertifikat plus ein Verify-Fehler ist genau dieser Defekt.
Die Ursache ist ein Dateiname
# nginx - correct
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
# apache / litespeed
SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem
Neu laden und noch einmal prüfen
sudo nginx -t && sudo systemctl reload nginx
curl -sS -o /dev/null -w '%{http_code}\
' https://yourdomain.com
Von etwas testen, das keinen Cache hat
curl auf einem Rechner, der die Website nie besucht hat, oder ein Telefon im Mobilfunknetz mit gelöschten Daten der Seite. Ihr eigener Browser ist der eine Client, der Ihnen die Antwort nicht geben kann — siehe Funktioniert im WLAN, aber nicht im Mobilfunknetz.