---
title: Sertifikalar
source: 'https://academia.sh/tr/kurslar/kimlik-ve-kriptografi/sertifikalar'
course: 'Kimlik, Erişim ve Kriptografi'
language: tr
updated: '2026-08-17T18:08:37+00:00'
license: 'CC BY-SA 4.0'
---

# 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.

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 **kalem**dir: 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.

```js
// 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();
```

```js
// 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.

```js
// 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.
