So sieht die Meldung aus
nginx: [emerg] cannot load certificate "/etc/nginx/ssl/example.com.crt": BIO_new_file() failed (SSL: error:80000002:system library::No such file or directory)
nginx: [emerg] cannot load certificate key "/etc/nginx/ssl/example.com.key": PEM_read_bio_PrivateKey() failed (SSL: error:...:PEM routines::no start line)Häufige Ursachen
- Der Pfad in
ssl_certificateoderssl_certificate_keyist falsch, oder die Datei existiert noch nicht. - Die Dateien sind vertauscht: Der Schlüssel steht in
ssl_certificateoder das Zertifikat inssl_certificate_key. - Das Zertifikat passt nicht zum privaten Schlüssel (Meldung
key values mismatch), typisch nach einer Erneuerung mit neuem Schlüssel. - Die Datei ist kein PEM: DER- oder PKCS#12-Format, leer oder durch Copy und Paste beschädigt (fehlende Zeilen, kein Zeilenumbruch zwischen aneinandergehängten Zertifikaten).
- Die Datei ist beim Start von nginx wegen Berechtigungen nicht lesbar.
Prüfen
- Welchen genauen Fehler meldet nginx?
nginx -t - Das Zertifikat lesen (Subject und Datum)
- Gehören Zertifikat und Schlüssel zusammen? (beide Hashes müssen gleich sein)
openssl x509 -in /etc/nginx/ssl/example.com.crt -noout -pubkey | openssl sha256; sudo openssl pkey -in /etc/nginx/ssl/example.com.key -pubout | openssl sha256 - Beginnt und endet die Datei wie eine PEM-Datei?
sudo head -n 1 /etc/nginx/ssl/example.com.crt; sudo tail -n 1 /etc/nginx/ssl/example.com.crt
Lösung
- Die Pfade im Server-Block korrigieren. Bei Let's Encrypt
/etc/letsencrypt/live/example.com/fullchain.pemundprivkey.pemverwenden. - In
ssl_certificatedie Datei mit voller Kette nutzen (erst Zertifikat, dann Zwischenzertifikate), inssl_certificate_keynur den privaten Schlüssel. - Unterscheiden sich die Hashes, den Schlüssel nehmen, der zusammen mit dem Zertifikat erzeugt wurde, oder das Zertifikat für den aktuellen Schlüssel neu ausstellen.
- Nicht-PEM-Dateien konvertieren, zum Beispiel
openssl x509 -inform der -in cert.der -out cert.pem, und darauf achten, dass jeder Block mit einem Zeilenumbruch endet. - Testen und anwenden:
nginx -t && systemctl reload nginx.
Häufige Fragen
Startet nginx auch, wenn nur die Kette unvollständig ist?
Ja, aber manche Clients zeigen einen Zertifikatsfehler. Die Prüfung im Beitrag zur TLS-Kette zeigt, ob Zwischenzertifikate fehlen.
Warum zeigt sich der Fehler erst beim Reload?
nginx liest die Dateien beim Laden der Konfiguration. Ein Reload mit einer neuen, kaputten Datei besteht den Test nicht, und die laufende Instanz behält das alte Zertifikat.