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

Es wird cert.pem statt fullchain.pem ausgeliefert. cert.pem ist Ihr Zertifikat allein; fullchain.pem ist Ihr Zertifikat gefolgt vom Zwischenzertifikat. Es ist ein einziges Wort in der Konfiguration — und fast immer das ganze Problem.
# 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.