Ders 08 / 21
Sertifikalar
Sertifika alanları kanıtladıkları iddia cinsinden ölçülür: dokuz alanın her biri hangi iddiayı bağlıyor, tek bir uç kalemin kullanılabilmesi için sekiz kalemin aynı anda tutması gerekiyor ve beş denetim on üç kullanım denemesinin sekizini kapatırken beş meşru denemenin hiçbirini durdurmuyor.
İçindekiler
Bir önceki ders imzayı ölçtü ve tek bir soruyu açık bıraktı: imza bütünlüğü kanıtlıyor, hatta imzalayanın o özel anahtarı elinde tuttuğunu da kanıtlıyor, ama doğrulamada kullanılan açık anahtarın kime ait olduğunu hiçbir şey kanıtlamıyor. Doğrulayan taraf elindeki anahtarın gerçekten karşı tarafa ait olduğunu bir yerden bilmek zorunda.
Sertifika bu boşluğu bir belgeyle doldurur: bir açık anahtarı bir ada bağlayan ve bu bağı üçüncü bir tarafın imzasıyla onaylayan bir kayıt. Bu ders sertifikayı “alanlar listesi” olarak değil, iddialar listesi olarak ele alır ve üç şey sayar: her alan hangi iddiayı bağlıyor, tek bir kalemin kullanılabilmesi için kaç şeyin aynı anda doğru olması gerekiyor, alanlar denetlendiğinde kaç kullanım yolu kapanıyor.
- PK1. Bu konunun sayım birimi kalemdir: güven kökünden kullanıma kadar zincirde ayrı ayrı doğru olması gereken bir bileşen, yapılandırma ya da süreç.
- PK2. Sertifika alanları veri yapısı olarak modellenir; imza gerçekten üretilir ve doğrulanır. Kurgu bölgesel ölçüm ağı üzerinde çalışılır; gerçek alan adı, gerçek sertifika ve gerçek otorite adı yazılmaz.
- PK3. Değerlendirme anı sabittir ve kurgudur. Saatin doğru olduğu varsayılır; saatin kendisi ayrı bir kalem olarak sayılır.
- PK4. Kullanım denemesi bir üçlüdür: sunulan kalem, sunulduğu ad, yapılacak iş. Meşru deneme, bu üçlünün kalemin alanlarıyla uyuştuğu denemedir.
- PK5. Veren kaleminin kendi vereni bu derste tek adım sayılır; zincirin tamamı ve kök sonraki derste kurulur.
Alan Değil, İddia
Bir sertifikaya alan listesi olarak bakmak yanıltıcıdır, çünkü alanların hepsi aynı işi yapmaz. Her alan bir iddiayı taşır ve o alan denetlenmediğinde iddia kanıtsız kalır — alanın kayıtta bulunması yetmez.
// alan.mjs — kurgu sertifika alanlari ve her alanin bagladigi iddia. MODELDIR. // Bolgesel olcum agi KURGUDUR: ad, seri ve tarihler uydurmadir; gercek sertifika yoktur. export const ALAN = [ // alan, bagladigi iddia, alan yoksa ya da denetlenmezse kanitsiz kalan ["ozne", "anahtar bu adin sahibine ait", "anahtar herhangi bir ada baglanir"], ["alternatif ad", "kalem bu uc adlari icin gecerli", "baska ad icin sunulur"], ["veren", "alanlari kim onayladi", "zincir kurulamaz"], ["seri", "kalem tekil olarak anilabilir", "iptal kaydi hedef gosteremez"], ["gecerlilik", "iddia belirli bir araligi kapsar", "iddia sure sinirsiz olur"], ["acik anahtar", "dogrulanacak anahtar budur", "imza kimin diye sorulamaz"], ["kullanim", "anahtar yalnizca bu isler icin", "her is icin kullanilir"], ["temel kisit", "kalem sertifika imzalayabilir mi", "her uc kalem otorite olur"], ["imza", "alanlar veren tarafindan onaylandi", "alanlar degistirilebilir"], ]; export const SIMDI = Date.parse("2026-06-01T00:00:00Z"); // kurgu degerlendirme ani export const KAYIT = [ ["c1", "olcum-toplayici", ["olcum-toplayici", "toplayici-yedek"], "sunucu-ara", "2026-01-10", "2027-01-10", ["sunucu-kimligi"], false], ["c2", "sayac-ucu-0042", ["sayac-ucu-0042"], "aygit-ara", "2026-03-02", "2027-03-02", ["istemci-kimligi"], false], ["c3", "sube-aktarim", ["sube-aktarim"], "imza-ara", "2026-02-14", "2027-02-14", ["dijital-imza"], false], ["c4", "olcum-toplayici", ["olcum-toplayici"], "sunucu-ara", "2024-05-01", "2025-05-01", ["sunucu-kimligi"], false], ["c5", "sunucu-ara", ["sunucu-ara"], "kurum-koku", "2025-01-01", "2030-01-01", ["sertifika-imzalama"], true], ["c7", "coklu-ara", ["coklu-ara"], "kurum-koku", "2025-06-01", "2029-06-01", ["sertifika-imzalama", "sunucu-kimligi"], true], ].map(([id, ozne, altAd, veren, bas, bit, kullanim, otoriteMi], i) => ({ id, ozne, altAd, veren, seri: 5100 + i, gecerliBas: Date.parse(bas + "T00:00:00Z"), gecerliBit: Date.parse(bit + "T00:00:00Z"), kullanim, otoriteMi })); // Kullanim denemesi: hangi kalem, hangi ad icin, hangi is icin sunuluyor. export const DENEME = [ ["c1", "olcum-toplayici", "sunucu-kimligi", "mesru"], ["c1", "toplayici-yedek", "sunucu-kimligi", "mesru"], ["c2", "sayac-ucu-0042", "istemci-kimligi", "mesru"], ["c3", "sube-aktarim", "dijital-imza", "mesru"], ["c5", "sunucu-ara", "sertifika-imzalama", "mesru"], ["c6", "olcum-toplayici", "sunucu-kimligi", "alan degistirilmis"], ["c4", "olcum-toplayici", "sunucu-kimligi", "suresi dolmus"], ["c4", "toplayici-yedek", "sunucu-kimligi", "suresi dolmus, ad yok"], ["c1", "fatura-servisi", "sunucu-kimligi", "baska ad"], ["c3", "sube-aktarim", "sunucu-kimligi", "imza kalemi sunucu yerine"], ["c2", "sayac-ucu-0042", "sunucu-kimligi", "aygit kalemi sunucu yerine"], ["c5", "sunucu-ara", "sunucu-kimligi", "otorite kalemi uc yerine"], ["c7", "coklu-ara", "sunucu-kimligi", "kullanimi genis otorite kalemi"], ]; export const gun = (ms) => new Date(ms).toISOString().slice(0, 10); export const yaz = (g) => (h) => h.map((v, i) => (i ? String(v).padStart(g[i]) : String(v).padEnd(g[0]))).join(""); export const sol = (g) => (h) => h.map((v, i) => String(v).padEnd(g[i])).join("").trimEnd();
// iddia.mjs — alan basina bagladigi iddia ve alan denetlenmezse acilan durum import { ALAN, KAYIT, DENEME, gun, sol } from "./alan.mjs"; const y = sol([14, 38, 40]); console.log(`${KAYIT.length} kurgu kalem, ${DENEME.length} kullanim denemesi, ` + `${ALAN.length} alan`); console.log("\n" + y(["alan", "bagladigi iddia", "denetlenmezse"])); for (const [ad, iddia, acik] of ALAN) console.log(y([ad, iddia, acik])); const k = KAYIT[0]; console.log(`\nornek kalem ${k.id}: ozne ${k.ozne}, veren ${k.veren}, seri ${k.seri}`); console.log(` alternatif ad ${k.altAd.join(", ")} | kullanim ${k.kullanim.join(", ")} | ` + `otorite ${k.otoriteMi}`); console.log(` gecerlilik ${gun(k.gecerliBas)} -> ${gun(k.gecerliBit)}, ` + `pencere ${Math.round((k.gecerliBit - k.gecerliBas) / 86400000)} gun`);
6 kurgu kalem, 13 kullanim denemesi, 9 alan alan bagladigi iddia denetlenmezse ozne anahtar bu adin sahibine ait anahtar herhangi bir ada baglanir alternatif ad kalem bu uc adlari icin gecerli baska ad icin sunulur veren alanlari kim onayladi zincir kurulamaz seri kalem tekil olarak anilabilir iptal kaydi hedef gosteremez gecerlilik iddia belirli bir araligi kapsar iddia sure sinirsiz olur acik anahtar dogrulanacak anahtar budur imza kimin diye sorulamaz kullanim anahtar yalnizca bu isler icin her is icin kullanilir temel kisit kalem sertifika imzalayabilir mi her uc kalem otorite olur imza alanlar veren tarafindan onaylandi alanlar degistirilebilir ornek kalem c1: ozne olcum-toplayici, veren sunucu-ara, seri 5100 alternatif ad olcum-toplayici, toplayici-yedek | kullanim sunucu-kimligi | otorite false gecerlilik 2026-01-10 -> 2027-01-10, pencere 365 gun
Tablonun üçüncü sütunu dersin asıl konusudur. Alan orada durur, okunabilir, biçimi geçerlidir; denetlenmediğinde ise sertifikanın taşıdığı iddia kayıtta bulunmaya devam eder ama arkasında kanıt kalmaz. Geçerlilik penceresi denetlenmeyen bir kalem süresiz bir iddiaya dönüşür; kullanım amacı denetlenmeyen bir anahtar her işe koşulur.
İki alan ötekilerden ayrılır. Alternatif ad, öznenin kendisinden daha bağlayıcıdır: doğrulama sunulan adı bu listede arar, öznede değil. Temel kısıt ise tek bir doğru-yanlış değeriyle bir kalemin başka sertifika imzalayıp imzalayamayacağını söyler; bu alan denetlenmediğinde her uç kalem sahibi kendi sertifikalarını üretebilir hâle gelir.
Kaç Kalem Aynı Anda Tutmalı
Bu kursun ölçüsü zincirin uzunluğudur. Tek bir uç kalemin bir bağlantıda kabul edilmesi için kaç ayrı şeyin aynı anda doğru olduğunu saymak, sertifikayı bir dosya olmaktan çıkarıp bir koşullar kümesi hâline getirir.
// denetim.mjs — gercek imza uretimi, tutmasi gereken kalem sayisi ve kapanan yol import { generateKeyPairSync, sign, verify } from "node:crypto"; import { KAYIT, DENEME, SIMDI, yaz, sol } from "./alan.mjs"; // Her veren icin bir anahtar cifti uretilir; imza gercektir, alanlar kurgudur. const ANAHTAR = {}; for (const v of new Set(KAYIT.map((k) => k.veren))) ANAHTAR[v] = generateKeyPairSync("ed25519"); const govde = (k) => Buffer.from(JSON.stringify([k.ozne, k.altAd, k.veren, k.seri, k.gecerliBas, k.gecerliBit, k.kullanim, k.otoriteMi])); const KALEM = Object.fromEntries(KAYIT.map((k) => [k.id, { ...k, imza: sign(null, govde(k), ANAHTAR[k.veren].privateKey) }])); // c6: c1'in alani genisletilmis, imzasi oldugu gibi kopyalanmis kalemi. KALEM.c6 = { ...KALEM.c1, id: "c6", altAd: [...KALEM.c1.altAd, "fatura-servisi"] }; const DENETIM = [ ["imza", (k) => verify(null, govde(k), ANAHTAR[k.veren].publicKey, k.imza)], ["gecerlilik", (k) => SIMDI >= k.gecerliBas && SIMDI <= k.gecerliBit], ["ad", (k, ad) => k.altAd.includes(ad)], ["kullanim", (k, ad, is) => k.kullanim.includes(is)], ["temel kisit", (k, ad, is) => k.otoriteMi === (is === "sertifika-imzalama")], ]; // c1 kaleminin kullanilabilmesi icin ayni anda dogru olmasi gereken kalemler. const c1 = KALEM.c1; const ZINCIR = [ ["veren acik anahtari elde", () => ANAHTAR["sunucu-ara"].publicKey !== undefined], ["alanlar degismemis", () => verify(null, govde(c1), ANAHTAR["sunucu-ara"].publicKey, c1.imza)], ["saat penceresi icinde", () => SIMDI >= c1.gecerliBas && SIMDI <= c1.gecerliBit], ["sunulan ad listede", () => c1.altAd.includes("olcum-toplayici")], ["kullanim amaci esliyor", () => c1.kullanim.includes("sunucu-kimligi")], ["temel kisit uc kalemi diyor", () => c1.otoriteMi === false], ["veren otorite yetkisi tasiyor", () => KALEM.c5.otoriteMi === true], ["ozel anahtar gizli kalmis", () => true], ]; console.log(`c1 icin ayni anda dogru olmasi gereken kalem: ${ZINCIR.length}`); console.log(`hepsi dogruyken sonuc: ${ZINCIR.every(([, f]) => f()) ? "gecer" : "duser"} ` + `imza dogrulamasi node:crypto ile kosturuldu`); // Tek tek bozma: hangi denetim yakaliyor, yakalanmazsa hangi yol aciliyor. const BOZ = [ ["alan degistirildi", "c6", "olcum-toplayici", "sunucu-kimligi", "ad listesi serbest yazilir"], ["saat penceresi disi", "c4", "olcum-toplayici", "sunucu-kimligi", "kalem sonsuza gecerli"], ["baska ad icin sunuldu", "c1", "fatura-servisi", "sunucu-kimligi", "her ad icin sunulur"], ["imza kalemi sunucu yerine", "c3", "sube-aktarim", "sunucu-kimligi", "tek anahtar her ise"], ["otorite kalemi uc yerine", "c7", "coklu-ara", "sunucu-kimligi", "uc kalem sertifika imzalar"], ]; const y1 = sol([28, 16, 30]); console.log("\n" + y1(["bozulan kalem", "yakalayan", "yakalanmazsa acilan yol"])); for (const [ad, id, hedef, is, acik] of BOZ) { const takilan = DENETIM.filter(([, d]) => !d(KALEM[id], hedef, is)).map(([n]) => n); console.log(y1([ad, takilan.join(", ") || "yok", acik])); } // Denetimler sirayla eklendiginde gecen deneme sayisi. const gecen = (n, sec = () => true) => DENEME.filter(([id, ad, is, not]) => sec(not) && DENETIM.slice(0, n).every(([, d]) => d(KALEM[id], ad, is))).length; const MESRU = DENEME.filter(([, , , n]) => n === "mesru").length; const y2 = yaz([26, 8, 10, 14]); console.log(`\n${DENEME.length} kullanim denemesi, ${MESRU} tanesi mesru`); console.log(y2(["eklenen denetim", "gecen", "kapanan", "mesru gecen"])); let onceki = DENEME.length; console.log(y2(["denetim yok", onceki, 0, MESRU])); DENETIM.forEach(([ad], i) => { const g = gecen(i + 1); console.log(y2([`+ ${ad}`, g, onceki - g, gecen(i + 1, (n) => n === "mesru")])); onceki = g; }); console.log(`kalan yol ${onceki - MESRU}; durdurulan mesru is ${MESRU - gecen(DENETIM.length, (n) => n === "mesru")}`);
c1 icin ayni anda dogru olmasi gereken kalem: 8 hepsi dogruyken sonuc: gecer imza dogrulamasi node:crypto ile kosturuldu bozulan kalem yakalayan yakalanmazsa acilan yol alan degistirildi imza ad listesi serbest yazilir saat penceresi disi gecerlilik kalem sonsuza gecerli baska ad icin sunuldu ad her ad icin sunulur imza kalemi sunucu yerine kullanim tek anahtar her ise otorite kalemi uc yerine temel kisit uc kalem sertifika imzalar 13 kullanim denemesi, 5 tanesi mesru eklenen denetim gecen kapanan mesru gecen denetim yok 13 0 5 + imza 12 1 5 + gecerlilik 10 2 5 + ad 9 1 5 + kullanim 6 3 5 + temel kisit 5 1 5 kalan yol 0; durdurulan mesru is 0
Tek bir uç kalemin tek bir bağlantıda kabul edilmesi sekiz kalemin aynı anda tutmasına bağlı. Bunların yalnız üçü sertifikanın içindedir; kalanı dışarıdadır. Veren tarafın açık anahtarının doğrulayanın elinde olması bir kalemdir ve bu ders onu hazır varsayar. Saatin doğru olması ayrı bir kalemdir: penceresi geçmiş bir kalemi kabul ettirmenin en kestirme yolu sertifikaya dokunmak değil, doğrulayanın saatini geriye almaktır. Sekizincisi hiçbir denetimle ölçülemez — özne kendi özel anahtarını gizli tutmuş olmalıdır ve doğrulayan tarafın bunu sınayacak hiçbir aracı yoktur.
Bozma tablosu her alanın ayrı bir yolu kapattığını gösteriyor. Beş bozmanın her biri tam olarak
bir denetime takılıyor; hiçbiri iki denetim tarafından birden yakalanmıyor. En dikkat çeken satır
sonuncusudur: coklu-ara kalemi kullanım listesinde sunucu kimliğini taşır, adı doğrudur, imzası
geçerlidir, süresi dolmamıştır — onu durduran tek şey temel kısıt alanının otorite kalemlerini uç
kalem olarak kullanmayı yasaklamasıdır.
Kısıtın Kapattığı Yol
Son tablo denetimleri tek tek ekleyip her adımda geçen deneme sayısını veriyor. Hiçbir denetim yokken on üç denemenin on üçü de geçer; sertifika sunmak yeterlidir. Beş denetim eklendiğinde geçen sayı beşe iner ve bu beş, tam olarak meşru denemelerin kendisidir.
Kapanan yol dağılımı eşit değil. En çok yolu kullanım amacı denetimi kapatıyor (üç): imza kalemi, aygıt kalemi ve otorite kalemi sunucu kimliği yerine sunulduğunda hepsi burada durur. Geçerlilik penceresi iki, imza bir, ad bir, temel kısıt bir kapatıyor. Sıralamanın kendisi de sonucu değiştirir — denetimler farklı bir sırayla eklenseydi tek tek kapattıkları sayı değişirdi, toplam değişmezdi. Bu yüzden “hangi denetim ne kadar değerli” sorusunun yanıtı sıradan bağımsız değildir; değeri sabit olan tek şey o denetim kaldırıldığında yeniden açılan yol sayısıdır.
Geçerlilik penceresinin işlevi de tabloda göründüğünden geniştir. Pencere yalnız kalemin ne kadar
süre kullanılacağını söylemez; yanlış olduğu hiç fark edilmeyen bir iddianın kendiliğinden
düşeceği anı da söyler. Kurgu c1 kalemi üç yüz altmış beş günlük bir pencere taşıyor. Özel
anahtarı bugün dışarı çıksa ve bunu kimse görmese bile o kalem pencerenin sonunda geçmeyi bırakır;
pencere sonsuz olsaydı böyle bir son da olmazdı. Daraltmak bu süreyi kısaltır ve karşılığında
yenileme işini çoğaltır — bu iki sayı arasındaki denge beşinci dersin konusudur.
Son satır savunmanın bedelini yazar: durdurulan meşru iş sıfırdır. Beş denetimin hiçbiri meşru bir kullanımı engellemiyor, çünkü hepsi kalemin kendi alanlarında yazılı olanı sınıyor. Bu, sertifika denetimlerini bu kursta ölçülen öteki savunmalardan ayıran bir özelliktir: bedeli çalışma anında değil, yapılandırma anında ödenir. Alanların doğru doldurulması, kullanım amaçlarının önceden düşünülmesi ve adların eksiksiz yazılması işi kalemi üreten tarafa yıkar. Bu bedelin gerçek boyutu yenileme sıklığıyla birlikte ölçülür ve o ölçüm bu konunun beşinci dersinde yapılır.
Bir şeyi ise bu denetimlerin hiçbiri sınamıyor. On üç denemenin tamamında veren tarafın açık
anahtarı doğrulayanın elinde hazır kabul edildi; c1 kaleminin imzası sunucu-ara anahtarıyla
doğrulandı, çünkü o anahtar zaten oradaydı. Bu, birinci kalemin ta kendisidir ve bu derste
varsayım olarak duruyor.
Özet
- Sertifikanın dokuz alanı dokuz ayrı iddia bağlar; alanın kayıtta bulunması yetmez, denetlenmesi gerekir. Denetlenmeyen alan iddiayı kanıtsız bırakır ve kayıtta hiçbir iz kalmaz.
- Sunulan adı belirleyen alan öznenin kendisi değil alternatif ad listesidir; temel kısıt tek bir doğru-yanlış değeriyle bir kalemin sertifika imzalayıp imzalayamayacağını söyler.
- Tek bir uç kalemin tek bir bağlantıda kabul edilmesi 8 kalemin aynı anda tutmasına bağlıdır; bunların yalnız 3’ü sertifikanın içindedir. Saatin doğruluğu ve özel anahtarın gizli kalması sertifikaya bakarak sınanamaz.
- Beş bozmanın her biri tam olarak bir denetime takılıyor: her alan ayrı bir yol kapatıyor, hiçbiri bir ötekinin yedeği değil.
- Denetimsiz 13 denemenin 13’ü geçiyor; beş denetim 8 yol kapatıp geçen sayıyı 5’e indiriyor ve durdurulan meşru iş 0. Kapanan yol dağılımı sıraya bağlıdır; sıradan bağımsız olan tek ölçü bir denetim kaldırıldığında yeniden açılan yol sayısıdır.
Sonraki Adım
Bu dersin bütün ölçümü tek bir kalemin üzerinde duruyordu: doğrulayan tarafın, verenin açık anahtarını zaten elinde tuttuğu. O anahtar oraya nasıl geldi ve arkasında kim var. Bir uç kalem bir ara otorite tarafından, ara otorite bir kök tarafından imzalanır ve zincirin ucundaki kök kendi kendini imzalar — yani hiçbir şey onu doğrulamaz, doğrudan güvenilir. Sonraki ders bu grafiği kurup tek soruyu sayıya bağlar: kurgu ölçüm ağında kaç ara otorite var, her birinin altında kaç uç kalem duruyor, tek kök kaç kalemi birden taşıyor ve o kök kırıldığında kaç kalem düşüp yenilenmesi kaç elle dokunuş tutuyor.
İlerlemeni kaydetmek ve not almak için Giriş yap
Notlarım
Not almak için giriş yapmalısın.