Çanakkale Onsekiz Mart Üniversitesi’nden Necdet Yücel Hocanın yazılarını RSS okuyucuma ekledim ve düzenli olarak okuyorum. Mayıs ayı başında HTTPS Nasıl çalışıyor adlı açık, anlaşılıyor bir yazı yazmıştı. Kendisinin de izni ile yazısını sizle paylaşmak istedim.
Kaynak: http://www.nyucel.com/2017/05/https-nasl-calsyor.html
HTTPS nasıl çalışıyor?
HTTPS kullandığımızda internet trafiğimizin şifrelendiğini biliyoruz. Gizlilik, mahremiyet gibi bizim için çok önemli olan konularda güvendiğimiz bu protokolün nasıl çalıştığını kısaca açıklamak istiyorum.
Aslında HTTPS standart HTTP protokolünün TLS şifrelemesi ile kaplanması anlamına geliyor. Gönderip aldığınız veriyi araya giren birinin anlam çıkaramayacağı şekilde şifrelediği için değiştirilmesinin de önüne geçer. Bu sayede HTTPS kullanarak gönderdiğimiz kullanıcı adı ve parolamız, kredi kartı bilgilerimiz ve hatta ulaştığımız sayfanın adresi (https://en.wikipedia.org/wiki/HTTPS gibi) trafiğimizi dinleyenlerce görülemez. HTTPS ile temelde iki ana hedef gerçekleştirilir:
- Ulaştığımız adresin gerçekte ulaşmaya çalıştığımız adres olduğundan emin olunması,
- Sunucu ve istemci arasındaki trafiğin sadece bu iki taraf tarafından çözümlenebilecek şekilde şifrelenmesi.
Bu hedeflere ulaşabilmek için ilk yapılacak şey TLS bağlantısının kurulmasıdır. HTTP için kullandığımız istemci (çoğu durumda tarayıcımız) TLS bağlantısının kurulması için de aracılık eder. Taraflar aralarında aşağıdaki gibi anlaşırlar:
- İstemci sunucuya bir “client hello” mesajı gönderir. Bu mesajda istemcinin desteklediği protokolün sürümü ve tercih ettiği kriptografik algoritmaların listesi bulunur.
- İlk mesajı alan sunucu istemciye bir “server hello” mesajı gönderir. Bu mesajda ise istemciden aldığı listeden seçilen kriptografik algoritma ve oturum ID’si bulunur. Sunucu ayrıca sayısal sertifikasını da gönderir. Sunucunun istemciyi doğrulaması gereken durumlarda bir de “client certificate request” mesajı gönderilir ama biz bunun gerekmediğini varsayacağız.
- Bu aşamadan sonrasına devam edilebilmesi için istemcinin sunucu sertifikasını onaylaması gerekir. Bir sunucu sertifikası aşağıdaki bilgileri içerir:
- Sertifikanın sahibi,
- Sertifikanın geçerli olduğu alan veya makine adı,
- Sunucunun açık anahtarı,
- Sertifikanın geçerli olduğu tarih aralığı,
- Sertifikanın sayısal imzası.
- Bu sertifika eğer istemcinin güvendiği bir Sertifika Otoritesi (CA) tarafından üretilmişse veya bu aşamada istemci sertifikayı güvenli bulursa sertifikanın onaylanması adımı geçilmiş olur. Aksi durumda iletişime devam edilmez. Tarayıcılarımızın bizi “bağlantı güvenli değil” diyerek uyardığı sayfaları gördüğümüz nokta burası oluyor.
- Henüz sunucu ve istemci arasında yapılmasını planladığımız trafiğin başlamadığını unutmadan devam edelim. Bulunduğumuz durumda istemci sunucudan aldığı sertifikaya güvenebileceğini doğruladı ama sunucunun bu sertifikanın gerçek sahibi olduğunu henüz doğrulamış değil. Sunucu bu sertifikayı kendisiyle iletişime geçen herkese gönderdiği için bu sertifikayı ele geçişmiş herhangi bir taraf bizi yanıltıyor olabileceğinden bunu da doğrulaması gerekiyor. Bunun doğrulaması da sertifika içinde bulunan sunucunun açık anahtarıyla gerçekleştiriliyor. İstemci bu açık anahtarı kullanarak sunucuya bir veri gönderdiğinde ancak sunucu o açık anahtarla ilişkili gizli anahtara sahipse veriyi deşifreleyebilecektir.
- Artık istemci ve sunucu bu açık anahtarı ve bir anahtar değişim algoritmasını kullanarak oturum boyunca verileri şifreli gönderip almak için bir ortak anahtar oluşturabilirler (bunun nasıl yapıldığı kendi başına açıklanabilecek kadar güzel bir konu).
- Simetrik şifrelemede kullanılacak anahtar oluşturulduktan sonra istemci sunucuya bir “finished” mesajını bu anahtarla şifreleyerek gönderir. Bu noktadan sonra taraflar aralarında simetrik şifreleme algoritmalarından birini kullanırlar.
- Mesajı alan sunucu da aynı anahtarla şifreleyerek “finished” mesajını istemciye iletir. Böylece her iki taraf da şifrelemede kullanacakları bir ortak anahtar üzerinde anlaşmış ve birbirlerini doğrulamış olurlar.
Bu kadar uğraşının sonunda hala istemci sunucuya bir http get isteği bile göndermiş değil. Sadece istemci ve sunucu arasında güvenli bir tünel oluşturuldu. Bu aşamadan sonra taraflar arasındaki iletişim standart HTTP’de olduğu gibi yapılacaktır ama arada gidip gelen bütün veri şifrelendiği için HTTP’de olduğu gibi üçüncü taraflara değil verinin görünmesi, ulaştığımız adresin bile görünmesi mümkün olmayacaktır.