İçeriğe geç
academia.sh

Ders 09 / 16

TLS El Sıkışması

El sıkışmanın gidiş–dönüş bütçesi, oturum sürdürmenin kazandırdığı tur ve taşıma zarfı kapandığında aracının kaybettiği 160 karar.

İçindekiler

Zincir doğrulaması hiç tur istemedi, ama havada da yapılmadı. Sertifikanın istemcinin eline geçmesi için önce bir alışverişin başlaması, sunucunun zinciri sunması ve iki tarafın ortak sırra varması gerekiyordu. TLS (Transport Layer Security) el sıkışması bu üç işi tek bir kurulum içinde yapar.

Bu dersin sorusu iki katlıdır. Birincisi bütçedir: kurulum kaç gidiş–dönüş tutar, bu bütçe kim tarafından ödenir ve tekrar tekrar ödenmesi nasıl önlenir. İkincisi kursun asıl konusudur: kurulum tamamlandığında ileti bir taşıma zarfı (transport envelope) içine girer ve aracı artık iletide yazanı okuyamaz. Kurs boyunca sayılan karar tablosuna bunun ne yaptığı burada ölçülüyor.

El Sıkışmanın Taşıdıkları

El sıkışma, üzerinde anlaşılması gereken her şeyi az sayıda iletide toplar.

tam kurulum
  istemci -> sunucu : selam, desteklenen takımlar, istemcinin anahtar payı
  sunucu  -> istemci: selam, seçilen takım, sunucunun anahtar payı,
                      sertifika zinciri, bitirme
  istemci -> sunucu : bitirme, ardından uygulama verisi

oturum sürdürme
  istemci -> sunucu : selam, önceki oturumun sürdürme kimliği
  sunucu  -> istemci: selam, bitirme
  istemci -> sunucu : bitirme, ardından uygulama verisi

Bu döküm çalıştırılmaz; adımların ne taşıdığını gösterir. Dört iş yan yana durur: takımın seçilmesi, anahtar paylarının değişimi, sertifika zincirinin sunulması ve iki tarafın kurulumu bitirdiğini birbirine doğrulaması.

Dört iş bağımsız değildir: takım seçilmeden anahtar payları yorumlanamaz, anahtar payları değişmeden bitirme hesaplanamaz. Adımların sırası bu bağımlılıktan çıkar; turlar birleştirilebilir ama yer değiştiremez.

Sıranın kendisi bir tasarım kararıdır. Sertifika zinciri, sunucunun ilk yanıtıyla gelir; istemci onu doğrulamak için ayrıca bir istek yapmaz. Önceki dersteki ölçüm bunun karşılığıdır: zincir doğrulaması sıfır gidiş–dönüşle yürüyordu, çünkü doğrulayacağı her şey zaten elindeydi. Sürdürme adımlarında sertifika zinciri yoktur — istemci o zinciri bir kez doğrulamış, sonucu oturumla birlikte saklamıştır.

Takımın Seçilmesi ve Bitirme

Dört işten ilki bir pazarlıktır. İstemci desteklediği şifre takımlarını (cipher suite) bildirir, sunucu bunlardan birini seçer. Takım, kurulumdan sonra hangi simetrik dönüşümün ve hangi özet işlevinin kullanılacağını belirler; ilk dersteki iş bölümü burada somutlaşır.

Pazarlığın bir sorunu vardır ve bu, kursun her dersinde tekrarlanan sorunun aynısıdır: ilk iki ileti henüz korunmayan bir kanalda gider. Yolun üzerindeki bir katman istemcinin listesini okuyabilir. Belirtimin buna verdiği yanıt, kurulumun son adımındaki bitirme iletisidir: bitirme, o ana kadar alınıp verilen el sıkışma iletilerinin tamamının özeti üzerinde hesaplanır ve kurulumdan çıkan anahtarla üretilir. İki taraf da karşının bitirmesini denetler; birinin gördüğü el sıkışma dökümü öbürününkinden farklıysa bitirme tutmaz ve kurulum tamamlanmaz.

Bu, kursta ilk kez rastlanan bir şeydir. Aracının bütün kararları bir bildirime dayanıyordu ve bildirimi doğrulayan hiçbir şey yoktu. Bitirme, pazarlığın bildirimini doğrulayan bir adımdır: bildirim sonradan denetlenebilir hâle getirilmiştir. Aradaki fark, kim tarafından denetlendiğidir — denetimi aracı değil, uçlar yapar.

