Sertifikayı yenilediniz. Dosyalar sunucuda. Yeni sertifikadaki son kullanma tarihi rahatça gelecekte. Ve yine de: bazı kullanıcılar uyarılar bildiriyor, mobil uygulamanız TLS hataları veriyor, curl bağlanmayı reddediyor, veya tarayıcı neşeyle geçen hafta süresi dolmuş bir sertifika gösteriyor.
Bu sorun kategorisi tam olarak değiştirdiğiniz şey doğru olduğu için sinir bozucudur. Sertifika iyi durumda. Sorun neredeyse her zaman "diskteki dosya" ile "bir istemcinin gerçekte aldığı ve doğruladığı şey" arasındaki bir yerdedir.
İşte bu boşluğun nasıl açıldığı, ve sizinkinin nerede olduğunu nasıl bulacağınız.
Zincir, ve neden var olduğu
Tek başına bir sertifika hiçbir şey kanıtlamaz. Onu güvenilir kılan şey, istemcinin zaten güvendiği bir şeye geri giden bir imza zinciridir.
Üç katman vardır:
Yaprak sertifika. Sizinki. "Bu yourdomain.com" der, ve bir ara sertifika tarafından imzalanmıştır.
Ara sertifika. Sertifika otoritenize aittir. Yaprağınızı imzaladı, ve kendisi bir kök tarafından imzalanmıştır. CA'lar, kökün özel anahtarının çevrimdışı bir kasada kilitli kalabilmesi için ara sertifikalar kullanır — bir ara sertifika ele geçirilirse, kökü yakmadan onu iptal ederler.
Kök sertifika. Kendinden imzalı, ve güvenilirdir çünkü istemcinin güven deposunda — işletim sisteminiz veya tarayıcınızla birlikte gelen CA'lar kümesi — önceden yüklüdür. Kimse kök için kefil olmaz. Emirle güvenilir.
Doğrulama yukarı doğru yürür: yaprak ara sertifika tarafından imzalanmış, ara sertifika kök tarafından imzalanmış, kök benim güven deposumda, dolayısıyla yaprak güvenilir.
Şimdi kritik kısım, ve çoğu zincir hatasının kaynağı:
Sunucunuz yaprağı ve ara sertifikaları göndermelidir. İstemci kökü kendisi sağlar.
Kök zaten istemcide. Onu göndermek zararsız ama anlamsızdır. Ara sertifikalar istemcide değildir, ve sunucunuz onları göndermezse, istemcinin güvendiği hiçbir şeye bağlanamayan bir yaprağı vardır — ve doğrulama başarısız olur.
Sadece bazı insanlar için bozulan hata
İşte gerçekten çıldırtıcı hale geldiği yer. Ara sertifikayı atlayarak zinciri yanlış yapılandırıyorsunuz. Sonra:
- Chrome sorunsuz çalışır.
- Firefox genellikle sorunsuz çalışır.
curlbaşarısız olur.- Java hizmetiniz başarısız olur.
- Eski Android cihazları başarısız olur.
- İzlemeniz her şeyin yeşil olduğunu söyler.
Aynı sunucu, aynı sertifika, tamamen farklı sonuçlar. Saçma görünüyor. Değil.
Chrome ve Windows eksik ara sertifikayı kendileri getirecektir. Sertifikalar, yayınlayan sertifikanın indirilebileceği bir URL içeren Authority Information Access (AIA) adında bir uzantı içerir. Zincir eksik olduğunda, bu istemciler sessizce gidip onu getirir ve zinciri kendileri tamamlar. Bağlantı başarılı olur ve bir şeyin yanlış olduğunu asla öğrenmezsiniz.
Firefox daha önce gördüğü ara sertifikaları önbelleğe alır. Başka herhangi bir sitede o ara sertifikayla karşılaştıysa, zaten ona sahiptir ve kullanacaktır — bu yüzden sizde çalışır ve tarayıcısı henüz görmemiş biri için başarısız olur. "Benim makinemde çalışıyor"un burada bu kadar kalıcı olmasının nedeni budur: tarayıcınız yıllardır ara sertifikalar biriktiriyor.
curl, OpenSSL, Java, Go ve çoğu tarayıcı olmayan istemci bunların hiçbirini yapmaz. Sunucunun gönderdiği tam olarak neyse onunla sıkı bir şekilde doğrularlar. Ara sertifika eksikse, başarısız olurlar. Doğru bir şekilde.
Yani eksik bir ara sertifika bozuk bir site değildir — tarayıcılarda çalışan ve sahip olduğunuz her API istemcisi, mobil uygulama, webhook tüketicisi ve ödeme entegrasyonu için başarısız olan bir sitedir. Bu genellikle tamamen bozuk olmaktan daha kötüdür, çünkü fark edilmesi daha uzun sürer.
Ders: bir sertifika zincirini asla bir tarayıcı kullanarak doğrulamayın. Tarayıcılar çok yardımseverdir. Sunucunun gerçekte gönderdiği şeyi, yeniden inşa edilmiş değil, tam olarak bildiren bir şeyle kontrol edin, örneğin teslim edilen zinciri gösteren bir SSL sertifika kontrolü gibi.
"Yenilendi ama hâlâ eski sertifikayı görüyorum"
Kontrol etme sırasına göre kabaca, beş gerçek neden:
Sunucu asla yeniden yüklenmedi. Klasik. Yenilemeniz yeni dosyalar yazdı ve çalışan sürece hiçbir şey söylemedi. nginx, Apache, HAProxy ve benzerleri sertifikayı başlangıçta belleğe okur ve süresiz olarak orada tutar. Dosya değişti; süreç fark etmedi. Bir yeniden yükleme gereklidir — ve yenileme otomasyonunuzun yeniden yükleme kancası sessizce başarısız olursa, diskte taze dosyalarla ve bellekte ölü bir sertifikayla süre dolumunu geçersiniz.
Farklı bir sunucu bloğu yanıt veriyor. SNI ile, bir IP, istemcinin istediği ana bilgisayar adına göre seçilen birçok sertifikayı sunabilir. Birden fazla sunucu bloğunuz varsa ve ana bilgisayar adı düşündüğünüzle eşleşmiyorsa, bunun yerine varsayılan bloğun sertifikasını alırsınız. Sunmayı amaçladığınız sertifikayı yenilemek yardımcı olmaz, çünkü sunulan o değildir. Bu ayrıca yanlış alan adının sertifikasının tamamen ortaya çıktığı hoş belirtiyi üretir.
Bir proxy veya CDN TLS'i sonlandırıyor. Cloudflare veya benzeri bir şeyin arkasındaysanız, bir kullanıcının gördüğü sertifika edge sertifikasıdır, sizinki değil. Origin sertifikanız, sadece CDN ile sunucunuz arasındaki bağlantıyla ilgili, ayrı bir yaşam döngüsünde ayrı bir şeydir. Origin'i yenilemek kullanıcıların gördüğü şeye hiçbir şey yapmaz, ve tersi de geçerlidir. İki sertifika, iki son kullanma tarihi, iki başarısızlık modu — ve insanlar düzenli olarak birini yenilerken diğeri sessizce süresi doluyor.
Sadece bazı arka uçlar yeni sertifikayı aldı. Birkaç sunuculu bir yük dengeleyicinin arkasında, yenileme birinde çalıştıysa, hangi arka ucun yanıt verdiğine bağlı olarak aralıklı başarısızlıklar alırsınız. Rastgele hissettirir. Değildir.
OCSP stapling bayat bir yanıt sunuyor. Sunucular, el sıkışmaya iliştirdikleri OCSP yanıtını önbelleğe alır. Bu önbelleğe alınmış yanıt eski sertifikaya atıfta bulunuyorsa, veya OCSP yanıtlayıcısı son yenilendiğinde ulaşılamazsa, stapling sorunlarında sert başarısız olan istemciler aksi takdirde mükemmel bir sertifikayı reddedecektir.
Bunların hepsi için ayırt edici soru aynıdır: sunucu şu anda tel üzerinden gerçekte ne gönderiyor? Diskte olan değil. Kontrol panelinizin söylediği değil. Bir istemciye ulaşan şey. Bundan sonraki her şey, hangi katmanın yalan söylediğini daraltmaktır.
Sıra önemlidir, ve süresi dolmuş ara sertifikalar gerçektir
Bilmeye değer iki zincir düzeyinde detay daha.
Zincir sırayla olmalıdır. Önce yaprak, sonra öncekini imzalayan her sertifika. Bazı istemciler karışık bir zinciri tolere eder; çoğu etmez. Sertifika dosyanız geldikleri sırayla birleştirilerek oluşturulduysa, bu kontrol etmeye değer.
Ara sertifikalar ve kökler de süresi dolar, ve gerçek kesintilere neden oldu. En öğretici örnek: Eylül 2021'de, Let's Encrypt'in eski cihazlarla uyumluluk için güvendiği çapraz imzalı bir kök sertifikanın süresi doldu. Kendileri kusursuz bir şekilde geçerli olan milyonlarca sertifika, eski Android cihazlarında, OpenSSL 1.0.x'te, ve uzun bir gömülü istemci kuyruğunda aniden başarısız oldu. Kimsenin yaprak sertifikasının süresi dolmamıştı. Üç katman yukarıdaki bir sertifikanın süresi doldu, ve altındaki her şey çöktü.
Sorunun şekli budur: sertifikanızın geçerliliği gereklidir ama yeterli olmaktan çok uzaktır. Tüm yolun tutması gerekir.
İşe yarayan bir hata ayıklama sırası
-
Diskte olanı değil, gerçekte sunulanı kontrol edin. Bir SSL kontrolü teslim edilen zinciri, son kullanma tarihini ve ana bilgisayar adı kapsamını gösterecektir. Bu dosyalarınızla anlaşmazsa, katmanınızı bulmuşsunuzdur — yeniden yükleme, yanlış sunucu bloğu, veya önde bir proxy.
-
Zincirin tam olduğunu doğrulayın. Özellikle ara sertifikayı arayın. Yaprak varsa ve ara sertifika yoksa, kimse rapor etmiş olsun ya da olmasın, tarayıcılarda-çalışan-her-yerde-başarısız-olan hatasına sahipsiniz.
-
Ana bilgisayar adı kapsamını kontrol edin.
yourdomain.comiçin geçerli bir sertifika, SAN alanında listelenmedikçewww.yourdomain.com'u kapsamaz. Common Name alanı modern istemciler tarafından etkin bir şekilde göz ardı edilir — sadece Subject Alternative Names sayılır. -
Protokol ve şifre yapılandırmasını ayrı kontrol edin. İstemci ve sunucu bir TLS sürümü üzerinde anlaşamazsa mükemmel derecede geçerli bir sertifika bile başarısız olur — sadece TLS 1.2 konuşan bir istemciye karşı sadece 1.3 için yapılandırılmış bir sunucu. Bu hiç bir sertifika sorunu değildir, ama bir bağlantı hatası olarak ortaya çıkar ve öyle yanlış teşhis edilir. Bir TLS tarayıcı gerçekte hangi sürümlerin ve şifrelerin müzakere edilebilir olduğunu gösterecektir.
-
Sertifikanın hiç yayınlanmadığından şüpheleniyorsanız, CT günlüklerini kontrol edin. Herkese açık olarak güvenilen her sertifika, yayınlandığında Certificate Transparency günlüklerine kaydedilir. Bir CT günlük araması size alan adınız için tam olarak ne zaman ne yayınlandığını söyler — bu, sunucunuzdaki herhangi bir şeyden bağımsız olarak "yenileme gerçekten oldu mu" sorusunu kesin olarak çözer. Bu ayrıca, talep etmediğiniz alan adınız için yayınlanan sertifikaları bulmanın da yoludur, ki bu farklı ve daha endişe verici bir konuşmadır.
Saklanacak zihinsel model
Bir sertifika kurduğunuz bir dosya değildir. Kontrol etmediğiniz bir istemci tarafından, seçmediğiniz bir güven deposu kullanılarak, unuttuğunuz bir proxy tarafından sonlandırılmış olabilecek bir bağlantı üzerinden gerçekleştirilen bir doğrulama zincirini atlatması gereken bir iddiadır.
Neredeyse her "ama yeniledim" sorunu bu cümlenin bir yerinde yaşar. Dosya nadiren sorundur. Dosya ile istemci arasındaki yol neredeyse her zaman öyledir — ve bulmanın en hızlı yolu sunucunuza bakmayı bırakıp diğer uçta ne geldiğine bakmaya başlamaktır.