SSL'i Olmayan Site
Önem derecesiKritik
enRead this article in Englishİnternet’in ilk zamanlarında HTTP protokolü yoğunlukla kullanılmaktaydı. HTTP protokolünde sunucu ile istemci arasındaki tüm veri ağ üzerinde okunabilir şekilde iletilir. Günümüzde ise HTTP protokolü talepleri HTTPS protokolüne yönlendirmek için kullanılmaktadır. HTTP protokolü ile iletilen tüm veri yerel kolluk kuvvetleri, saldırganlar ya da İnetnet omurgasını kontrol eden telkolar tarafından takip edilebilir.
Çözüm
Sunucunun 443 portunda SSL/TLS servisi aktive edilmelidir. Daha sonra tarayıcılar tarafından desteklenen bir SSL Sertifikası satın alarak, bu sertifikanın sunucuya yüklenmesi gerekir. SSL sertifikası en az iki parçadan oluşmaktadır, bu parçalardan birisi özel anahtar (private key) ve diğeri de sunucu sertifikasıdır. Tarayıcılar tarafından doğrudan tanınmayan bazı sertifikalar yanlarında zincir adı verilen ek dosyalar içerebilir. Web tarayıcıları sunucu ile iletişime geçtiğinde, her iki tarafın da kullanabileceği bir şifreleme algoritması tayin edilir. Bu algoritma üzerinden sunucu alan adına tahsis edilmiş olan sertifikayı tarayıcıya iletir. Tarayıcı sunucuya göndereceği bilgiyi bu sertifika ile şifreler. Alan adı sertifikası ile şifrelenen veri, ancak ve ancak sunucuda bulunan özel anahtar ile çözülebilir. Bu nedenle özel anahtarın azami güvenlikli şekilde korunması gerekir. Öyle ki, çok yüksek güvenlik gerektiren sistemlerde HSM (Hardware Security Module) adı verilen özel sunucular kulllanılır. Bu sunucular fiziksel, kimyasal ve yazılımsal olarak korumalar içerir, açılmaya çalışıldığında ise içerisindeki bilgileri silecek şekilde tasarlanmışlardır.
SSL Sertifikası Edinin
SSL sertifikası üretimi kendi sunucunuzdaki OpenSSL yazılımıyla dahi yapılabilecek kolay bir rutindir, fakat alan adlarını korumak için kullanılan SSL sertifikalarının doğruluğunun kontrol edilebilmesi için tarayıcılar tarafından onaylanmış SSL üreticilerinden ve onların bayilerinden SSL temin edilmelidir. Doğruluğu kontrol edilemeyen SSL sertifikalarının yüklü olduğu sitelerde tarayıcılar uyarı verecektir.