Bitirmenin denetlemediği bir şey kalır: listenin içeriği. Bitirme, iki tarafın aynı listeyi gördüğünü doğrular; listede zayıf bir takımın bulunmasını engellemez. Zayıf takımları listede tutmak bu yüzden bir yapılandırma kusurudur: seçim gerçekten yapılmış, pazarlık gerçekten doğrulanmış olur ve yine de kurulum kötü bir takıma oturur. Daraltma: listenin kendisi daraltılırsa — yalnız kabul edilebilir takımlar bildirilirse — pazarlığın varabileceği sonuç kümesi de daralır ve doğrulama işe yarar hâle gelir. Bu bir belirtidir ve burada yazılan neyin yanlış olduğudur.

Bütçe Bağlantı Başına Ödenir

Kurulumun turu alışverişe değil bağlantıya yazılır. Kırk alışveriş tek bir bağlantıda yapılıyorsa kurulum bir kez ödenir; kırk ayrı bağlantıda yapılıyorsa kırk kez.

Aşağıdaki ölçüm tam kurulumu iki gidiş–dönüş, oturum sürdürmeyi bir gidiş–dönüş olarak modelliyor. Bu iki sayı ders içinde seçilmiş model değerleridir; belirtim ailesinin farklı sürümlerinde farklı çıkarlar ve ders bir sürüm iddiası taşımaz. Ölçülen şey sayıların kendisi değil, bağlantı sayısıyla nasıl büyüdükleridir.

ALISVERIS = 40
TAM_TUR = 2          # ders içinde modellenen tam kurulum bütçesi
SURDURME_TUR = 1     # ders içinde modellenen oturum sürdürme bütçesi

print(f"{'bağlantı':>9s} {'sürdürmesiz kurulum':>20s} {'sürdürmeli kurulum':>19s} "
      f"{'kazanılan tur':>14s} {'toplam tur':>11s} {'alışveriş başına':>17s}")
for baglanti in (40, 8, 4, 1):
    sursuz = baglanti * TAM_TUR
    surdurmeli = TAM_TUR + (baglanti - 1) * SURDURME_TUR
    toplam = surdurmeli + ALISVERIS
    print(f"{baglanti:9d} {sursuz:20d} {surdurmeli:19d} {sursuz - surdurmeli:14d} "
          f"{toplam:11d} {toplam / ALISVERIS:17.3f}")
 bağlantı  sürdürmesiz kurulum  sürdürmeli kurulum  kazanılan tur  toplam tur  alışveriş başına
       40                   80                  41             39          81             2.025
        8                   16                   9              7          49             1.225
        4                    8                   5              3          45             1.125
        1                    2                   2              0          42             1.050

Kırk ayrı bağlantı kurulan rejimde kurulum, sürdürme olmadan 80 tur tutar; kırk alışverişin kendisi 40 tur tuttuğuna göre bağlantı kurmak, iş yapmaktan iki kat pahalıdır. Oturum sürdürme (session resumption) bu satırda 39 turu geri verir ve toplamı 81’e indirir; alışveriş başına 2,025 tur düşer.

İki gözlem tabloyu okumaya yeter. Birincisi, sürdürmenin kazandırdığı tur bağlantı sayısına bağlıdır: tek kalıcı bağlantıda kazanç sıfırdır, çünkü sürdürülecek bir şey yoktur. İkincisi, sürdürme kurulumu ortadan kaldırmaz — yalnız ucuzlatır. Kırk bağlantılık satırda bile alışveriş başına 1,000 turun üzerinde kalınır; sıfıra inen tek yol bağlantıyı kalıcı tutmaktır.

Sürdürmenin turdan başka kazandırdığı bir şey daha vardır ve bu, önceki derse bağlanır: sürdürülen oturumda sertifika zinciri yeniden sunulmaz, dolayısıyla zincir doğrulaması da yeniden yapılmaz. Bir kez alınmış bir karar, oturum yaşadığı sürece yeniden alınmaz. Bunun bedeli de aynı yerdedir: zincir hakkındaki bilgi eskir ve oturum bu eskimeyi görmez.

Zarf Kapanınca

Kurulum bittiğinde uygulama iletisi zarfın içine girer. Aracı iletinin geldiğini görür, uzunluğunu görür, hangi konağa gittiğini görür — ama yöntemi, yolu, kişiye özel imini ve doğrulayıcıyı göremez.

Kurs boyunca sayılan karar tablosu şimdi iki rejimde ölçülüyor. açık rejiminde aracı beş alanın hepsini okur; zarf rejiminde yalnız konak adını. Kâhin — kurguyu biz ürettiğimiz için bilinen gerçek — değişmiyor. Kırk alışveriş ve alışveriş başına beş karar, 200 kararlık bir kümedir; bu kümede ölçülebilen en küçük fark 1/200 = 0,0050’dir.

