Kısa cevap
Kodda SSL sertifika hatası çoğunlukla sertifikanın süresinin dolması, sertifika zincirine güvenilmemesi veya yanlış ana bilgisayar adı nedeniyle oluşur. Tarihleri kontrol ederek, CA deposunu güncelleyerek ve istemciyi doğru yapılandırarak çözülür; doğrulamayı devre dışı bırakarak değil.
Sorun nasıl anlaşılır
- Uygulama `CERT_HAS_EXPIRED` veya `certificate has expired` hatası veriyor
- `UNABLE_TO_VERIFY_LEAF_SIGNATURE` veya `self signed certificate in certificate chain` hatası alınıyor
- Yanlış ana bilgisayar adı nedeniyle `ERR_TLS_CERT_ALTNAME_INVALID` hatası
- Bağlantı tarayıcıda çalışıyor ancak kodda çalışmıyor
- Hata yalnızca tek bir ortamda (ör. staging) ortaya çıkıyor
En yaygın nedenler
Süresi dolmuş sertifika
Sunucudaki sertifikanın süresi dolmuş veya istemci önbelleğinde daha eski bir zincir saklanmış olabilir. Geçerlilik tarihini kontrol edin ve önbelleği yenileyin.
Güvenilmeyen sertifika veren (CA)
İstemci, sertifikayı veren CA'yı tanımıyor; bu durum dahili veya self-signed sertifikalarda sık görülür. CA'nın güven deposuna eklenmesi gerekir.
Yanlış ana bilgisayar adı
Sertifika farklı bir ad için verilmiş (ör. `api.example.com` yerine `example.com`). SAN alanını ve istemcinin erişim şeklini kontrol edin.
Hatalı sertifika zinciri
Sunucu tam ara sertifikaları göndermiyor, bu nedenle istemci kök sertifikaya kadar zinciri oluşturamıyor. Sunucunun doğru yapılandırılmasıyla çözülür.
Sistemde yanlış saat
Bilgisayar veya konteynerdeki saat yanlışsa, geçerli bir sertifika süresi dolmuş veya henüz geçerli değilmiş gibi görünür.
Adım adım çözüm
- 1
Tam hata mesajını okuyun
Günlükte hata kodunu arayın (ör.
CERT_HAS_EXPIRED,UNABLE_TO_VERIFY_LEAF_SIGNATURE,ERR_TLS_CERT_ALTNAME_INVALID). Farklı kodlar farklı nedenlere işaret eder, bu adımı atlamayın. - 2
Sertifikanın geçerlilik tarihini kontrol edin
Siteyi tarayıcıda açın ve adres çubuğundaki kilit simgesine tıklayın, sertifika ayrıntılarında başlangıç ve bitiş tarihlerine bakın. Veya terminalde
openssl s_client -connect host:443 -servername host -textkomutunu çalıştırın veNot BeforeileNot Afteralanlarını inceleyin. - 3
Ana bilgisayar adının eşleştiğini kontrol edin
Aynı
opensslçıktısındaSubject Alternative Namealanını bulun. Bu alan, kodda kullandığınız adı içermelidir. IP adresi üzerinden erişiyorsanız sertifika büyük olasılıkla geçerli olmayacaktır. - 4
Sistemdeki CA deposunu güncelleyin
Windows'ta (yönetici olarak)
certutil -generateSSTFromWU roots.sstardındancertutil -addstore root roots.sstkomutlarını çalıştırın; tek bir sertifikayıcertutil -addstore root sertifika.crtile ekleyin. Yalnızca güvendiğiniz CA'yı ekleyin. Linux'ta (Debian/Ubuntu)sudo update-ca-certificates, macOS'ta.crtdosyasına çift tıklayıpSystemanahtarlığına ekleyin ve o CA içinAlways Trustayarlayın. - 5
Koda dahili CA'yı ekleyin
Dahili veya self-signed sertifika kullanıyorsanız, kodda CA dosyasının yolunu belirtin. Node.js'te bu,
https.requestiçindekicaseçeneği veyaNODE_EXTRA_CA_CERTS=/yol/ca.crtortam değişkenidir. Pythonrequestsiçindeverify='/yol/ca.crt'kullanın. - 6
Sunucudaki zinciri düzeltin
Sunucunun tam sertifika zincirlerini gönderdiğinden emin olun. Nginx yapılandırmasında
ssl_certificate, sunucu sertifikasını ve ara sertifika listesini içermeli, sunucu sertifikası ilk sırada olmalıdır.openssl s_client -showcerts -servername host -connect host:443aracıyla kontrol edin. - 7
Sistem saatini kontrol edin
Windows'ta (yönetici olarak)
w32tm /resync, Linux'tatimedatectlvesudo systemctl restart systemd-timesyncdkomutlarını çalıştırın. Docker konteynerlerinde saatin ana makineyle eşitlenip eşitlenmediğini kontrol edin. - 8
Doğrulamayı yalnızca geliştirmede geçici olarak atlayın
Geliştirmeye devam etmeniz gerekiyorsa doğrulamayı geçici olarak devre dışı bırakın, ancak üretimde asla. Node.js'te
NODE_TLS_REJECT_UNAUTHORIZED=0(yalnızca yerel), Python'daverify=Falseile birlikteurllib3.disable_warnings(). Commit öncesinde mutlaka kaldırın.
Hiçbir şey işe yaramazsa: sorunu izole edin
Hata hala devam ediyorsa, minimal bir yeniden üretim örneği oluşturun: yalnızca aynı ana bilgisayara TLS bağlantısı kuran bir betik. Farklı ağlardan ve bilgisayarlardan test edin. openssl s_client çıktısını istemcinin gördüğüyle karşılaştırın. Proxy veya antivirüsün trafiği kesip sertifikayı değiştirip değiştirmediğini kontrol edin. Docker'da konteynerde CA sertifikalarının (ca-certificates paketi) yüklü olup olmadığını kontrol edin. Sorun yalnızca üretimde ortaya çıkıyorsa, ortam yapılandırmasını ve istemci sürümlerini karşılaştırın. Karmaşık zincirler ve mTLS için openssl verify ve curl -v gibi araçlarla tam akışı görün.
Tekrarlanmaması için
- Sertifika son kullanma tarihlerini düzenli olarak kontrol edin ve hatırlatıcılar ayarlayın
- Otomatik yenileme kullanın (ör. Let's Encrypt) ve yenilemeyi test edin
- Geliştirmede doğrulamayı kalıcı olarak kapatmak yerine yerel sertifikalar için `mkcert` kullanın
- `rejectUnauthorized: false` veya `verify=False` içeren kodu asla commit etmeyin
Ne zaman uzmana başvurmalı
Hata mTLS, karmaşık sertifika zincirleri içeriyorsa veya yalnızca üretim sunucularında ortaya çıkıyorsa, iş kesintisi riski olmadan sorunu izole etmek için IT desteğini arayın.
Yazılım ve ürün geliştirme · Özel uygulamalar, SaaS ve 4-8 haftada MVPSık sorulan sorular
Neden `self signed certificate in certificate chain` hatası alıyorum?
Bu, istemcinin zincirdeki sertifikaya güvenmediği anlamına gelir; çoğunlukla sertifika self-signed veya dahili bir CA tarafından verilmiştir. Çözüm, o CA'yı güven deposuna eklemek veya kodda CA dosyasının yolunu belirtmektir.
Kodda sertifika doğrulamasını devre dışı bırakmak güvenli mi?
Hayır, doğrulamayı devre dışı bırakmak (`rejectUnauthorized: false` veya `verify=False`) uygulamayı araya girme saldırılarına karşı savunmasız hale getirir. Yalnızca yerel geliştirmede geçici olarak kullanın ve üretimde asla kullanmayın.
Sunucunun gerçekte hangi sertifikayı gönderdiğini nasıl kontrol ederim?
`openssl s_client -connect host:443 -servername host -showcerts -text` komutunu çalıştırın. Çıktıda zincirdeki tüm sertifikaları görürsünüz; metin bölümü sunucu sertifikasının ayrıntılarını, geçerlilik tarihlerini ve SAN alanlarını gösterir.