TLS (Transport Layer Security - Aktarım Katmanı Güvenliği) internet üzerinden verilerin aktarılması sırasında şifrelenmesini sağlayan bir protokoldür (TLS, SSL protokolünün devamıdır. SSL’in yeni sürümleri TLS olarak isimlendirilmiştir). Ağ üzerinde, veri iletişimi sırasında, bilgilerin şifrelenerek gönderilip alınmasını sağlar. TLS kullanılmadan yapılan iletişimde, her türlü verinin transferi şifrelenmeden, çıplak bir şekilde gönderilip alınır. Böyle bir durumda eğer ağınız dinleniyorsa (bir sniffer aracılığıyla) yetkisiz kişiler önemli verilerinize erişebilir. Bu belge de TLS protokolünün nasıl çalıştığından bahsederken, TLS’i nasıl kullanacağımıza da yer vereceğiz.
Bu anahtarlar bir çift halinde var olur ve birlikte çalışırlar. Açık Anahtar (Public Key) kullanılarak şifrelenmiş bir veri yalnızca Gizli Anahtar (Private Key) kullanılarak çözülebilir. Açık anahtarınızı tüm dünyaya duyururken, gizli anahtarınızı tüm dünyadan gizlersiniz. Böylelikle biri size özel bir veri gönderirken, veriyi sizin açık anahtarınızla şifrelediğinde, gizli anahtara sahip olan yalnızca siz bu veriyi çözebilirsiniz.
Veri -> [Açık Anahtar] -> Şifrelenmiş Veri -> [Gizli Anahtar] -> Veri
Aslında bu anahtar çifti ters şekilde de çalışır. Yani eğer gizli anahtarı kullanarak bir veriyi şifrelerseniz, bunu yalnızca açık anahtarınız çözebilir. Bu sayede, karşıdaki kişi bu verinin gerçekten sizden geldiğini anlayabilir (Gizli anahtarınızı sizden başka hiç kimsenin bilmediğini hatırlayın).
Veri -> [Gizli Anahtar] -> Şifrelenmiş Veri -> [Açık Anahtar] -> Veri
Bir simetrik anahtarla şifrelenen veri, yine aynı simetrik anahtar ile çözülür. Bu yüzden simetrik anahtar başka bir kişiye ulaştırılmak isteniyorsa, o kişinin açık anahtarı ile şifrelenmelidir ki, simetrik anahtar başkaları tarafından öğrenilemesin.
Bir sertifika kim olduğunuz hakkında bilgiler içeren bir belgedir ve içerdiği bilgiler; sertifika sahibinin ismi, e-posta adresi, sertifikanın kullanım şekli, ne kadar süre ile geçerli olacağı, web site adı, bu sertifikayı imzalayanın kim olduğu, açık anahtar gibi bilgilerdir (Örneğin HTTP sunucunuzun kullanacağı bir sertifika yaratıyorsanız, bu sertifika HTTP kullanıcınızla ilgili bilgiler içerecek). Kim olduğunuz hakkında bilgiler içeren bu sertifika TLS bağlantısı sırasında, karşı tarafa kim olduğunuzu tanıtmak için gönderilir.
Sertifika imzalayan kuruluşlara denir (Örneğin Verisign bir CA’dır). Verisign gibi CA’lar imzalanan sertifikalar istemciler tarafından varsayılan olarak güvenilir kabul edilir. Eğer bir CA’ya sertifikanızı imzalatmak için para ödemek istemiyorsanız, kendi kendinizin CA’sı da olabilirsiniz. Bunun için ilk önce CA’nız için bir sertifika yaratmalısınız. Ve bu sertifika kendinden imzalı bir sertifika olmalıdır.
Karşı tarafın, sizin tarafınızdan gönderilen sertifikaya güvenebilmesi için (daha doğrusu karşı tarafın, bu sertifikanın sizden geldiğine emin olabilmesi için) sertifikanız güvenilir kök sertifika yetkilileri tarafından imzalanmış olmalıdır. Eğer bir sertifikayı geçici olarak ya da test amaçlı kullanacaksanız, bu sertifikayı güvenilir kök sertifika yetkilileri tarafından imzalanması yerine, kendi gizli anahtarınızla bu sertifikayı imzalayabilirsiniz. Bu şekilde kendi gizli anahtarı kullanılarak imzalanmış sertifikalara Kendinden İmzalı Sertifika (Self-Signed Certificate) denir.
Şimdi TLS’in nasıl çalıştığını, HTTP sunucusu ve tarayıcı arasında geçen bir örnek ile açıklayalım.
Şimdi ilk olarak gizli anahtarımızı oluşturalım:
# openssl genrsa -des3 -out private.key 1024
Bu gizli anahtarımız oluşturulurken bizden bir passphrase (password ile aynı anlama gelir. Eski UNIX’lerde password 8 karakterle sınırlı iken passphrase daha uzun password anlamında kullanılırdı.) girmemiz istenecek (Çünkü yaratılacak olan bu gizli anahtar bilgisayarımıza kaydedilirken Triple DES algoritması ile şifrelenip kaydedilecek. Böylece bu dosyamız başka birinin eline geçse bile gizli anahtarı kullanabilmesi için, passphrase i bilmesi gerekir).
Şimdi gizli anahtarımızı kullanarak, imzalanmak üzere oluşturulacak Sertifika İmzalama İsteği (Certificate Signing Request - CSR) oluşturalım:
# openssl req -new -key server.key -out server.csr
CSR oluşturulurken openssl uygulaması sizinle ilgili bir takım sorular soracak. Bu sorulardan bizim için en önemli olanı ftp adresini (örneğin ftp.magmalinux.org gibi) girdiğimiz Common Name sorusudur. Eğer bu sertifikayı bir HTTP sunucusu için yaratıyorsanız web adresinizi (www.magmalinux.org gibi) Common Name değeri olarak belirleyin.
CSR’nin bulunduğu dosya olan server.csr’yi VeriSign, GlobalSign gibi CA firmalarına belli bir ücret karşılığında imzalattırmamız gerekiyor. server.csr dosyamızı seçtiğimiz bir CA’ya gönderdikten sonra, bize gönderdikleri sertifika dosyasını (genellikle .crt uzantılı olur ama uzantının pek bir önemi yok). Bir diğer seçeneğimiz ise, kendi kendimizin CA’sı olmak ve kendi CSR’lerimizi kendimiz imzalamaktır.
Bu bölümde kendi CA’mızı oluşturup, kendi sertifikalarımızı kendimiz imzalayacağız. Eğer CA firmalarına imzallattığınız bir sertifikanız varsa bu bölümü atlayabilirsiniz.
İlk olarak CA’mız için bir gizli anahtar oluşturalım:
# openssl genrsa -des3 -out ca.key 1024
Bu aşamada bize ca.key dosyamız için bir passphrase sorulacak. Bu passphrase sayesinde, oluşturulacak bu gizli anahtar şifrelenmiş bir şekilde diskimize kaydedilecek.
Sırada CA’mız için kendinden imzalı bir sertifikaya ihtiyacımız var (Dikkat edin, bu sefer bir Sertifika İmzalama İsteği yerine kendi CA sertifikamızı CA’mızın gizli anahtarı ile imzalıyoruz). Aşağıdaki komut ile kendinden imzalı 365 gün boyunca geçerli bir sertifika oluşturuyoruz.
# openssl req -new -x509 -days 365 -key ca.key -out ca.crt
Artık kendi CA’mızın gizli anahtarı ve sertifikası hazır. Şimdi bunları kullanarak bir önceki bölümde oluşturduğumuz Sertifika İmzalama İsteği’ni (server.csr dosyasını) imzalayalım (komutun ilk satırının sonundaki \ işareti komutun bir alt satırdan devam ettiğini belirtir):
# openssl x509 -req -in server.csr -out server.crt -sha1 -CA ca.crt \ -CAkey ca.key -CAcreateserial -days 365