Bu dersin iki ölçümünün varsayımları:

  • GT13 — Bütçe tablosunda tam kurulum iki, oturum sürdürme bir gidiş–dönüş olarak ders içinde modellenir; iki değer de seçilmiş model değerleridir ve bir belirtim sürümü iddiası taşımaz.
  • GT14 — Kurulumun turu bağlantıya, alışverişin turu alışverişe yazılır: kırk alışveriş kırk tur tutar ve sürdürmeli rejimde ilk bağlantı tam kurulumu, kalanlar sürdürmeyi öder.
  • GT15 — Karar tablosunda kursun kırk alışverişi aynı tohumdan yeniden üretilir; alışveriş başına beş karar sayılır ve kâhin rejim değişince değişmez.
  • GT16 — İki rejim karşılaştırılır: açık rejiminde aracı yöntemi, yolu, konak adını, kişiye özel imi ve doğrulayıcıyı okur; zarf rejiminde yalnız konak adını. Konak adı kurulumun ilk iletisinde, henüz ortak sır yokken bildirildiği için zarfın dışındadır.
  • GT17 — Aracı yolun üzerindedir ve yalnız zarfın dışında kalana bakar; alamadığı her karar bir tur borcudur — o alışverişte sunucuya bir tur daha atılır.
  • GT18 — Bayt sütunu aracının okuyabildiği alanların sayımıdır, gerçek iletinin uzunluğu değil; ölçüm bir ağ ölçümü değildir.
TOHUM = 20260809
GUVENLI = {"GET", "HEAD"}
ETKISIZ = {"GET", "HEAD", "PUT", "DELETE"}
YONTEMLER = ["GET", "GET", "GET", "HEAD", "POST", "PUT", "DELETE"]
YOLLAR = ["/olcum/kuzey", "/olcum/yamac", "/ozet", "/kayit", "/oturum"]
KARARLAR = ("saklanabilir", "paylasilabilir", "taze", "yinelenebilir", "yonlendirilebilir")
GORUNUR = {"açık": ("yontem", "yol", "konak", "ozel_imi", "dogrulayici"),
           "zarf": ("konak",)}


def uretec(tohum: int):
    d = tohum % 2147483646 + 1

    def r(n: int) -> int:
        nonlocal d
        d = (d * 48271) % 2147483647
        return d % n
    return r


def alisverisler(sayi: int = 40) -> list[dict]:
    r, liste = uretec(TOHUM), []
    for i in range(sayi):
        yontem, yol = YONTEMLER[r(7)], YOLLAR[r(5)]
        ozel = yol == "/oturum" or r(5) == 0
        degisti = r(3) == 0
        liste.append({"no": i + 1, "yontem": yontem, "yol": yol,
                      "ozel": ozel, "degisti": degisti,
                      "ozel_imi": ozel and r(4) != 0,
                      "damga_atladi": degisti and r(6) == 0})
    return liste


def kahin(a: dict) -> dict:
    return {"saklanabilir": a["yontem"] in GUVENLI and not a["ozel"],
            "paylasilabilir": not a["ozel"],
            "taze": not a["degisti"],
            "yinelenebilir": a["yontem"] in ETKISIZ,
            "yonlendirilebilir": True}


def ileti(a: dict, gorunur: tuple) -> dict:
    tam = {"yontem": a["yontem"], "yol": a["yol"], "konak": "istasyon.ornek",
           "ozel_imi": a["ozel_imi"],
           "dogrulayici": a["degisti"] and not a["damga_atladi"]}
    return {k: v for k, v in tam.items() if k in gorunur}


def araci(i: dict) -> dict:
    k = {}
    if "yontem" in i:
        k["yinelenebilir"] = i["yontem"] in ETKISIZ
    if "ozel_imi" in i:
        k["paylasilabilir"] = not i["ozel_imi"]
        if "yontem" in i:
            k["saklanabilir"] = i["yontem"] in GUVENLI and not i["ozel_imi"]
    if "dogrulayici" in i:
        k["taze"] = not i["dogrulayici"]
    if "konak" in i:
        k["yonlendirilebilir"] = True
    return k


def bayt(i: dict) -> int:
    return sum(len(k) + len(str(v)) + 4 for k, v in i.items())


def olc(ad: str) -> tuple:
    dogru = yanlis = alinamayan = tur = toplam = 0
    for a in alisverisler():
        gercek, verilen = kahin(a), araci(ileti(a, GORUNUR[ad]))
        eksik = False
        for karar in KARARLAR:
            if karar not in verilen:
                alinamayan += 1
                eksik = True
            elif verilen[karar] == gercek[karar]:
                dogru += 1
            else:
                yanlis += 1
        tur += 1 if eksik else 0
        toplam += bayt(ileti(a, GORUNUR[ad]))
    return dogru, yanlis, alinamayan, tur, toplam


