İçeriğe geç

Kodda SSL sertifika hatası: nasıl tanınır ve çözülür

Orta 20 dk Güncellendi:

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. 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. 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 -text komutunu çalıştırın ve Not Before ile Not After alanlarını inceleyin.

  3. 3

    Ana bilgisayar adının eşleştiğini kontrol edin

    Aynı openssl çıktısında Subject Alternative Name alanı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. 4

    Sistemdeki CA deposunu güncelleyin

    Windows'ta (yönetici olarak) certutil -generateSSTFromWU roots.sst ardından certutil -addstore root roots.sst komutlarını çalıştırın; tek bir sertifikayı certutil -addstore root sertifika.crt ile ekleyin. Yalnızca güvendiğiniz CA'yı ekleyin. Linux'ta (Debian/Ubuntu) sudo update-ca-certificates, macOS'ta .crt dosyasına çift tıklayıp System anahtarlığına ekleyin ve o CA için Always Trust ayarlayın.

  5. 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.request içindeki ca seçeneği veya NODE_EXTRA_CA_CERTS=/yol/ca.crt ortam değişkenidir. Python requests içinde verify='/yol/ca.crt' kullanın.

  6. 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:443 aracıyla kontrol edin.

  7. 7

    Sistem saatini kontrol edin

    Windows'ta (yönetici olarak) w32tm /resync, Linux'ta timedatectl ve sudo systemctl restart systemd-timesyncd komutlarını çalıştırın. Docker konteynerlerinde saatin ana makineyle eşitlenip eşitlenmediğini kontrol edin.

  8. 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'da verify=False ile birlikte urllib3.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 MVP

Sı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.

Paylaş
Çözüm bulamadınız mı?AI BT asistanı 7/24 hizmetinizde. Sorunu anlatın veya hatanın ekran görüntüsünü gönderin, durumunuza özel talimat alın.AI BT asistanına sorun