OPENSSL İLE SSL KURULUMU - UBUNTU SERVER 14.04, 15.04, 16.04 Bu yazımda OpenSSL kullanarak Ubuntu Server'a nasıl SSL kurulabileceğine değineceğim. Kuruluma geçmeden önce SSL nedir, nasıl çalışır, biraz ona değineceğim. SSL Taşıma Katmanı Güvenliği (TLS) ve onun öncülü/selefi olan Güvenli Soket Katmanı (SSL), bilgisayar ağı üzerinden güvenli haberleşmeyi sağlamak için tasarlanmış kriptolama protokolleridir. X.509 sertifikalarını kullanırlar ve bundan dolayı karşı tarafla iletişime geçeceklerin kimlik doğrulaması asimetrik şifreleme ile yapılır ve bir simetrik anahtar üzerinde anlaşılır. Bu oturum anahtarı daha sonra taraflar arasındaki veri akışını şifrelemek için kullanılır. Bu, mesaj/veri gizliliğine ve mesaj kimlik doğrulama kodları için mesaj bütünlüğüne izin verir. Protokollerin birçok versiyonu ağ tarama, elektronik mail, İnternet üzerinden faks, anlık mesajlaşma ve İnternet üzerinden sesli iletişim gibi uygulamalarda yaygın olarak kullanılmaktadır. Bu durumda/içerikte/bağlamda en önemli özellik iletme gizliliğidir. Bundan dolayı kısa süreli oturum anahtarı, uzun süreli gizli simetrik anahtardan türetilmemelidir. Netscape tarafından 1994 yılında geliştirilen Secure Sockets Layer (Güvenli Soket Katmanı) protokolü, internet üzerinden güvenli veri iletişimi sağlayan bir protokoldür. SSL 2.0 1995 yılında ve SSL'in günümüzde kullanılan versiyonu olan SSL 3.0 da 1996 yılında RFC 6101 koduyla piyasaya sürülmüştür. Daha sonra IETF ( İnternet Mühendisliği Görev Gücü), SSL'in bir standart haline gelebilmesi için bir girişimde bulundu ve SSL 3.0'ı temel alan yeni bir protokol üzerinde çalışmaya başladı. IETF, Ocak 1999'da bu yeni protokolü TLS 1.0 (Transport Layer Security) adıyla ve RFC 2246 koduyla piyasaya sürdü. TLS 1.1 Nisan 2006'da RFC 4346 koduyla, TLS 1.2 Ağustos 2008'de RFC 5246 koduyla yayınlanmıştır. Mart 2015 itibarıyla TSL 1.3 taslak halindedir. Henüz yayınlanmamıştır. Yerini yavaş yavaş TLS 1.3'e bırakmış olsa da SSL 3.0 günümüzde tüm internet tarayıcıları tarafından desteklenmektedir. İnternet tarayıcıların herhangi bir yerinde görülen asma kilit resmi, o siteye yapılan bağlantının SSL/TLS ile şifreli bir şekilde yapıldığını göstermektedir. Bazı tarayıcılarda bu asma kilit ikonuna tıklanarak SSL sertifikasının kimden alındığı, sitenin açık anahtar değeri, geçerlilik süresi, özet algoritması ve versiyon bilgisi gibi bilgiler görüntülenebilir. SSL/TLS Çalışma Prensibi İstemci ve sunucu TLS protokolü kullanmayı kararlaştırdıktan sonra, el sıkışma süreci kullanarak kararlı bir bağlantı kurarlar. Bu el sıkışma esnasında, istemci ve sunucu bağlantının güvenliğini sağlamak için çeşitli parametreler kullanmayı kararlaştırır:
1 2 3 4 5 6 7 8 9 İstemci kendi SSL sürüm numarasını, şifre ayarlarını, oturuma özgü veriyi, ve sunucunun istemciyle iletişime geçmek için ihtiyaç duyduğu diğer bilgileri sunucuya gönderir. Sunucu kendi SSL sürüm numarasını, şifre ayarlarını, oturuma özgü veriyi, ve istemcinin sunucuyla iletişime geçmek için ihtiyaç duyduğu diğer bilgileri istemciye gönderir. Sunucu aynı zamanda kendi sertifikasını da istemciye gönderir. Eğer istemci sunucunun kimlik doğrulama gerektiren bir kaynağına ulaşmak isterse, sunucu istemcinin sertifikasını talep eder. İstemci sunucunun gönderdiği bilgileri kullanarak sunucuyu doğrular. Eğer sunucu doğrulanmazsa, kullanıcı hata uyarısı alır, şifrelemenin ve doğrulamanın sağlanamadığı hakkında bilgilendirilir. Eğer sunucu doğrulama başarılı olursa, istemci bir sonraki adıma geçer. İstemci oturum için bir ikincil paylaşılan gizli veri (sunucu işbirliğiyle ve şifreleme algoritmasına göre değişen) oluşturur, bunu sunucunun açık anahtarını kullanarak şifreler (2. adımda sunucunun sertifikasını elde etmişti) ve bu şifrelenmiş ikincil paylaşılan gizli veriyi sunucuya gönderir. Eğer sunucu istemciden kimlik kanıtlaması isterse (el sıkışmada isteğe bağlı bir adımdır) istemci aynı zamanda yeni bir veri imzalar. Bu veri el sıkışma için eşsiz olmalı ve hem istemci hem de sunucu tarafından bilinmeli. Bu durumda, istemci imzalanmış veriyi, kendi sertifikasını, şifrelenmiş ikincil paylaşılan gizli verinin yanında istemciye yollar. Eğer sunucu istemciden kimlik kanıtlamasını istediyse, sunucu istemciyi doğrulamayı dener. Eğer istemci doğrulanmazsa, oturum sonra erer. Eğer istemci başarıyla doğrulanırsa, sunucu kendi gizli anahtarını kullanarak ikincil paylaşılan gizli veriyi deşifreler, ve daha sonra bir dizi adımlar takip ederek esas paylaşılan gizli veriyi oluşturur (istemci de ikincil paylaşılan gizli veriden başlayarak aynı adımları izler). İstemci ve sunucu elde ettikleri esas paylaşılan gizli veriyi kullanarak oturum anahtarları oluşturur, ki bu anahtarlar simetrik olup SSL oturumu boyunca şifreleme ve deşifreleme bilgilerinin değişiminde ve verilerin bütünlüğünün kontrol edilmesinde kullanılır (bu da, SSL bağlantı süresi boyunca verinin gönderilme saati ile alınma saati arasında herhangi bir değişikliğin olup olmadığı saptanarak yapılır). İstemci sunucuya bundan sonra kendisinden gelecek mesajların oturum anahtarıyla şifreleneceği bilgisini içeren bir mesaj gönderir. Ardından istemci farklı bir (şifrelenmiş) mesaj göndererek el sıkışmanın kendisine ait kısmının bittiğini belirtir. Sunucu istemciye bundan sonra kendisinden gelecek mesajların oturum anahtarıyla şifreleneceği bilgisini içeren bir mesaj gönderir. Ardından sunucu farklı bir (şifrelenmiş) mesaj göndererek el sıkışmanın kendisine ait kısmının bittiğini belirtir. SSL el sıkışması artık sonra ermiş ve oturum açılmıştır. İstemci ve sunucu birbirlerine gönderdikleri verileri şifrelemek, deşifrelemek ve bütünlüğünü tasdik etmek için oturum anahtarlarını kullanırlar. Bu güvenli kanalın normal işleyiş durumudur. Herhangi bir zamanda içeriden veya dışarıdan bir uyarı alınırsa, taraflardan biri bağlantının yeniden kurulmasını talep edebilir ve böylece süreç kendisini tekrarlar.
Eğer yukarıdaki adımlardan birisi başarısız olursa, TLS el sıkışması başarısız olur ve bağlantı oluşturulamaz. OpenSSL OpenSSL, SSL ve TLS protokollerinin açık kaynak kodlu uygulamasıdır. C programlama dili ile yazılmış ana kütüphane temel kriptografik fonksiyonları uygular. OpenSSL'i farklı programlama dilleriyle kullanabilmek için geliştirilmiş ara yazılımlar da bulunmaktadır. Yazılımın 1.0.1 sayılı kararlı sürümü 15 Ekim 2014'te yayımlanmıştır. OpenSSL Kurulumu SSL/TLS ve çalışma prensibi ile OpenSSL hakkında temel bilgi edindikten sonra OpenSSL'in kurulumuna başlayabiliriz. OpenSSL'i Ubuntu Server 16.04'e kurmak üzere işlemlere geçebiliriz. Öncelikle sunucumuzun IP adresini öğrenmek için komut satırına "ifconfig" yazıyoruz. IP adresim yani sunucumun adresi 192.168.11.164. OpenSSL'i yüklemeden önce taraycıdan sunucumu kontrol ediyorum. Tarayıcıda da görüldüğü gibi henüz SSL ile güvenliğin sağlanmadığı görülüyor. Kurulum için öncelikle sunucumuzu "sudo apt-get update" komutu ile güncelliyoruz.
Ardından "sudo apt-get install apache2" komutu ile Apache2 sunucusunu yüklüyoruz. Yüklü ise güncelliyoruz. Aslında SSL desteği Ubuntu 14.04, 15.04, 16.04 Apache paketinde standart olarak gelir. Ancak sistemimizde SSL'den yararlanabilmek için SSL modülünü aktif ediyoruz. Aktif etmek için "sudo a2enmod ssl"komutunu terminale yazıyoruz. SSL modu etkinleştirildikten sonra, değişikliğin gerçekleşmesi için web sunucusunu (apache2) "sudo service apache2 restart" komutu ile yeniden başlatıyoruz. Sertifika dosyalarını yerleştirmek üzere Apache yapılandırma hiyerarşisinde alt bir dizin oluşturuyoruz. Bunu gerçekleştirmek için terminale "sudo mkdir /etc/apache2/ssl" yazıyoruz.
Alt dizinimizi oluşturduktan sonra sertifikayı oluşturma aşamasına geçebiliriz. Sertifika oluşturmak için "sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/apache2/ssl/apache.key -out /etc/apache2/ssl/apache.crt" komutunu kullanacağız. Terminale yazmadan önce parametrelerin ne anlama geldiğine ve ne işe yaradıklarına göz atalım. openssl req Sertifikaları, anahtarları, imzalama isteklerini, oluşturmak ve yönetmek için OpenSSL tarafından sağlanan temel bir komut satırı aracıdır. X.509 sertifika imzalama isteği (CSR) yönetimi için bir alt komutunu belirtir. -x509 Bir sertifika isteği üreten, kendinden imzalı sertifika dosyası yapmak istediğimizi belirtir. -days -newkey rsa:2048 -keyout -out Sertifaka için gün cinsinden bir geçerlilik süresi belirtir. Şifreleme için bit uzunluğunu belirtir. Sertifika isteği ve aynı zamanda yeni bir özel anahtar oluşturur. 2048 bit uzunluğunda bir RSA anahtarı oluşturmak için kullanılır. Private key dosyasının nereye kaydedileceğini belirtmek için kullanılan bir parametredir. Üretilen sertifikanın çıktı dosyasının belirtilmesi için kullanılan bir parametredir. Şimdi komutumuzu terminale yazabiliriz. Openssl komutunu girdikten sonra sertifika ile ilgili birkaç bilgi girmemizi istiyor. Adım adım oradaki bilgileri kendi bilgileriniz ile dolduruyorsunuz. Ben örnek olması açısından yukarıdaki gibi çeşitli bilgiler yazdım.
Country Name (2 letter code) [AU] : Ülke Kodunuz State or Province Name (full name) [Some-State] : Şehriniz Locality Name (eg, city) [] : İlçeniz Organization Name (eg, company) [Internet Widgits Pty Ltd] : Şirketiniz Organizational Unit Name (eg, section) [] : Birim, Bölüm Common Name (e.g. server FQDN or YOUR name) [] : domaininiz.com Email Address [] : epostaadresiniz@domaininiz.com Bu oluşturduğumuz anahtar ve sertifika, /etc/apache2/ssl dizinine yerleştirilir. Bu bilgileri kendinize göre doldurduktan sonra Apache web sunucumuzu da yapılandırmamız gerekiyor. Bu işlemi yaparken /etc/apache2/sites-available/default-ssl.conf dosyasındaki default bilgileri değiştireceğiz. İlk başta default bilgileri görelim. Terminal üzerinde görüntülüyebilmek için root olarak "sudo vim /etc/apache2/sitesavailable/default-ssl.conf" dosyasını açıyoruz. <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin webmaster@localhost DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/ssl/certs/ssl-cert-snakeoil.pem SSLCertificateKeyFile /etc/ssl/private/ssl-cert-snakeoil.key <FilesMatch "\.(cgi shtml phtml php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
Kırmızı olarak işaretlediğim kısımları aşağıdaki gibi düzenliyoruz. Vim editöründe ekleme moduna geçebilmek için insert moduna "i" tuşuna tıklayarak geçiyoruz. Eklemeleri yaptıktan sonra kaydedip çıkmak için Esc tuşuna basıyoruz ve :wq yazıyoruz. <IfModule mod_ssl.c> <VirtualHost _default_:443> ServerAdmin admin@example.com ServerName domaininiz.com ServerAlias www.domaininiz.com DocumentRoot /var/www/html ErrorLog ${APACHE_LOG_DIR}/error.log CustomLog ${APACHE_LOG_DIR}/access.log combined SSLEngine on SSLCertificateFile /etc/apache2/ssl/apache.crt SSLCertificateKeyFile /etc/apache2/ssl/apache.key <FilesMatch "\.(cgi shtml phtml php)$"> SSLOptions +StdEnvVars </FilesMatch> <Directory /usr/lib/cgi-bin> SSLOptions +StdEnvVars </Directory> BrowserMatch "MSIE [2-6]" \ nokeepalive ssl-unclean-shutdown \ downgrade-1.0 force-response-1.0 BrowserMatch "MSIE [17-9]" ssl-unclean-shutdown </VirtualHost> </IfModule>
SSL sanal hostunu aktif edebilmek için terminale "sudo a2ensite default-ssl.conf" yazıyoruz. Ve ardından Apache web sunucumuzu "sudo service apache2 restart" ile yeniden başlatıyoruz. Bütün ayarlarımızı böylelikle tamamlamış oluyoruz. Yaptığımız tüm işlemlerin sorunsuz bir şekilde yapılıp yapılmadığını öğrenebilmek için tarayıcımızı açıyoruz ve https://192.168.11.164 adresine giriyoruz.
Yukarıda da görüldüğü gibi işlemlerimizi sorunsuz bir şekilde tamamlamış oluyoruz. Sertifikamızı Sertifika Otoritesi tarafından doğrulatmadığımız için yukarıdaki gibi bir uyarı ile karşılaştık. Bu uyarıyı geçmek ve sertifika ayrıntılarını görebilmek için aşağıdaki işlemleri uyguluyoruz. (Gelişmiş>Ayrıcalık Tanı>Güvenlik Ayrıcalığını Doğrula) Ayrıcalık tanıdıktan sonra sertifika bilgilerini görüntülemek için sol üst köşedeki, adres çubuğunun başındaki https simgesine tıklayarak sertifika hakkında ayrıntılı bilgiyi görüntüleyebiliriz.
Yukarıdaki bilgiler içerisinde o sayfanın biz açmadan önce şifrelendiği bilgisini bulabiliriz. Buna ek olarak cipher suite bilgisi de ayrıca görüntülenmektedir. Daha ayrıntılı bilgiler görebilmek için Sertifikayı Göster'e tıklayabiliriz.
Böylelikle OpenSSL yardımıyla SSL oluşturmuş olduk. Kaynak : https://tr.wikipedia.org/wiki/openssl Kaynak : https://tr.wikipedia.org/wiki/transport_layer_security Tolga AKKAPULU www.tolgaakkapulu.com www.blog.tolgaakkapulu.com https://tr.linkedin.com/in/tolga-akkapulu-518054105