print(f"{'rejim':<8s} {'doğru':>6s} {'yanlış':>7s} {'alınamayan':>11s} "
      f"{'fazladan tur':>13s} {'bayt':>6s}")
for ad in ("açık", "zarf"):
    print(("{:<8s} {:6d} {:7d} {:11d} {:13d} {:6d}").format(ad, *olc(ad)))

print()
print(f"{'karar':<20s} {'açık':>8s} {'zarf':>8s}")
for karar in KARARLAR:
    alinan = [sum(karar in araci(ileti(a, GORUNUR[ad])) for a in alisverisler())
              for ad in ("açık", "zarf")]
    print(f"{karar:<20s} {alinan[0]:8d} {alinan[1]:8d}")
rejim     doğru  yanlış  alınamayan  fazladan tur   bayt
açık        195       5           0             0   3524
zarf         40       0         160            40    920

karar                    açık     zarf
saklanabilir               40        0
paylasilabilir             40        0
taze                       40        0
yinelenebilir              40        0
yonlendirilebilir          40       40

Yüz Altmış Kararın Gittiği Yer

Açık rejimde aracı 200 kararın 200’ünü alıyordu ve sunucuya hiç dönmüyordu; 195’i doğru, 5’i yanlıştı. Zarf rejiminde 160 karar alınamıyor. Bu kararlar yok olmadı; aracı onları alamadığı için uçlara taşındılar. Karar veren yalnız iki uç değildi; şimdi öyle oldu.

İkinci tablo bu 160’ın nereden toplandığını tek tek gösteriyor. Beş karardan dördü — saklanabilir, paylasilabilir, taze, yinelenebilir — açık rejimde kırk alışverişin kırkında da alınıyor, zarf rejiminde hiçbirinde alınmıyor: dört karar çarpı kırk alışveriş, 160. Ayakta kalan tek karar yonlendirilebilir, çünkü tek dayanağı olan konak adı zarfın dışındadır. Kaybın dağılımı düzgün değil, keskindir: bir alanı gizlemek o alana bağlı kararı azaltmaz, sıfırlar.

Fazladan tur sütunu bunun bedelini gösteriyor: 40 alışverişin kırkında da aracının alamadığı en az bir karar vardır, yani kırkında da sunucuya bir tur daha atılır. Aracının kaybettiği görünürlük, doğrudan bir tur borcuna dönüşüyor.

Bayt sütunu ise ilk bakışta ters görünür: 3524’ten 920’ye iner. Aracı için ileti küçüldü, çünkü aracının okuyabildiği alanlar küçüldü. Gerçek ileti küçülmedi; yalnız aracının tarafındaki payı küçüldü. Bu, kursun ikinci iddiasının tersten okunuşudur — orada alan eklemek karar kazandırmıyordu, burada alan gizlemek bayt kazandırıyor ama karar kaybettiriyor.

Asıl satır ise yanlış sütunudur: zarf rejiminde 0. Kalan 40 kararın hiçbiri yanlış değildir. Bunun nedeni ince değil, doğrudandır: kalan tek karar yonlendirilebilir ve o karar yalnız konak adına bakar; konak adı zarfın dışında kaldığı için de her zaman doğrudur. Açık rejimdeki 5 yanlış karar, aracının bildirime inandığı yerlerden geliyordu — sunucunun koymayı unuttuğu bir im ve doğrulayıcının kaçırdığı bir değişim. Aracı okuyamadığı bir alana inanamaz.

Buradan çıkan cümle kursun üçüncü iddiasıdır ve bir kusur tarifi değildir: az karar, ama yanlışsız. Zarf rejimi, aracının 200 karardan 40’ını almasına izin verir; karşılığında aracının yanılma yüzeyini sıfıra indirir. Hangisinin tercih edileceği bir ölçüm sorusu değil, bir tasarım kararıdır.

Kalan Yüzey ve Daraltmaları

Zarf bir kayıt biçimidir: uygulama iletisi parçalara ayrılır, her parça uzunluğuyla birlikte sarılır ve öyle taşınır. Bu, aracının gördüğü şeyin sınırını çizer. Aracı kayıtların sınırlarını ve uzunluklarını görür — çünkü kayıt sınırını görmeden iletiyi ileri taşıyamaz — ama kaydın içindekini görmez. Karar tablosundaki 160’ın sıfırlanması bu ayrımın sonucudur: aracının elinde kalan şey iletinin kabıdır, içeriği değil.

