SSL gerçekten nasıl çalışır?


143

SSL nasıl çalışır?

Sertifika istemciye (veya tarayıcıya) ve sunucuya (veya web sunucusuna) nerede yüklenir?

URL'yi tarayıcıya girip sayfayı sunucudan aldığınızda güven / şifreleme / kimlik doğrulama işlemi nasıl başlar?

HTTPS protokolü sertifikayı nasıl tanır? Tüm güven / şifreleme / kimlik doğrulaması yapan sertifikalar olduğunda HTTP neden sertifikalarla çalışamaz?


24
Bunun makul bir soru olduğunu düşünüyorum - SSL'nin nasıl çalıştığını anlamak adım 1'dir, doğru bir şekilde uygulamak adım 2 ila adım sonsuzdur.
synthesizerpatel



5
@StingyJack Burada nazi bir politika olma. İnsanlar yardım aramaya gelir. Tüm yardımları reddetmeyin çünkü sorunun kurallara tam olarak uymadığını görürsünüz.
Koray Tugay

1
@KorayTugay - kimse yardım etmiyor. Bu, daha iyi hedeflendiği Güvenlik veya Sysadmin'e aittir, ancak OP genel bir BT sorusu göndermek yerine biraz programlama bağlamı ekleyerek bu forumda genellikle fayda sağlayacaktır. Kaç kişi belirli bir programlama problemine bağlı olmadığında soruları kapatır? Muhtemelen çok fazla, bu yüzden bu ilişki kurmak için dürtü OP.
StingyJack

Yanıtlar:


144

Not: Orijinal cevabımı çok aceleyle yazdım, ancak o zamandan beri bu oldukça popüler bir soru / cevaba dönüştü, bu yüzden biraz genişlettim ve daha kesin hale getirdim.

TLS Kabiliyetleri

"SSL" bu protokole atıfta bulunmak için en sık kullanılan isimdir, ancak SSL özellikle Netscape tarafından 90'lı yılların ortalarında tasarlanan özel protokole atıfta bulunur. "TLS" SSL tabanlı bir IETF standardıdır, bu yüzden cevabımda TLS kullanacağım. Bugünlerde, web'deki güvenli bağlantılarınızın neredeyse tamamı SSL değil TLS kullanıyor olabilir.

