Node.js HTTPS isteğinde UNABLE_TO_VERIFY_LEAF_SIGNATURE veya "unable to verify the first certificate" hatası, sunucunun gönderdiği sertifikanın güvenilen bir CA'ya kadar zincirlenemediğini gösterir. Tarayıcı aynı siteyi açabilirken Node'un hata vermesi tipik işarettir; çünkü tarayıcılar eksik ara sertifikayı kendileri tamamlayabilir, Node tamamlamaz.
Asıl neden
Hedef sunucu yalnızca kendi sertifikasını gönderiyor, ara (intermediate) sertifikayı eklemiyor. Sorun istemci kodunda değil, karşı sunucunun yapılandırmasındadır.
Teşhis
openssl s_client -connect api.ornek.com:443 -servername api.ornek.com -showcerts
Çıktıda yalnızca bir sertifika görüyorsanız ve sonda Verify return code: 21 (unable to verify the first certificate) yazıyorsa zincir eksiktir.
Çözümler
- Doğru çözüm: Sunucu tarafında tam zinciri (fullchain) yapılandırın. Nginx'te
ssl_certificatedosyasına sunucu sertifikasının ardından ara sertifikaları ekleyin. - Sunucuya erişiminiz yoksa ara sertifikayı istemciye tanıtın:
const https = require('https'); const fs = require('fs'); const agent = new https.Agent({ ca: fs.readFileSync('ara-ve-kok.pem') }); https.get('https://api.ornek.com', { agent }, res => console.log(res.statusCode)); - Tüm süreç için ek CA dosyası:
NODE_EXTRA_CA_CERTS=/yol/ara-ve-kok.pem node app.js. - Kurumsal ağda TLS denetimi yapan proxy varsa, o kurumun kök sertifikasını aynı yöntemle ekleyin.
Yapmayın
NODE_TLS_REJECT_UNAUTHORIZED=0 veya rejectUnauthorized: false doğrulamayı tamamen kapatır ve ortadaki adam saldırısına kapı açar; yalnızca yerel geliştirmede geçici olarak kullanılabilir, üretimde kullanmayın.
Kendi sunucunuzun zincirini SSL denetleme aracıyla sınayın; sertifika ihtiyacınız için SSL sertifikaları sayfasına göz atabilirsiniz.
Ek ipuçları
Sorun yalnızca belli bir makinede çıkıyorsa, o makinenin Node sürümünü ve CA paketini karşılaştırın: Node kendi gömülü CA listesini kullanır, işletim sisteminin listesini kullanmaz. Bu yüzden sistemde güvenilen bir CA Node'da bilinmiyor olabilir; NODE_EXTRA_CA_CERTS bu durumda pratik bir çözümdür.