SSL sertifikasını openssl ile kontrol etme: bitiş tarihi, zincir ve SAN

SSL Sertifikası ve https 67 görüntülenme Markdown

Bir sertifika sorununu çözerken tarayıcının uyarı mesajı yetmez; sertifikayı doğrudan sorgulamak neyin yanlış olduğunu söyler. openssl komutu Linux, Mac ve Windows'ta (Git Bash ya da WSL) bulunur ve ek araç gerektirmez. Aşağıdaki komutlar bir web sitesini ve mail sunucusunu kontrol etmeyi gösterir.

Bitiş tarihi ve veren

echo | openssl s_client -connect ornek.com:443 -servername ornek.com 2>/dev/null | openssl x509 -noout -subject -issuer -dates

Örnek çıktı:

subject=CN = ornek.com
issuer=C = US, O = Let's Encrypt, CN = YE1
notBefore=Oct  3 12:00:42 2026 GMT
notAfter=Jan  1 12:00:41 2027 GMT

notAfter bitiş tarihidir; Let's Encrypt sertifikaları 90 gün geçerlidir ve normalde bitmeden 30 gün önce yenilenir. -servername parametresi önemlidir: bir sunucuda birden fazla site varsa hangi sitenin sertifikasını istediğinizi bildirir. Bunu unutursanız yanlış (varsayılan) siteninkini görürsünüz.

Kapsadığı adlar (SAN)

echo | openssl s_client -connect ornek.com:443 -servername ornek.com 2>/dev/null | openssl x509 -noout -ext subjectAltName

Çıktıda DNS:ornek.com, DNS:www.ornek.com gibi bir liste görürsünüz. Açtığınız adres listede yoksa uyarı alırsınız: sertifika adı uyuşmuyor.

Zincir tam mı?

Bir sertifika, güvenilir bir kök sertifikaya bir "ara sertifika" üzerinden bağlanır. Sunucu ara sertifikayı da göndermezse bazı istemciler (özellikle eski cihazlar, mobil uygulamalar, curl) "unable to get local issuer certificate" hatası verir, ama masaüstü tarayıcılar çoğu zaman ara sertifikayı kendileri bulduğu için sorun fark edilmez. Zinciri görmek için:

echo | openssl s_client -connect ornek.com:443 -servername ornek.com -showcerts 2>/dev/null | grep -E "^ [0-9] s:|^   i:|Verify return"

Sertifika sayısını (0 s:, 1 s:) ve Verify return code: 0 (ok) satırını arayın. 0 (ok) değilse zincirde eksik var demektir. Çözüm: Nginx ayarında ssl_certificate satırına yalnızca site sertifikasını değil, fullchain.pem dosyasını verin (site ve ara sertifikayı birlikte içerir); cert.pem kullanmayın:

ssl_certificate     /etc/letsencrypt/live/ornek.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;

Mail sunucusunun sertifikası

Mail programı sertifika uyarısı veriyorsa aynı yöntemle mail sunucusuna bakabilirsiniz. IMAP (993, doğrudan TLS) için:

echo | openssl s_client -connect mail.kervanhost.com:993 2>/dev/null | openssl x509 -noout -subject -dates

SMTP gönderim portu 587 STARTTLS kullanır: echo | openssl s_client -starttls smtp -connect mail.kervanhost.com:587 2>/dev/null | openssl x509 -noout -subject -dates. Mail programında bağlandığınız adın (mail.kervanhost.com) sertifikadaki adla aynı olduğundan emin olun: IMAP ve SMTP ayarları.

Yenilendi mi, yoksa eski mi sunuluyor?

Certbot sertifikayı yeniledi ama site eski bitiş tarihini gösteriyorsa: sudo certbot certificates ile diskteki sertifikanın bitişini, yukarıdaki openssl s_client ile sunucunun gerçekte sunduğunu karşılaştırın. Farklıysa Nginx'i yeniden yükleyin: sudo systemctl reload nginx. Önünde Cloudflare varsa komut Cloudflare'in sertifikasını gösterir; sunucunun kendisini görmek için doğrudan IP'ye bağlanın (-connect 203.0.113.10:443 -servername ornek.com).

Çevrimiçi araçlar

Daha ayrıntılı bir rapor için SSL Labs gibi ücretsiz çevrimiçi test servisleri vardır; protokol sürümlerini, zincir eksikliklerini ve güvenlik yapılandırmasını not ile gösterirler. Bu komutlar ise hızlı ve sunucudan bağımsız kontrol içindir. İlgili: sertifika süresi, Certbot hataları.

Sık sorulanlar

Windows'ta openssl yok.

Git for Windows ile gelen Git Bash'te ya da WSL içinde bulunur. PowerShell'de alternatif olarak Test-NetConnection bağlantıyı sınar ama sertifikayı göstermez.

unable to get local issuer certificate ne demek?

İstemcinin sertifika zincirini güvenilir bir köke bağlayamadığını söyler. Çoğu zaman sunucu ara sertifikayı göndermiyordur; fullchain.pem kullanın.

Sertifikanın kalan gününü betikle izleyebilir miyim?

Evet; openssl x509 -checkend 2592000 -noout 30 gün içinde bitip bitmediğini söyler (çıkış kodu 1 ise bitiyordur). Bunu bir cron görevine bağlayıp haber alabilirsiniz.

İlgili makaleler

Sorununuz çözülmediyse destek talebi açın. Hangi adımı denediğinizi ve ekranda ne gördüğünüzü yazarsanız çözüm çok daha hızlı olur.

Faydalı oldu mu?

Geri bildiriminiz için teşekkürler!

Hâlâ Yardıma mı İhtiyacınız Var?

Yukarıda bulamadığınız her şey için destek ekibimiz her zaman yanınızda.