Sertifikalar güvenlik özelliklerinden ziyade önerdikleri sigorta bedeline göre fiyatlandırılırlar, örneğin Lets Encrypt ücretsiz bir SSL sertifikasıyken, yıllık maliyeti bin dolar üzerinde olan sertifikalar da bulunmaktadır. SSL Sertifika türleri ise şu şekildedir:
- Extended Validation (EV SSL): SSL üreticisi alan adı sahipliğini belgelerle doğrular, tarayıcılarda site URL’si yeşil renkte gözükür. Yüksek sigorta değerine sahiptir.
- Organizasyon Onaylı SSL (OV SSL): Yüksek sigorta değerine sahiptir, aynı şekilde organizasyon SSL üreticisi tarafından doğrulanır.
- Domain Validated SSL (DV SSL): En çok kullanılan SSL tipidir, alan adı sahipliği doğrulaması e-posta ya da benzer metodlarla yapılır, alan adı doğrulanırken, sahipliği doğrulanmaz.
- Wildcard SSL Sertifikası: Aynı alan adına ait birden çok alt alan adını destekleyecek şekilde çalışan SSL tipidir, *.alanadı.uzantı şeklinde nitelendirilirler.
- Multi-Domain SSL (MDC): Birden çok alan adını destekleyen SSL tipidir, örneğin hem .com hem de .com.tr alan adınız varsa bu sertifikayı tercih edebilirsiniz.
- Unified Communications SSL (UC SSL): Çoğunlukla Exchange gibi e-posta sunucularını korumak için tasarlanmış SSL sertifikalarıdır.
SSL Sertifikası için üreticiye başvurduğunuzda, üretici sizden Certificate Siging Request (CSR) adında bir dosya isteyecektir. Bu dosyayı oluşturmak için Linux sunucularda OpenSSL kütüphanesine ihtiyacınız olacaktır:
RedHat ve türevlerinde
yum install openssl # ya da dnf install openssl
Debian ve türevlerinde
apt-get install openssl
ile yükleme yaptıktan sonra /etc/pki/tls altında sertifika için bir dizin oluşturun:
mkdir /etc/pki/tls/alanadi.com/
cd /etc/pki/tls/alanadi.com/
Anahtar ikilisini oluşturun
[root@localhost alanadi.com]# openssl req -new -newkey rsa:2048 -nodes -keyout alanadi.key -out alanadi.csr
Generating a 2048 bit RSA private key
..............+++
..........................................................................+++
writing new private key to 'alanadi.key'
-----
You are about to be asked to enter information that will be incorporated
into your certificate request.
What you are about to enter is what is called a Distinguished Name or a DN.
There are quite a few fields but you can leave some blank
For some fields there will be a default value,
If you enter '.', the field will be left blank.
-----
Country Name (2 letter code) [XX]:TR
State or Province Name (full name) []:Ankara
Locality Name (eg, city) [Default City]:CoZone
Organization Name (eg, company) [Default Company Ltd]:Onlayer A.S.
Organizational Unit Name (eg, section) []:Web
Common Name (eg, your name or your server's hostname) []:alanadi.com
Email Address []:[email protected]
Please enter the following 'extra' attributes
to be sent with your certificate request
A challenge password []:
An optional company name []:
A challenge password kısmını boş bırakabilirsiniz, eğer buraya şifre yazarsanız web sunucusunu her yeniden başlattığınızda buraya yazdığınız şifreyi konsol üzerinden girmek zorunda kalırsınız. İşlem tamamlandığında iki adet dosyayı dizin içerisinde göreceksiniz. csr uzantılı dosyayı SSL üreticisine iletin, key uzantılı dosyayı mutlaka yedekleyin, bu dosyayı kaybederseniz sertifikanızı revoke etmek (yeniden ürettirmek) zorunda kalırsınız. Bu işlem çoğu zaman ücretsiz olsa bile zahmetlidir.
Windows Sunucularda
Windows sunucularda pencereye basıp mmc.exe’yi aratın, açıldığı zaman CTRL+M tuşlarına basın.

Açılan pencereden IIS (Internet Information Service) seçin ve ekleyi tıklayın. Web sunucusunun ismi üzerine bir defa tıklayın, sağ tarafta açılan sayfada “Server Certificates” ya da “Sunucu Sertifikaları” ikonuna çift tıklayın.

Sağ tarafta açılan Actions/Eylemler sayfasında “Create Certificate Request/Sertifika İsteği Oluştur” linkini tıklayın:

Örnekteki gibi alanları doldurunuz, daha sonra Next butonuna basınız. Bit uzunluğu olarak en az 2048 seçiniz, daha yüksek şifreleme seçerseniz SSL’in iletişim ve çözme maliyetleri yükselecektir (daha fazla bant genişliği ve CPU gücü gerektirecektir). Daha sonra açılan sayfada ise oluşturduğunuz sertfikaya dosya ismi vermeniz istenecektir. Bu alana sonradan kolaylıkla bulabileceğiniz bir yol ismi vermenizi tavsiye ederiz. Oluşan dosyayı bir text editör ile açın ve içeriğin tamamını kopyalayıp SSL sağlayıcınıza iletin.
SSL sertifika sağlayıcınız göndermiş olduğunuz CSR dosyasına karşılık olarak alan adınıza ait crt dosyasını iletecektir. Actions/Eylemler sayfasından “Complete Certificate Request/Sertifika İsteğini Tamamla” linkine basın. CRT dosyasının yerini belirtin, açılan sayfada sertifikanızı göremiyorsanız, dosya tipini *.cer’den *.* olacak şekilde değiştirin:

Daha sonra sertifikanıza bir isim verin ve sertifika saklama alanı olarak Personal’ı seçin:

Daha önceden aldığınız bir SSL sertifikasını içeri alma
Eğer daha önceden alınmış bir SSL sertifikanız varsa SSL Sağlayıcınız tarafından size iletilen dosya crt uzantılı ise bunu pfx formatına çevirmeniz gerekecektir. PFX formatı özel anahtarı da içereceğinden sertifika sağlayıcılar online araçlar ile bu dönüşümün yapılmasını sağlayacaklardır. Her hangi bir nedenle özel anahtarınızı iletmek istemezseniz openssl kütüphanesi ile dönüşümü kendiniz yapabilirsiniz, openssl Windows altında da çalışabilmektedir.
openssl pkcs12 -export -out alanadi.com.pfx -inkey alanadi.com.key -in alanadi.com.crt
Enter Export Password:
Verifying - Enter Export Password:
IIS yöneticisinden Sunucu Sertifikaları kısmına giriş yapın ve sağ köşede açılan pencereden Import... (Al...) seçeneğini seçin, açılan pencereden sertifikayı yükleyebilirsiniz:

“Allow this certificate to be exported” seçeneğini işaretlemeniz durumunda daha sonra kullanmak üzere özel anahtarınızı da dışarıya aktarma imkanınız olacaktır.
Sertifika Yükleme
Windows Sunucularda
IIS yöneticisinden sertifikayı yüklemek istediğiniz alan adını seçin, sağdaki Actions/Eylemler penceresinde “Bindings/Bağlamalar” linkine tıklayın, açılan pencerede “Add/Ekle” butonuna basın.

Açılan pencerede Tür olarak https seçin, alan adını doldurun ve SSL certificate bölümünde import ettiğiniz sertifikayı seçin. Özel bir porttan yayın yapmak istemiyorsanız varsayılan değeri 443 olarak bırakın. Daha sonra OK tuşuna basarak işlemi tamamlayabilirsiniz.
Eğer aynı IP adresi üzerinde birden çok alan adı için SSL sertifikası yükleyecekseniz yukarıdaki ekran görüntüsünde kırmızı ile işaretlenmiş kutucuğu seçiniz.
Linux Sunucularda
Linux sunucularda sertifikalarınızı /etc/pki/tls dizini altına koymanızda pratiklik açısından fayda vardır. Bu dizin altına eklediğiniz sertifikaları Apache ya da Nginx yapılandırma dosyalarında belirtmeniz yeterli olacaktır.
Apache Yapılandırması
Yapılandırma dosyanız Virtual Host direktifi içeriyorsa, Virtual Host yapılandırması altında, içermiyorsa nginx.conf dosyasında aşağıdaki değişiklikleri yapınız. Standart yapılandırmanın içeriğine aşağıdakileri eklemeniz gerekecektir:
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
| Protocols | Modern binary protokolü aktive eder. |
| ssl_session_cache shared | Tüm proseslerin paylaştığı bir ön bellek mekanizmasıdır, yerleşik olan bellek mekanizması (builtin) hafıza parçalanması oluşturduğu için önerilmemektedir. |
| SSLSessionTickets | SSL oturumunun yeniden başlatılmasını engeller. |
| SSLProtocol | SSL şifreleme protokolleri, sadece TLSv1.2’ ve TLS1.3’e izin verilmiştir. |
| SSLCipherSuite | Tarayıcıya sunulan şifreleme algoritmaları. Bkz: https://ssl-config.mozilla.org/ |
| Header always set Strict-Transport-Security “max-age=63072000” | Tarayıcıya güvenli iletişim kurarak bu site ile iletişime geçmesi direktifini verir. |
| ssl_stapling | Hem güvenliği hem de performansı artırmak için kullanır. Bu ayar aktive edildiğinde tarayıcının CA otoritesine sertifika durumunu sormasına gerek kalmaz. |
| SSLHonorCipherOrder | Normalde SSL iletişimi kurulurken tarayıcının tercih ettiği sıra önceliklidir, açık olduğunda sunucu tercihleri geçerlidir. |
TLSv1.3 RedHat Enterprise Linux 8 ya da benzeri işletim sistemi gerektirebilir. OpenSSL’in TLSv1.3’ü destekleyen sürümü 7 sürümünde gelmemektedir.
Yapılandırma dosyasının tamamı aşağıdaki gibi olmalıdır, eğer Apache önünde nginx reverse proxy kullanıyorsanız Apache’de SSL yapılandırması yapmanıza gerek kalmayacaktır, bu durumda nginx TLS yapılandırması makalemize bakabilirsiniz. Aşağıdaki örnek standart kurulum yapılandırması üzerine derlenmiştir, eğer httpd dışında bir kullanıcı kullanıyorsanız değiştirmeniz gerekir. Sertifikaların /etc/pki/tls/ dizininde olduğu varsayılarak:
<VirtualHost *:80>
RewriteEngine On
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>
<VirtualHost *:443>
SSLEngine on
SSLCertificateFile /etc/pki/tls/server.crt
SSLCertificateKeyFile /etc/pki/tls/server.key
Protocols h2 http/1.1
Header always set Strict-Transport-Security "max-age=63072000"
</VirtualHost>
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384
SSLHonorCipherOrder off
SSLSessionTickets off
SSLUseStapling On
SSLStaplingCache "shmcb:logs/ssl_stapling(32768)"
Yapılandırmayı kaydettikten sonra Apache sunucusunu yeniden başlatın
systemctl restart httpd
Nginx Yapılandırması
Yapılandırma dosyanız Virtual Host direktifi içeriyorsa, Virtual Host yapılandırması altında, içermiyorsa nginx.conf dosyasında aşağıdaki değişiklikleri yapınız. Standart yapılandırmanın içeriğine aşağıdakileri eklemeniz gerekecektir:
ssl_session_timeout 1d;
ssl_session_cache shared:ONLAYER:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_protocols TLSv1.2;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_stapling on;
ssl_stapling_verify on;
| ssl_session_timeout | SSL oturum yeniden kullanım süresi, 1 gün. |
| ssl_session_cache shared | Tüm proseslerin paylaştığı bir ön bellek mekanizmasıdır, yerleşik olan bellek mekanizması (builtin) hafıza parçalanması oluşturduğu için önerilmemektedir. |
| ssl_session_tickets | SSL oturumunun yeniden başlatılmasını engeller. |
| ssl_protocols | SSL şifreleme protokolleri, sadece TLSv1.2’ ve TLS1.3’e izin verilmiştir. |
| ssl_ciphers | Tarayıcıya sunulan şifreleme algoritmaları. Bkz: https://ssl-config.mozilla.org/ |
| add_header Strict-Transport-Security “max-age=63072000” always: | Tarayıcıya güvenli iletişim kurarak bu site ile iletişime geçmesi direktifini verir ve bu bilgiyi yaklaşık 2 yıl aklında tutması söylenir. |
| ssl_stapling | Hem güvenliği hem de performansı artırmak için kullanır. Bu ayar aktive edildiğinde tarayıcının CA otoritesine sertifika durumunu sormasına gerek kalmaz. |
TLSv1.3 RedHat Enterprise Linux 8 ya da benzeri işletim sistemi gerektirebilir. OpenSSL’in TLSv1.3’ü destekleyen sürümü 7 sürümünde gelmemektedir.
Yapılandırma dosyasının tamamı aşağıdaki gibi olmalıdır, eğer nginx reverse proxy modunda çalıştırılıyorsa ayrıca Apache yapılandırma makalemizi de incelemeninizi tavsiye ederiz. Aşağıdaki örnek standart kurulum yapılandırma üzerine derlenmiştir, eğer nginx dışında bir kullanıcı kullanıyorsanız değiştirmeniz gerekir. Sertifikaların /etc/nginx/SSL/ dizininde olduğu varsayılarak:
user nginx;
worker_processes auto;
error_log /var/log/nginx/error.log;
pid /run/nginx.pid;
include /usr/share/nginx/modules/*.conf;
events {
worker_connections 1024;
}
http {
log_format main '$remote_addr - $remote_user [$time_local] "$request" '
'$status $body_bytes_sent "$http_referer" '
'"$http_user_agent" "$http_x_forwarded_for"';
access_log /var/log/nginx/access.log main;
sendfile on;
tcp_nopush on;
tcp_nodelay on;
keepalive_timeout 65;
types_hash_max_size 2048;
include /etc/nginx/mime.types;
default_type application/octet-stream;
# Load modular configuration files from the /etc/nginx/conf.d directory.
# See http://nginx.org/en/docs/ngx_core_module.html#include
# for more information.
include /etc/nginx/conf.d/*.conf;
server {
listen 80 default_server;
listen [::]:80 default_server;
# redirect all HTTP requests to HTTPS with a 301 Moved Permanently response.
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
# certs sent to the client in SERVER HELLO are concatenated in ssl_certificate
ssl_certificate /etc/nginx/SSL/bundle.crt;
ssl_certificate_key /etc/nginx/SSL/csr/server.key;
ssl_session_timeout 1d;
ssl_session_cache shared:MozSSL:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_dhparam /etc/nginx/SSL/dhparam.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_stapling on;
ssl_stapling_verify on;
# verify chain of trust of OCSP response using Root CA and Intermediate certs
ssl_trusted_certificate /etc/nginx/SSL/USERTrustRSAAddTrustCA.crt;
# replace with the IP address of your resolver
resolver 127.0.0.1;
}
}
Eğer Nginx’i Apache için reverse proxy olarak kullanıyorsanız, yapılandırmanız şuna benzer olmalıdır:
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name nginxdoc.rackdc.com;
ssl_certificate /etc/nginx/SSL/bundle.crt;
ssl_certificate_key /etc/nginx/SSL/server.key;
ssl_session_timeout 1d;
ssl_session_cache shared:ONLAYER:10m; # about 40000 sessions
ssl_session_tickets off;
ssl_dhparam /etc/nginx/SSL/dhparam.pem;
# intermediate configuration
ssl_protocols TLSv1.2 TLSv1.3;
ssl_ciphers ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384;
ssl_prefer_server_ciphers off;
add_header Strict-Transport-Security "max-age=63072000" always;
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/pki/tls/SectigoRSADomainValidationSecureServerCA.crt;
location / {
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $host;
proxy_pass http://127.0.0.1:8080;
}
# replace with the IP address of your resolver
resolver 127.0.0.1;
}
Yapılandırmayı kaydettikten sonra nginx sunucusunu yeniden başlatın
systemctl restart nginx