TLS'nin çeşitli yetenekleri vardır:

  1. Uygulama katmanı verilerinizi şifreleyin. (Sizin durumunuzda, uygulama katmanı protokolü HTTP'dir.)
  2. Sunucunun istemcisinin kimliğini doğrulayın.
  3. İstemcinin sunucunun kimliğini doğrulayın.

# 1 ve # 2 çok yaygındır. # 3 daha az yaygındır. # 2 üzerinde duruyorsun, o yüzden açıklayacağım.

Kimlik Doğrulama

Bir sunucu, bir sertifika kullanarak kendini istemciye doğrular. Sertifika, bir web sitesi hakkında bilgi içeren bir veri bloğudur [1]:

  • Alan adı
  • Genel anahtar
  • Sahibi olan şirket
  • Verildiği zaman
  • Süresi dolduğunda
  • Kim yayınladı
  • Vb.

Yalnızca bu sunucuda güvenli bir şekilde saklanması gereken ilgili özel anahtarla şifresi çözülebilen iletileri şifrelemek için sertifikaya dahil edilen genel anahtarı kullanarak gizlilik elde edebilirsiniz (yukarıdaki # 1). [2] Bu anahtar çifti KP1 diyelim, böylece daha sonra kafamız karışmayacak. Ayrıca, sertifikadaki alan adının ziyaret ettiğiniz siteyle eşleştiğini de doğrulayabilirsiniz (yukarıdaki # 2).

Peki ya bir rakip sunucuya gönderilen ve sunucudan gönderilen paketleri değiştirebilirse ve bu rakip size sunulan sertifikayı değiştirip kendi genel anahtarlarını eklerse veya diğer önemli ayrıntıları değiştirirse ne olur? Eğer bu olursa, düşman güvenli bir şekilde şifrelenmiş olduğunu düşündüğünüz tüm mesajları arayabilir ve değiştirebilir.

Bu saldırıyı önlemek için, sertifika başkasının özel anahtarı tarafından imzaya karşılık gelen ortak anahtara sahip olan herkes tarafından doğrulanabilecek şekilde şifrelenerek imzalanır. Bunların sunucunun kullandığı anahtarlarla aynı olmadığını açıkça belirtmek için bu anahtar çiftine KP2 diyelim.

Sertifika Yetkilileri

Peki kim KP2'yi yarattı? Sertifikayı kim imzaladı?

Biraz basitleştiren bir sertifika yetkilisi KP2'yi oluşturur ve diğer kuruluşlar için sertifikaları imzalamak için özel anahtarlarını kullanma hizmetini satarlar. Örneğin, bir sertifika oluşturuyorum ve Verisign gibi bir şirkete özel anahtarlarıyla imzalaması için ödeme yapıyorum. [3] Verisign dışında hiç kimse bu özel anahtara erişemediğinden hiçbirimiz bu imzayı taklit edemeyiz.

Ve bu imzayı doğrulamak için kişisel olarak KP2'deki ortak anahtarı nasıl alabilirim?

Bir sertifikanın ortak bir anahtarı tutabildiğini gördük - ve bilgisayar bilimcileri özyinelemeyi seviyor - neden KP2 ortak anahtarını bir sertifikaya koyup bu şekilde dağıtmıyorsunuz? İlk başta biraz çılgınca geliyor, ama aslında tam da böyle çalışıyor. Verisign örneğiyle devam eden Verisign, kim oldukları, ne tür şeyleri imzalamalarına (diğer sertifikalar) ve genel anahtarlarına ilişkin bilgileri içeren bir sertifika üretir.

Şimdi bu Verisign sertifikasının bir kopyasına sahipsem, ziyaret etmek istediğim web sitesinin sunucu sertifikasındaki imzayı doğrulamak için bunu kullanabilirim. Kolay değil mi?!

Çok hızlı değil. Verisign sertifikasını bir yerden almak zorunda kaldım . Birisi Verisign sertifikasını taklit edip kendi ortak anahtarını oraya koyarsa ne olur? Sonra sunucunun sertifikasındaki imzayı taklit edebilirler ve başladığımız yere geri dönüyoruz: ortadaki adam saldırısı.

Sertifika Zincirleri

Yinelemeli düşünmeye devam ederek, elbette üçüncü bir sertifika ve üçüncü bir anahtar çifti (KP3) ekleyebilir ve bunu Verisign sertifikasını imzalamak için kullanabiliriz. Buna sertifika zinciri diyoruz: zincirdeki her sertifika bir sonraki sertifikayı doğrulamak için kullanılır. Umarım bu özyinelemeli yaklaşımın sadece kaplumbağalar / sertifikalar olduğunu görebilirsiniz. Nerede duruyor?

Sonsuz sayıda sertifika oluşturamadığımız için, sertifika zinciri açıkça bir yerde durmak zorundadır ve bu, zincire kendinden imzalı bir sertifika ekleyerek yapılır .

Beyninizin parçalarını kafanızdan alırken bir an dururum. Kendinden imzalı ?!

Evet, sertifika zincirinin sonunda (diğer adıyla "kök"), kendisini imzalamak için kendi anahtar çiftini kullanan bir sertifika olacaktır. Bu, sonsuz özyineleme sorununu ortadan kaldırır, ancak kimlik doğrulama sorununu çözmez. Herkes, tıpkı siyaset, teorik fizik ve popo tekmeleme uyguladığımı ve sonra kendi adımı imzaladığımı söyleyen sahte Princeton diploması oluşturabileceğim gibi, üzerinde bir şey söyleyen kendinden imzalı bir sertifika oluşturabilir.

Bu sorunun [biraz zorlayıcı] çözümü, sadece açıkça güvendiğiniz kendinden imzalı bazı sertifikaları seçmektir. Örneğin, " Bu Verisign kendinden imzalı sertifikaya güveniyorum " diyebilirim .

Bu açık güven ile artık tüm sertifika zincirini doğrulayabilirim. Zincirde kaç sertifika olursa olsun, her imzayı köküne kadar doğrulayabilirim. Köke geldiğimde, bu kök sertifikanın açıkça güvendiğim bir sertifika olup olmadığını kontrol edebilirim. Eğer öyleyse, tüm zincire güvenebilirim.

Verilen Güven

TLS'de kimlik doğrulaması, verilen güven sistemini kullanır . Eğer bir oto tamircisi kiralamak istersem, bulduğum herhangi bir rastgele tamirciye güvenmeyebilirim. Ama belki arkadaşım belirli bir tamirciye kefil olur. Arkadaşıma güvendiğim için, o tamirciye güvenebilirim.

Bir bilgisayar satın aldığınızda veya bir tarayıcı indirdiğinizde, açıkça güvendiği birkaç yüz kök sertifika ile birlikte gelir. [4] Bu sertifikalara sahip olan ve çalışan şirketler, sertifikalarını imzalayarak diğer kuruluşlara bu güveni sağlayabilirler.

Bu mükemmel bir sistem olmaktan çok uzak. Bazı durumlarda bir CA hatalı bir sertifika verebilir. Bu gibi durumlarda sertifikanın iptal edilmesi gerekebilir. Verilen sertifika her zaman kriptografik olarak doğru olacağından iptal işlemi zordur; önceden geçerli olan sertifikaların iptal edildiğini bulmak için bant dışı bir protokol gereklidir. Uygulamada, bu protokollerin bazıları çok güvenli değildir ve birçok tarayıcı zaten onları kontrol etmez.

Bazen CA'nın tamamı tehlikeye girer. Örneğin, Verisign'a girip kök imzalama anahtarını çalacak olsaydınız , dünyadaki herhangi bir sertifikayı taklit edebilirdiniz . Bunun sadece Verisign müşterilerini etkilemediğine dikkat edin: sertifikam Thawte (Verisign'ın rakibi) tarafından imzalanmış olsa bile önemli değil. Sertifikam Verisign'ın güvenliği ihlal edilmiş imzalama anahtarı kullanılarak yine de taklit edilebilir.

Bu sadece teorik değil. Vahşi doğada oldu. DigiNotar ünlü bir hacklendi ve daha sonra iflas etti. Comodo da hacklendi , ama açıklanamaz bir şekilde günümüze kadar işlerini sürdürüyorlar.

CA'lar doğrudan tehlikeye atılmasa bile bu sistemde başka tehditler de vardır. Örneğin, bir hükümet sahte bir sertifikayı imzalamak için bir CA'yı zorlamak için yasal zorlama kullanır. İşvereniniz, çalışan bilgisayarınıza kendi CA sertifikalarını yükleyebilir. Bu çeşitli durumlarda, "güvenli" olmasını beklediğiniz trafik, söz konusu sertifikayı kontrol eden kuruluş tarafından tamamen görünür / değiştirilebilir.

Yakınsama , TACK ve DANE gibi bazı değiştirmeler önerildi .

Son Notlar

[1] TLS sertifika verileri X.509 standardına göre biçimlendirilir . X.509, ASN.1'e ("Özet Sözdizimi Notasyonu # 1") dayanmaktadır ; bu, ikili veri biçimi olmadığı anlamına gelir . Bu nedenle, X.509 ikili biçime kodlanmalıdır . DER ve PEM bildiğim en yaygın iki kodlama.

[2] Pratikte, protokol aslında simetrik bir şifreye geçer, ancak bu sorunuzla ilgili olmayan bir ayrıntıdır.

[3] Tahmin edilebileceği gibi, CA aslında sertifikanızı imzalamadan önce kim olduğunuzu doğrular. Bunu yapmadılarsa, google.com için bir sertifika oluşturabilir ve bir CA'dan imzalamasını isteyebilirim. Bu sertifikayla, google.com'a herhangi bir "güvenli" bağlantıyı arayabilirim. Bu nedenle, doğrulama adımı bir CA'nın çalışmasında çok önemli bir faktördür. Ne yazık ki, bu doğrulama sürecinin dünyadaki yüzlerce CA'da ne kadar titiz olduğu açık değildir.

[4] Mozilla'nın güvenilir CA'lar listesine bakın .


Özel anahtar nedir?
Koray Tugay

ortak anahtarın, öncelikle koptuğunuz verileri şifrelemek için web sitesine gönderilen sertifika dosyasının bir parçası olduğunu belirtmeyi unutmuşsunuzdur.
mamdouh alramadan

Teşekkürler @mamdouhalramadan. Bundan bahsetmek için düzenledim.
Mark E. Haase

2
@mamdouhalramadan "genel anahtar ... verilerin şifresini çözmek için web sitesine gönderilir". Genel anahtar verilerin şifresini çözmek için nasıl kullanılabilir?
Teddy

@ateddy Doğru. Yapamaz. Ortak anahtar yalnızca kimlik doğrulama için kullanılır. Burada anahtar çiftlerinin şifreleme ve şifre çözme için kullanıldığı iddiası yanlıştır. Bunun için güvenli bir şekilde müzakere edilmiş bir oturum anahtarı kullanılır.
Lorne Marquis

53

HTTPS, istemci (tarayıcı) ve web sunucusu (uygulama burada barındırılmaktadır) arasında şifreli iletişim sağlamak için HTTP ve SSL (Güvenli Yuva Katmanı) birleşimidir .

Neden gerekli?

HTTPS, ağ üzerinden tarayıcıdan sunucuya aktarılan verileri şifreler. Böylece, iletim sırasında hiç kimse verileri koklayamaz.

Tarayıcı ve web sunucusu arasında HTTPS bağlantısı nasıl kurulur?

  1. Tarayıcı https://payment.com adresine bağlanmaya çalışır .
  2. payment.com sunucusu tarayıcıya bir sertifika gönderir. Bu sertifika, payment.com sunucusunun ortak anahtarını ve bu ortak anahtarın aslında payment.com'a ait olduğunu gösteren bazı kanıtları içerir.
  3. Tarayıcı, payment.com için uygun ortak anahtara sahip olduğunu doğrulamak için sertifikayı doğrular.
  4. Tarayıcı, payment.com sunucusuna bağlantısı için kullanmak üzere rastgele yeni bir simetrik anahtar K seçer. K'yi payment.com genel anahtarı altında şifreler.
  5. payment.com K'nin özel anahtarını kullanarak şifresini çözer. Şimdi hem tarayıcı hem de ödeme sunucusu K'yi biliyor, ancak başka kimse bilmiyor.
  6. Her zaman tarayıcı payment.com'a bir şey göndermek istiyor, K altında şifreler; payment.com sunucusu alındıktan sonra şifresini çözer. Payment.com sunucusu tarayıcınıza bir şey göndermek istediğinde, onu K altında şifreler.

Bu akış aşağıdaki diyagramla gösterilebilir: resim açıklamasını buraya girin


1
Oturum anahtarının şifrelenmesi ve gönderilmesi ve sunucuda şifresinin çözülmesi ile ilgili kısım tamamlanmış ve çöptür. Oturum anahtarı hiçbir zaman aktarılmaz: güvenli bir anahtar müzakere algoritması ile oluşturulur. Lütfen böyle saçmalıklar göndermeden önce gerçeklerinizi kontrol edin. RFC 2246.
Lorne Marquis

Tarayıcı neden verileri adım 4'te rasgele yeni bir simetrik anahtar K oluşturmak yerine sunucuya gönderirken şifrelemek için sunucunun ortak anahtarını kullanmıyor?
KevinBui

1
@KevinBui Çünkü sunucudan yanıt göndermek istemcinin anahtar çifti olmasını gerektirir ve asimetrik şifreleme çok yavaştır.
Lorne Marquis

3

Süreci kısaca tartışan küçük bir blog yazısı yazdım. Lütfen bir göz atmaktan çekinmeyin.

SSL El Sıkışma

Aynı küçük bir parçacık şöyledir:

"İstemci HTTPS üzerinden sunucuya istekte bulunur. Sunucu, SSL sertifikası + ortak anahtarının bir kopyasını gönderir. Sunucunun kimliğini yerel güvenilir CA deposuyla doğruladıktan sonra, istemci gizli oturum anahtarı oluşturur, sunucunun genelini kullanarak şifreler. Sunucu gizli oturum anahtarının özel anahtarını kullanarak şifresini çözer ve istemciye bir bildirim gönderir. Güvenli kanal kuruldu. "


"Sunucunun kimliğini yerel güvenilir CA deposuyla doğruladıktan sonra" - bu kesinlikle doğru değil. Kendinden imzalı bir sertifika kullanabilir ve HTTPS işe yarayabilir - Bir sunucuya güvenli bir HTTPS bağlantısı alabilirim . Güvenilir sertifika yalnızca doğru sunucuyla konuştuğumdan emin olmak istediğimde geliyor .
Teddy

Oturum anahtarının şifrelenmesi ve gönderilmesi ve sunucuda şifresinin çözülmesi ile ilgili kısım tamamlanmış ve çöptür. Oturum anahtarı hiçbir zaman iletilmez: güvenli bir anahtar negoatiaon algoritması ile oluşturulur. Lütfen böyle saçmalıklar göndermeden önce gerçeklerinizi kontrol edin. RFC 2246.
Lorne Marquis

@Teddy Bu doğru değil. Sertifika güven denetimi SSL'nin zorunlu bir parçasıdır. Baypas edilebilir, ancak normal olarak etkindir: kendinden imzalı sertifikalar, özel bir tür özel önlem olmadan çalışmaz.
Lorne Marquis

2

Mehaase bunu zaten ayrıntılı olarak açıkladı. Bu seriye 2 sent ekleyeceğim. SSL anlaşması ve sertifikaları etrafında dönen birçok blog yazım var. Bunların çoğu IIS web sunucusu etrafında dönerken, gönderi genel olarak SSL / TLS anlaşması ile ilgilidir. İşte referans için az:

SERTİFİKALAR ve SSL'yi tek bir konu olarak ele almayın . Onlara 2 farklı konu olarak davranın ve birlikte çalıştıklarını görmeye çalışın. Bu, soruyu cevaplamanıza yardımcı olacaktır.

Sertifika Deposu aracılığıyla iletişim kuran taraflar arasında güven oluşturulması

SSL / TLS iletişimi yalnızca güven esasına göre çalışır. İnternet'teki her bilgisayarda (istemci / sunucu) kök CA ve ara CA'ların bir listesi bulunur. Bunlar periyodik olarak güncellenir. SSL anlaşması sırasında bu, güven oluşturmak için referans olarak kullanılır. Muayene için, SSL anlaşması sırasında, istemci sunucuya bir sertifika verdiğinde. Sunucu, sertifikayı veren CA'nın CA'lar listesinde olup olmadığını almayı dener. Bunu yapamadığında, sertifika zinciri doğrulamasını yapamadığını bildirir. (Bu cevabın bir parçasıdır. Ayrıca AIA'ya da bakar) İstemci, Sunucu Hello'da aldığı sunucu sertifikası için de benzer bir doğrulama yapar. Windows'ta, PowerShell aracılığıyla istemci ve Sunucu için sertifika depolarını görebilirsiniz. Aşağıdakileri bir PowerShell konsolundan yürütün.

PS Sertifikası:> ls Konum: CurrentUser MağazaAdları: {TrustedPublisher, ClientAuthIssuer, Kök, KullanıcıDS ...}

Konum: LocalMachine MağazaAdları: {TrustedPublisher, ClientAuthIssuer, Uzak Masaüstü, Kök ...}

Firefox ve Opera gibi tarayıcılar sertifika yönetimi için temel işletim sistemine güvenmiyor. Kendi ayrı sertifika depolarını bulundururlar.

SSL anlaşması hem Simetrik hem de Ortak Anahtar Şifrelemesini kullanır. Sunucu Kimlik Doğrulaması varsayılan olarak gerçekleşir. İstemci Kimlik Doğrulaması isteğe bağlıdır ve Sunucu uç noktasının istemcinin kimliğini doğrulamak üzere yapılandırılıp yapılandırılmadığına bağlıdır. Bunu ayrıntılı olarak açıkladığım gibi blog gönderime bakın.

Sonunda bu soru için

HTTPS protokolü sertifikayı nasıl tanır? Tüm güven / şifreleme / kimlik doğrulaması yapan sertifikalar olduğunda HTTP neden sertifikalarla çalışamaz?

Sertifikalar , biçimi X.509 standardıyla tanımlanan bir dosyadır . İletişim kuran bir kişinin kimliğini kanıtlayan elektronik bir belgedir. HTTPS = HTTP + SSL , 2 tarafın birbirleriyle nasıl iletişim kurması gerektiğine dair yönergeleri tanımlayan bir protokoldür.

DAHA FAZLA BİLGİ

  • Sertifikaları anlamak için sertifikaların ne olduğunu anlamanız ve ayrıca Sertifika Yönetimi hakkında bilgi edinmeniz gerekir. Bunlar önemlidir.
  • Bu anlaşıldıktan sonra, TLS / SSL anlaşması ile devam edin. Bunun için RFC'lere başvurabilirsiniz. Ancak, kuralları tanımlayan iskelettir. Bunu ayrıntılı olarak açıklayan benim de dahil olmak üzere birçok blog yazısı var.

Yukarıdaki etkinlik yapıldıysa, Sertifikalar ve SSL hakkında adil bir anlayışa sahip olacaksınız.

Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.