Sertifika şeffaflık günlükleri
- Sertifika şeffaflık günlüklerinin nasıl çalıştığını, crt.sh ile alt alan ve veren kurum analizini, günlüğü CAA ile savunma alarmına çevirmeyi öğren.
- Bu günlük sahte sertifikayı yakalamak için kuruldu, ama alt alan adı listesi de üretir.
- Bu derste crt.sh üzerinden isim çıkarmayı, sertifikanın içini okumayı ve günlüğün sınırlarını öğrenirsin.
Puan bütün etkinlikleri cevaplayınca hesaba yazılır. Bu dersi tamamlayınca +50 XP alacaksın. Giriş yapmadan ilerlersen puan yalnız bu tarayıcıda durur.
Beyaz Vadi Lojistik'in DNS envanteri çıktı, ama ekip bir şeyden emin değil: listede olmayan sistemler var mı? Sertifika şeffaflığı (Certificate Transparency, CT) bu soruya güçlü bir cevap verir. Bugün yaygın tarayıcıların güvendiği TLS sertifikaları herkese açık günlüklere yazılır.
Günlük sahte sertifikayı yakalamak için kuruldu, ama yan ürün olarak kurumun sertifika aldığı her adı da listeler. Bu derste önce mekanizmanın neden ve nasıl çalıştığını öğrenirsin. Sonra crt.sh üzerinden temiz bir ad listesi çıkarır, sertifikanın içini okur ve veren kurumdan anlam çıkarırsın. Son bölümde aynı günlüğü savunma tarafında bir alarm kaynağına çevirirsin.
Neden var ve nasıl çalışır
TLS'in güveni sertifika makamlarına (CA) dayanır. Tarayıcı yüzlerce makama güvenir ve bunlardan herhangi biri herhangi bir alan adı için sertifika verebilir. Bir makam ele geçirilirse ya da hata yaparsa, kurumun haberi olmadan onun adına geçerli bir sertifika çıkabilir. CT bu kör noktayı kapatmak için geliştirildi ve ilk kez Haziran 2013'te RFC 6962 ile tanımlandı.
Fikir basittir: her sertifika, eklenebilen ama silinemeyen herkese açık bir günlüğe yazılsın. Böylece kimse gizlice sertifika veremez. Kurum kendi adına çıkan her sertifikayı görür ve beklemediğini sorgular. İkinci sürüm Aralık 2021'de RFC 9162 ile yayımlandı, ama sahada yaygın olan hâlâ ilk sürümdür.
Akış adım adım şöyle yürür. Makam önce bir ön sertifika (precertificate) hazırlar. Ön sertifika gerçek sertifikanın bütün bilgisini taşır, ama içindeki zehir (poison) uzantısı onu tarayıcıda kullanılmaz kılar. Makam ön sertifikayı birkaç günlüğe yollar.
Her günlük bir SCT (Signed Certificate Timestamp) döndürür. SCT, günlüğün bu kaydı azami birleşme süresi içinde, genelde 24 saatte, ağaca ekleyeceğine dair imzalı sözüdür. Makam SCT'leri gerçek sertifikanın içine gömer ve sertifikayı verir. Tarayıcı bağlantı sırasında SCT'leri denetler.
Chrome'un politikası 180 gün ve daha kısa süreli sertifikada en az iki, daha uzun sertifikada en az üç farklı günlükten SCT ister. Bu günlüklerin en az ikisi farklı işletmecilere ait olmalıdır. Yeterli SCT yoksa sertifika reddedilir.
Günlük bir Merkle ağacıdır. Yapraklar sertifikaların özetidir, her üst düğüm iki çocuğunun özetinden oluşur. Günlük ağacın kökünü düzenli olarak imzalar.
Bir kayıt sonradan silinir ya da değiştirilirse kök değişir ve tutarlılık kanıtı bunu ele verir. İzleyiciler (monitor) günlükleri sürekli okur ve ilgilendikleri adlar için yeni kayıtları raporlar. crt.sh bu izleyicilerin herkese açık bir örneğidir.
Günlükleri toplar, bir veritabanına yazar ve sorguya açar. Sen crt.sh'e soru sorduğunda istek hedefe değil bu veritabanına gider. Kurum bir iç panel için genel güvenilir sertifika aldıysa, panelin adı günlükte durur. Kimse siteye bağlantı vermese bile ad görünür.
Derinleş:Ele geçirilen bir makamın dersi
2011 yazında Avrupa'da çalışan bir sertifika makamının sistemlerine sızıldı. Saldırgan yüzlerce sahte sertifika üretti. Aralarında çok kullanılan bir e-posta hizmetinin adına verilmiş joker bir sertifika da vardı. Bu sertifika bir ülkedeki kullanıcıların trafiğini dinlemek için kullanıldı.
Sahtecilik, bir tarayıcının o hizmet için gömülü sertifika sabitlemesi (pinning) sayesinde fark edildi. Makamın güveni tarayıcılardan kaldırıldı ve şirket kısa süre sonra iflas etti. Aynı yılın başında başka bir makamın bayisi de ele geçirilmiş ve birkaç sahte sertifika üretilmişti.
Olay acı bir gerçeği gösterdi: sabitleme yalnız birkaç büyük hizmeti korur, geri kalan herkes körlemesine güvenir. Sertifika şeffaflığı bu olaydan sonra hız kazandı. Amaç her sertifikayı görünür kılmak ve sahte sertifikanın günler içinde fark edilmesini sağlamaktı.
Etkinlik 1 / 6
Doğru mu, yanlış mı?
Sertifika şeffaflık günlüğünü crt.sh üzerinden sorgulamak, hedefin erişim kaydına satır düşürmez.
Sorgu hattı: crt.sh'ten temiz listeye
crt.sh'in web arayüzü elle bakmak için yeterlidir, ama toplu işte JSON çıktısını kullanırsın. Sorguda yüzde işareti joker görevi görür; %.beyazvadi.example bütün alt adları getirir. Adreste yüzde işareti %25 olarak kodlanır.
exclude=expired parametresi süresi dolmuş sertifikaları dışarıda bırakır. deduplicate=Y ise aynı sertifikanın ön sertifika ve son sertifika olarak iki kez görünmesini önler. Cevaptaki her nesne bir sertifikayı anlatır.
En çok kullanacağın alanlar name_value, common_name, issuer_name, not_before, not_after ve serial_number alanlarıdır. name_value alanı sertifikadaki bütün adları taşır ve birden çok adı satır sonuyla ayırır.
$ curl -s 'https://crt.sh/?q=%25.beyazvadi.example&output=json&exclude=expired&deduplicate=Y' \
| jq -r '.[].name_value' | sed 's/^\*\.//' | sort -u
beyazvadi.example
destek.beyazvadi.example
eski-panel.beyazvadi.example
hazirlik-portal.beyazvadi.example
vpn.beyazvadi.example
web01.beyazvadi.exampleKomutu parça parça oku. curl JSON cevabı çeker. jq -r her sertifikanın name_value alanını düz metin olarak basar; -r olmadan çıktı tırnaklı gelir.
name_value içindeki satır sonları, bir sertifikadaki birden çok adı ayrı satırlara böler. sed komutu *.beyazvadi.example gibi joker kayıtların başındaki yıldızı ve noktayı siler, böylece joker ana adla birleşir.
sort -u listeyi sıralar ve tekrarları atar. Sonuçta altı ad kalır. hazirlik-portal adı DNS listesinde yoktu ve yeni bir iz sayılır. Bu listeyi önceki derste kurduğun dnsx hattına verirsin ve her adın bugün hâlâ çözülüp çözülmediğine bakarsın.
Etkinlik 2 / 6
crt.sh üzerinden beyazvadi.example için tüm alt alan kayıtlarını JSON olarak iste.
Sınırlar ve sık hatalar
Günlüğün üç sınırı vardır. İlki joker sertifikadır. Kurum tek bir *.beyazvadi.example sertifikası kullanıyorsa günlükte yalnız o yıldız görünür.
Alt adlar ayrı ayrı yazılmaz. Bu durumda alt alan yok sonucuna varmak ciddi bir hatadır; yalnız günlüğün o kurum için sustuğunu söyleyebilirsin. Pasif DNS ve sözlük denemesi gibi başka kaynaklara dönersin.
İkinci sınır zamandır. Günlük geçmişi tutar, bugünü değil. Üç yıl önce sertifika alınmış bir ad bugün kapatılmış olabilir.
Süresi dolmuş bir sertifikadaki adı canlı sanmak sık yapılan bir hatadır. exclude=expired bu gürültüyü azaltır, ama her adı yine de çözerek doğrularsın.
Üçüncü sınır kapsamdır. Günlüğe yalnız genel güvenilir sertifikalar yazılır. Kurumun kendi iç sertifika makamıyla ürettiği sertifikalar hiçbir günlükte görünmez.
İç ağdaki sistemler bu yüzden sertifika günlüğünden çıkmaz ve onları ancak yetkili bir iç testte bulursun. Buna karşılık günlük, yayına hazırlanan sistemleri erken yakalar. Kurum bir sistemi açmadan önce sertifikasını alır.
Ad günlüğe düşer ama sayfa henüz açılmamıştır. hazirlik-portal gibi adlar çoğu zaman test ve hazırlık sistemleridir ve canlı sistemden daha zayıf yapılandırılır. eski-panel, test ve staging gibi adlar da sertifika almış ve unutulmuştur. Savunma raporunda bu liste doğrudan iş üretir.
Etkinlik 3 / 6
Bir kurum yalnız tek bir joker sertifika kullanıyorsa sertifika günlüğünden ne beklersin?
Sertifikanın içi: SAN, veren kurum ve süre
Sertifikadaki isim listesi iki alanda durur. Common Name (CN) tek bir ad taşır ve artık tarihsel bir alandır. Subject Alternative Name (SAN) ise onlarca adı birlikte taşır. Tarayıcılar adı SAN alanından doğrular, bu yüzden asıl liste orasıdır.
Günlük yerine doğrudan sunucudan da okuyabilirsin. openssl s_client sunucuya bağlanır, sertifikayı alır ve x509 alt komutu onu çözer. Ama bu adım sunucuya gerçek bir TLS bağlantısı açar. Yani aktiftir ve hedefin erişim kaydına düşer.
Pasif kalmak istiyorsan aynı bilgiyi crt.sh'teki sertifika sayfasından okursun. Aşağıdaki ikinci komut ise günlükten tarih ve makam bilgisini tablo olarak çeker.
$ openssl s_client -connect web01.beyazvadi.example:443 -servername web01.beyazvadi.example </dev/null 2>/dev/null \
| openssl x509 -noout -ext subjectAltName
X509v3 Subject Alternative Name:
DNS:web01.beyazvadi.example, DNS:beyazvadi.example
$ curl -s 'https://crt.sh/?q=%25.beyazvadi.example&output=json&exclude=expired&deduplicate=Y' \
| jq -r '.[] | [.not_before, .not_after, .issuer_name, .common_name] | @tsv' | sort
2025-11-03T00:00:00 2026-11-03T23:59:59 C=TR, O=Ticari Sertifika A.S., CN=Ticari OV CA eski-panel.beyazvadi.example
2026-08-14T09:12:40 2026-11-12T09:12:39 C=TR, O=Ornek CA, CN=Ornek CA R1 web01.beyazvadi.example
2026-09-02T06:30:11 2026-12-01T06:30:10 C=TR, O=Ornek CA, CN=Ornek CA R1 vpn.beyazvadi.example
2026-09-25T13:02:55 2026-12-24T13:02:54 C=TR, O=Ornek CA, CN=Ornek CA R1 hazirlik-portal.beyazvadi.exampleİlk komut SAN alanını sunucudan okur. -servername seçeneği SNI adını yollar, böylece aynı adreste birden çok site varsa doğru sertifika gelir. İkinci komut her sertifika için dört alanı yan yana basar ve başlangıç tarihine göre sıralar.
Şimdi süreleri karşılaştır. Ornek CA sertifikaları 90 günlüktür ve birkaç ayda bir yenilenir; bu otomatik kurulumun işaretidir. eski-panel'in sertifikası ise ticari bir makamdan alınmıştır ve bir yıl geçerlidir.
Bir yıllık sertifika çoğu zaman elle alınır ve elle yenilenir. Elle yönetilen ve adı eski olan bir sistem, bakımsız kalmaya en yakın adaydır. Veren kurumun adı da bağlam verir: ücretsiz otomatik makamlar otomasyonu, ticari makamlar satın alma sürecini düşündürür.
Süre bilgisinin önemi giderek artıyor. CA/Browser Forum SC081v3 kararıyla genel güvenilir sertifikaların azami süresi kademeli olarak kısalıyor. 15 Mart 2026'dan beri azami süre 200 gündür.
15 Mart 2027'de 100 güne, 15 Mart 2029'da 47 güne inecek. Eskiden 398 gün olan üst sınır birkaç yıl içinde bir buçuk aya düşüyor. Bunun iki sonucu var.
Elle yenileme pratikte imkânsızlaşıyor ve otomasyon zorunlu hale geliyor. Günlüklerdeki kayıt yoğunluğu da artıyor, çünkü her ad yılda daha çok sertifika alıyor. Araştırmacı için bu daha taze veri demektir. 15 Mart 2026'dan önce alınmış bir yıllık sertifikalar ise 2027'ye kadar görünür ve elle yönetimin izini taşır.
Etkinlik 4 / 6
Günlükten çekilen aşağıdaki tabloya göre elle yönetilme ihtimali en yüksek sistem hangisi?
Önce kodu oku, sonra çıktıyı seç.
2026-09-20 2026-12-19 CN=Ornek CA R1 api.beyazvadi.example 2025-10-20 2026-10-20 CN=Ticari OV CA ik-portal.beyazvadi.example 2026-08-10 2026-11-08 CN=Ornek CA R1 posta.beyazvadi.example 2026-09-01 2026-11-30 CN=Ornek CA R1 web02.beyazvadi.example
Etkinlik 5 / 6
Bir sertifikadaki tüm alan adlarını listeleyen alanın kısaltması: ____
Günlüğü savunma alarmına çevirmek
Kayıtlar günlüğe dakikalar içinde düşer. Bu hız iki tarafa da yarar. Saldırgan yeni yüzey arar; savunma aynı akışı kendi envanterini güncellemek için izler.
certstream gibi akış araçları günlüklere yeni eklenen sertifikaları anlık yayınlar. Savunma ekibi bu akışa küçük bir süzgeç bağlar: kendi alan adları ve kurum adına benzeyen dizeler. Aşağıdaki çıktıda süzgeç iki kayıt yakalar.
İlki kurumun kendi yeni sistemidir ve envantere eklenir. İkincisi kurum adına benzeyen bir oltalama adıdır ve önceki dersteki taklit alan adı sürecine girer. Hazır izleme hizmetleri de aynı işi e-posta uyarısıyla yapar.
$ python3 ct_izle.py --sozcuk beyazvadi [09/29/26 10:14:02] fatura.beyazvadi.example (SAN: ) [09/29/26 10:21:47] beyazvadi-destek.example (SAN: www.beyazvadi-destek.example)
Önleyici tarafta CAA kaydı durur. CAA, alan adın için hangi makamların sertifika verebileceğini DNS'te ilan eder. CA/Browser Forum kuralları gereği makamlar Eylül 2017'den beri sertifika vermeden önce bu kaydı kontrol etmek zorundadır.
Kayıt kurallara uyan bir makamın yanlışlıkla sertifika vermesini önler, ama ele geçirilmiş bir makamı durdurmaz. O yüzden CAA ile CT birlikte çalışır: CAA yanlış sertifikanın çıkmasını zorlaştırır, CT çıkanı görünür kılar. Aşağıdaki kayıtta issue satırı tek makama yetki verir.
issuewild satırındaki noktalı virgül, joker sertifikayı bütün makamlara kapatır. iodef satırı ise kurala aykırı bir istek geldiğinde makamın bildirim yollayacağı adresi yazar.
$ dig CAA beyazvadi.example +short 0 issue "ornek-ca.example" 0 issuewild ";" 0 iodef "mailto:[email protected]"
Beklenmeyen bir sertifika göründüğünde iki olasılık vardır. Ya bir ekip habersiz iş yapmıştır ya da kurum adına sahte sertifika alınmıştır. İlk adım sertifikanın SAN listesini ve veren makamı okumaktır. Sonra iç ekiplere talebin kimden geldiğini sorarsın.
Talep yoksa makamın sorun bildirme kanalına yazar ve sertifikanın iptalini istersin. Ardından DNS paneline ve e-posta hesaplarına kimin eriştiğini gözden geçirirsin, çünkü alan doğrulaması çoğu zaman bu kanallardan yapılır. Son olarak CAA kaydını sıkılaştırır ve izleme süzgecini güncellersin. Bu akışı önceden yazmış kurum, alarm geldiğinde dakikalar içinde harekete geçer.
Etkinlik 6 / 6
Kurum adına beklenmeyen bir sertifika göründü. Olay adımlarını sırala.
Bir öğeye odaklan, yukarı ve aşağı ok tuşlarıyla taşı. Home tuşu en üste, End tuşu en alta alır.
- 1CAA kaydını ve izleme süzgecini güncelle
- 2DNS ve e-posta erişimlerini gözden geçir
- 3Talep yoksa makamdan iptal iste
- 4SAN listesini ve veren makamı oku
- 5İç ekiplere talebin sahibini sor
Okumayı istediğin sırayla sürdürebilirsin. Ders, bütün etkinlikleri cevapladığında tamamlanır.