Zarf her şeyi kapatmaz. Aracının hâlâ gördükleri ve her birinin daraltması:

  • Konak adı. Kurulumun ilk iletisinde, henüz ortak sır yokken bildirilir; ölçümde yonlendirilebilir kararının tek dayanağı budur. Daraltma: adın da kurulumun korunan bölümüne alındığı düzenekler vardır; o durumda tablonun son satırı da alınamayana geçer ve aracı yönlendirme kararını da kaybeder.
  • Sertifika zinciri. Tam kurulumda zincir açıkta sunulur ve konunun adını taşır. Daraltma: sürdürülen oturumlarda zincir hiç sunulmaz; bağlantı sayısı azaldıkça bu yüzey de küçülür.
  • İleti uzunluğu ve zamanlama. Zarf gövdeyi kapatır, uzunluğunu ve varış anını kapatmaz. Daraltma: dolgu ve birleştirme, uzunluğu bir bandın içine iter.

Bir aracının 160 kararı geri kazanmasının tek bir yolu vardır ve bu bir açık değil, bir yerleştirme kararıdır: aracı zarfı kendisi sonlandırır. O zaman iki ayrı kurulum olur — istemciyle aracı arasında bir tane, aracıyla sunucu arasında bir tane — ve aracı ortada açık rejime döner, tablonun ilk satırındaki 200 kararı yeniden alır. Bedeli tablodan okunmaz ama tanımdan okunur: uçlar artık birbiriyle değil, ikisi de aracıyla kurulum yapmaktadır ve istemcinin doğruladığı zincir sunucunun değil aracının zinciridir. Daraltma: böyle bir aracının çıpası istemciye ayrıca yerleştirilmek zorundadır; yerleştirilmediği sürece zincir doğrulaması düşer ve karar kaybı olduğu yerde kalır.

Bir de sık karşılaşılan yapılandırma kusuru vardır: kurulumu yapıp sertifika zincirini doğrulamadan geçmek. Kazanç yereldir ve önceki dersin ölçümünde sayıldı — hiçbir tur kazandırmaz. Ödenen şey, zarfın koruduğu bağın kiminle kurulduğunun bilinmemesidir. Bu dersin söylediği neyin yanlış olduğudur; bunun nasıl yapılacağı yazılmaz.

Özet

  • El sıkışma takım seçimini, anahtar paylarının değişimini, sertifika zincirinin sunulmasını ve karşılıklı bitirmeyi tek bir kurulumda toplar; zincir ilk yanıtla geldiği için doğrulaması ayrı tur istemez.
  • Takım pazarlığı henüz korunmayan bir kanalda yapılır; bitirme iletisi el sıkışmanın tamamının özeti üzerinde durduğu için pazarlığı uçlar denetler, aracı değil.
  • Kurulumun bütçesi alışverişe değil bağlantıya yazılır: 40 bağlantıda sürdürmesiz 80 tur, sürdürmeli 41 tur; tek kalıcı bağlantıda 2 tur.
  • Oturum sürdürme 40 bağlantılık rejimde 39 tur kazandırır ve zincir doğrulamasını yinelemez; tek bağlantıda kazancı sıfırdır.
  • Zarf kapandığında 200 kararın 160’ı aracıdan uçlara taşınır, 40 alışverişin kırkında da bir tur borcu doğar ve aracının okuduğu bayt 3524’ten 920’ye iner.
  • Kalan 40 kararın hiçbiri yanlış değildir; açık rejimdeki 5 yanlış karar aracının bildirime inandığı yerlerden geliyordu ve aracı okuyamadığı alana inanamaz.

Sonraki Adım

Zincir doğrulaması yerel yürüdü, el sıkışma bütçesini bağlantı başına ödedi ve zarf kapandığında 160 karar uçlara taşındı. Bu tablonun içinde bir tek şey ölçülmeden kaldı: istemcinin doğruladığı zincir, doğrulandığı anda geçerliydi. Sertifikanın bir başlangıcı ve bir bitişi vardır, ikisinin arasında iptal edilebilir ve iptal belgenin içine yazılamaz. Sonraki ders sertifikanın yaşam döngüsünü ve iptalin tur bütçesine ne eklediğini sayacak: zincir sormadan doğrulanıyordu, iptal sorulmadan bilinemez.

İlerlemeni kaydetmek ve not almak için Giriş yap

Notlarım

Not almak için giriş yapmalısın.

Aramak için yazmaya başlayın.

↑↓ Esc gezin · aç · kapat