Nginx, listen 443 ssl; tanımlı bir sunucu bloğunda sertifika bulamadığında no "ssl_certificate" is defined for the "listen ... ssl" directive uyarısı verir. Sertifika yolu yazılmamış, yanlış bloğa yazılmış ya da yorum satırında kalmış olabilir.
Nedenler
- İlgili
serverbloğundassl_certificatevessl_certificate_keyyok. - Bu yönergeler başka bir
serverbloğuna ya da yanlışincludedosyasına yazılmış. - Yapılandırma dosyası
sites-enabledaltına bağlanmamış, eski kopya yükleniyor. - Yönergenin başında yanlışlıkla
#kalmış.
Doğru yapı
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name alanadi.com www.alanadi.com;
ssl_certificate /etc/nginx/ssl/alanadi-fullchain.crt;
ssl_certificate_key /etc/nginx/ssl/alanadi.key;
ssl_protocols TLSv1.2 TLSv1.3;
}
Birden fazla alan adı aynı IP'yi kullanıyorsa her server bloğunun kendi sertifikası olmalıdır; aksi halde ilk tanımlı blok varsayılan sayılır ve diğerleri bu sertifikayla karşılanır.
Kontrol adımları
- Etkin yapılandırmayı birleşik görün:
nginx -T | grep -n "ssl_certificate". - Söz dizimini sınayın:
nginx -t. - Yüklemeden sonra
systemctl reload nginxyapın. - Dışarıdan test edin:
openssl s_client -connect alanadi.com:443 -servername alanadi.com < /dev/null | openssl x509 -noout -subject -dates
Not
ssl_certificate dosyasına sunucu sertifikasının ardından ara sertifikaları da ekleyin (fullchain); eksik zincir bazı istemcilerde hata doğurur. Sertifika almadıysanız SSL sertifikaları sayfasından seçenekleri inceleyebilirsiniz.
Ek ipuçları
Varsayılan bir 443 sunucu bloğu tanımlamak istiyorsanız, onun da geçerli bir sertifikası olmalıdır; gerçek olmayan alan adları için geçici bir sertifika yerine ssl_reject_handshake on; (Nginx 1.19.4 ve sonrası) ile eşleşmeyen isteklerin el sıkışmasını reddedebilirsiniz. Böylece yanlış alan adına yanlış sertifika sunmazsınız.