Come appare il messaggio
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)Cause frequenti
- Il percorso in
ssl_certificateossl_certificate_keyè sbagliato, oppure il file non esiste ancora. - I file sono scambiati: la chiave è in
ssl_certificateo il certificato inssl_certificate_key. - Il certificato non corrisponde alla chiave privata (messaggio
key values mismatch), tipico dopo un rinnovo con una chiave nuova. - Il file non è PEM: formato DER o PKCS#12, vuoto o rovinato dal copia e incolla (righe mancanti, nessun a capo tra certificati concatenati).
- Il file non è leggibile all'avvio di nginx per via dei permessi.
Verifica
- Quale errore esatto segnala nginx?
nginx -t - Leggi il certificato (subject e date)
- Certificato e chiave sono una coppia? (i due hash devono coincidere)
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 - Il file inizia e finisce come un file PEM?
sudo head -n 1 /etc/nginx/ssl/example.com.crt; sudo tail -n 1 /etc/nginx/ssl/example.com.crt
Soluzione
- Correggi i percorsi nel blocco server. Con Let's Encrypt usa
/etc/letsencrypt/live/example.com/fullchain.pemeprivkey.pem. - In
ssl_certificateusa il file con la catena completa (prima il certificato, poi gli intermedi) e inssl_certificate_keysolo la chiave privata. - Se gli hash sono diversi, usa la chiave generata insieme al certificato oppure riemetti il certificato per la chiave attuale.
- Converti i file non PEM, per esempio
openssl x509 -inform der -in cert.der -out cert.pem, e assicurati che ogni blocco termini con un a capo. - Testa e applica:
nginx -t && systemctl reload nginx.
Domande frequenti
nginx parte anche se manca solo un pezzo della catena?
Sì, ma alcuni client mostreranno un errore di certificato. Il controllo nell'articolo sulla catena TLS mostra se mancano gli intermedi.
Perché l'errore compare solo al reload?
nginx legge i file quando carica la configurazione. Un reload con un file nuovo e rotto non supera il test e l'istanza in esecuzione mantiene il vecchio certificato.