İnternet Güvenliğine Giriş
Sunucular Arası Güvenli İletişim (SSL) İçin Ne Yapabilirim?
Sunucular Arası Güvenli İletişim (SSL) İçin Ne Yapabilirim?
-
Selamlar,
Sunucuya Letsencryt ile domain ile ilişkili ücretsiz olarak SSL kurabiliyorum fakat aklıma takıldı; domain olarak tanımlı olmayan sunucular arasında SSL ile (ya da benzer varsa başka şekillerde) nasıl güvenli iletişim kanalları oluşturabilirim? Self-signed sertifikalar oluşturmak mı gerekiyor? Bunun güvenli olmadığını okumuştum. Nasıl bir yol izlememi önerirsiniz?
RockZs tarafından 04/Oca/17 20:10 tarihinde düzenlenmiştir -
sunucular arasi derken, sunucular sadece birbirleri ile mi konusacak hocam? yoksa isteyen baglanabilecek mi? iletisim HTTP protokolu ustunden mi olacak yoksa baska bir protokol mu?
bunlari cevaplarsan yardim edebilirim.
-
moi bunu yazdı
sunucular arasi derken, sunucular sadece birbirleri ile mi konusacak hocam? yoksa isteyen baglanabilecek mi? iletisim HTTP protokolu ustunden mi olacak yoksa baska bir protokol mu?
bunlari cevaplarsan yardim edebilirim.
sunucular websocket protokolü üzerinden sadece birbirleri ile konuşacaklar ama http de olur. SSL in domain olmadan en verimli şekilde nasıl kurulacağını bilemiyorum.
yani maksat sniff edilince ne konuşulduğu anlaşılmasın. bunun için aşağıdaki gibi bir native crpyto modülü ile koruma yapabiliyorum ama daha güvenli/performanslı birşey var mı, onu araştırıyorum:
var crypto = require('crypto'), algorithm = 'aes-256-ctr', password = 'tbttbttbt123123123';
-
var crypto = require('crypto'), algorithm = 'aes-256-ctr', password = 'tbttbttbt123123123';
Bu şekilde aradaki veriyi gayet güzel şifreliyorsun hocam. Anladığım kadarıyla password(key) ü iki tarafta da sen belirtiyorsun(simetrik), yani bir yandan da iki taraf da birbirlerininin kimliğinden emin oluyor. Amaç sadece şifreleme ise bundan ötesi karmaşık(bkz. kaş yapayım derken göz çıkarmak) olabilir. Tek bir şey var, 32byte lık random bir password kullansan iyi olur. Buradan sonrasıyla kendi isteğinle uğraşmakta özgürsün.
-------------------------------------------------------------------------------------------------------
Şu ana noktalar önemli;
- Hep aynı password(key) ü kullanırsan, bağlantıyı yeterince dinleyen biri, işe yarar bazı çıkarımlar yapabilir.(asimetrik şifrelemeyle her defasında farklı password kullanmak gerek)
- AES-256-CTR ile veri şifreleniyor fakat sadece bu algoritma verinin bütünlüğünden, değiştirilip değiştirilmediğinden emin olamazsın. Sadece dinlemek yerine paketlere müdahale etmeye çalışanlar da olabilir.
Bunlara çözüm de senin de dediğin gibi SSL/TLS kullanmak. Ve bu senaryoda self-signed sertifika kullanmaktan korkmana gerek yok, çünkü sadece iki sunucun arasında kullanılacak. Bağlantı bekleyecek olan sunucunda, bir sertifikayla birlikte private-public key ikilisi yaratıp, bu public key'i de diğer sunucunda tanımlarsan, sadece senin oluşturduğun private key e sahip sunucuyla konuşabilecektir. Bu son cümle biraz karışık oldu ama özetle senin private key'ine sahip olmayan sunucuyla konuşamıyor olacak.
İçime sinmedi, bir de şema üstünden anlatayım şu son paragrafı;
(Şu andaki konfigürasyonunla doğrudan 9. adımdan başlamış oluyorsun. İki tarafta da simetrik password(key) ile direk şifrelenmiş mesajlar alınıp verilmeye başlanıyor.)
Anlatmaya çalıştığım şey aslında şu, 3. adımdaki sunucu sertifikası doğrulaması bir CA(https://eksisozluk.com/certificate-authority--162613) kanalıyla yapılır. Konuştuğun sunucunun gerçekten www.abc.com veya belli bir IP olduğundan bu şekilde emin olursun. Senin bu doğrulama sırasında CA doğrulaması yerine şunu yapman gerekiyor;
1) Sunucunun sertifikasını(public key'ini) önceden istemci ile paylaşmak.
2) 3. adımdaki doğrulama esnasında sertifikayla birlikte gelen public key'in önceden belirlediğinle aynı olup olmadığını kontrol etmek.
(Bu kısım şemadan önceki karmaşık paragrafta mevcut değil) Bir de farkettiysen 5. ve 6. adımlarda istemci de kendi sertifikasını(ve tabi onun içinde public key'ini) yolluyor. Sunucu da eğer isterse istemci sertifikasını doğruluyor. Yukarıdaki iki adımı bir de istemci için yaparsan, her iki taraf da birbirlerinin kimliklerinden emin olarak konuşacaklardır ki sanırım bu senin senaryona daha uygun. Yani,
1) İstemcinin sertifikasını(public key'ini) önceden sunucu ile paylaşmak.
2) 6. adımdaki doğrulama esnasında sertifikayla birlikte gelen public key'in önceden belirlediğinle aynı olup olmadığını kontrol etmek.
Burada da detaylı bir anlatım yapmışlar nasıl kodlayacağın ile ilgili: https://www.sitepoint.com/how-to-use-ssltls-with-node-js/ . "ssl-root-cas" başlığı altında da kendi oluşturduğun self-signed sertifikaları nasıl güvenilir kılacağını anlatmış.
Dipnot: Bu yazıda ekşi sözlükten link vermek istemezdim ancak acı bir şekilde türkçe kaynaklar pek yetersiz.
Dipnot2: Şemadaki SSL server bağlantıyı bekleyen sunucun, SSL Client ise bağlantı isteği gönderen sunucun.
-
@moi bilgilendirme için çok teşekkürler hocam banada lazımdı böyle birşey
-
MhmdAlmz bunu yazdı
@moi bilgilendirme için çok teşekkürler hocam banada lazımdı böyle birşey
Rica ederim hocam, yardımcı olabildiysem ne güzel.
-
@moi, kapsamlı yanıtın için çok teşekkür ederim. aklımdaki bir çok soruya yanıt vermiş oldun.