Nginx’i Let’s Encrypt ile Ubuntu Üzerinde Güvenli Hale Getirme
İnternet dünyasında güvenlik her geçen gün daha da kritik hale geliyor. Web sitelerinin kullanıcı verilerini koruması, arama motorlarında daha üst sıralarda yer alması ve genel olarak güvenilir bir imaj sergilemesi için HTTPS kullanımı bir zorunluluktur. HTTPS, web tarayıcısı ile sunucu arasındaki iletişimi şifreleyerek üçüncü tarafların verileri okumasını veya değiştirmesini engeller. Bu rehberde, popüler web sunucusu Nginx’i Ubuntu işletim sistemi üzerinde Let’s Encrypt’in ücretsiz SSL/TLS sertifikaları ile nasıl güvenli hale getireceğinizi adım adım öğreneceksiniz.
Let’s Encrypt, Internet Security Research Group (ISRG) tarafından işletilen, açık kaynaklı ve kar amacı gütmeyen bir sertifika yetkilisidir (CA). Amacı, web’i daha güvenli hale getirmek için SSL/TLS sertifikalarını herkes için ücretsiz ve kolay erişilebilir kılmaktır. Certbot ise, Let’s Encrypt sertifikalarını sunuculara kurmayı ve yönetmeyi otomatikleştiren bir araçtır.
Ön Hazırlıklar
Sertifika kurulumuna başlamadan önce bazı temel gereksinimleri karşıladığınızdan emin olmalısınız:
Ubuntu Sunucusu
* Ubuntu işletim sistemine sahip bir sunucuya (tercihen LTS sürümü) SSH erişiminiz olmalı ve sudo yetkilerine sahip bir kullanıcı ile giriş yapmalısınız.
Nginx Kurulumu ve Alan Adı
* Nginx web sunucusu sunucunuzda kurulu ve yapılandırılmış olmalıdır. Bir veya daha fazla alan adınız (domain) Nginx üzerinde çalışıyor olmalıdır.
* Alan adınızın DNS kayıtları (A kaydı veya AAA kaydı) sunucunuzun IP adresine doğru şekilde işaret etmelidir. Bu, Let’s Encrypt’in alan adınızın sahipliğini doğrulaması için kritik öneme sahiptir. Örneğin, example.com ve www.example.com için kayıtlar sunucunuzu göstermelidir.
Güvenlik Duvarı (UFW) Ayarları
* Ubuntu’da genellikle UFW (Uncomplicated Firewall) kullanılır. Nginx’in web trafiğini alabilmesi için HTTP (80) ve HTTPS (443) portlarının açık olması gerekmektedir.
sudo ufw allow 'Nginx Full'
sudo ufw status
Eğer ‘Nginx Full’ profili ekli değilse, sudo ufw allow http ve sudo ufw allow https komutlarını ayrı ayrı kullanabilirsiniz.
Certbot Kurulumu ve Let’s Encrypt Sertifikası Alma
Certbot, Let’s Encrypt sertifikalarını Nginx ile birlikte otomatik olarak yapılandırmak için mükemmel bir araçtır.
Certbot Kurulumu
* Certbot’u Ubuntu’ya kurmanın en kolay yolu, resmi PPA (Personal Package Archive) kullanmaktır. Bu, en güncel sürümü almanızı sağlar.
sudo apt update
sudo apt install software-properties-common
sudo add-apt-repository universe
sudo add-apt-repository ppa:certbot/certbot
sudo apt update
sudo apt install certbot python3-certbot-nginx
Bu komutlar, Certbot’u ve Nginx entegrasyonu için gerekli eklentiyi kuracaktır.
Sertifika Alma
* Certbot’u Nginx ile birlikte kullanarak sertifika almak oldukça basittir. certbot --nginx komutu, Nginx yapılandırmanızı otomatik olarak algılar ve sertifika alma sürecini başlatır.
sudo certbot --nginx
Bu komutu çalıştırdıktan sonra, Certbot size bazı sorular soracaktır:
1. E-posta Adresi: Acil bildirimler ve kayıp anahtarlar için bir e-posta adresi girmeniz istenir.
2. Hizmet Şartları: Let’s Encrypt’in hizmet şartlarını kabul etmeniz gerekir.
3. Alan Adı Seçimi: Certbot, Nginx yapılandırmanızda bulduğu tüm alan adlarını listeler. Hangi alan adları için sertifika almak istediğinizi seçmenizi ister (genellikle tümünü seçmek isteyeceksiniz, örn: example.com ve www.example.com).
4. HTTP’den HTTPS’e Yönlendirme: Certbot, HTTP trafiğini otomatik olarak HTTPS’e yönlendirip yönlendirmeyeceğini sorar. Güvenlik için bu seçeneği “Redirect” (2) olarak seçmeniz şiddetle tavsiye edilir.
Süreç başarılı bir şekilde tamamlandığında, Certbot size sertifikanızın başarıyla alındığını ve Nginx yapılandırmanızın güncellendiğini bildiren bir mesaj gösterecektir.
Nginx Konfigürasyonunun Kontrolü
* Certbot, sertifikaları /etc/letsencrypt/live/your_domain_name/ dizinine kaydeder ve Nginx yapılandırma dosyanızı (genellikle /etc/nginx/sites-available/your_domain_name) otomatik olarak günceller.
* Güncellenmiş Nginx yapılandırma dosyanızın içeriğine bakarsanız, Certbot’un aşağıdaki gibi değişiklikler yaptığını göreceksiniz:
# HTTP trafiğini HTTPS'e yönlendirme
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
# HTTPS için yeni server bloğu
server {
listen 443 ssl;
server_name example.com www.example.com;
ssl_certificate /etc/letsencrypt/live/example.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;
include /etc/letsencrypt/options-ssl-nginx.conf;
ssl_dhparam /etc/letsencrypt/ssl-dhparams.pem; # Eğer Certbot oluşturduysa
# Diğer Nginx yapılandırmalarınız buraya gelir (root, index, location blokları vb.)
root /var/www/html/example.com;
index index.html index.htm;
# ...
}
options-ssl-nginx.conf dosyası, Certbot’un varsayılan olarak eklediği güçlü SSL/TLS ayarlarını içerir. Bu ayarlar, modern şifreleme protokollerini ve şifre süitlerini kullanarak güvenliği artırır.
* Nginx yapılandırmanızı kontrol etmek için:
sudo nginx -t
Eğer hata yoksa, Nginx’i yeniden yükleyerek değişiklikleri uygulayın:
sudo systemctl reload nginx
Artık web sitenize https://your_domain_name adresinden erişebilirsiniz ve tarayıcınızda bir kilit simgesi görmelisiniz.
Sertifika Otomatik Yenileme
Let’s Encrypt sertifikaları 90 gün geçerlidir. Bu kısa süre, güvenliği artırmak ve olası anahtar sızıntılarının etkisini azaltmak içindir. Ancak, Certbot bu yenileme işlemini otomatikleştirerek size kolaylık sağlar.
Certbot Yenileme Mekanizması
* Certbot, Ubuntu’da genellikle systemd timer veya cronjob olarak otomatik bir yenileme görevi kurar. Bu görev, sertifikalarınızın süresi dolmadan önce otomatik olarak yenilenmesini sağlar. Genellikle günde iki kez çalışır ve sertifikaların süresi dolmak üzereyse (son 30 gün içinde) yenileme işlemini gerçekleştirir.
* Yenileme başarılı olduğunda, Certbot Nginx’i yeniden yükleyerek yeni sertifikaların devreye girmesini sağlar.
Yenileme Testi
* Otomatik yenileme sürecinin düzgün çalışıp çalışmadığını test etmek için “dry run” (deneme çalıştırması) yapabilirsiniz:
sudo certbot renew --dry-run
Bu komut, yenileme işlemini gerçekten sertifikaları yenilemeden simüle eder. Eğer herhangi bir hata mesajı almazsanız, otomatik yenilemenin sorunsuz çalışması beklenir.
* Eğer bir sorunla karşılaşırsanız, hata mesajını dikkatlice inceleyerek sorunun kaynağını (örn. firewall, DNS, Nginx yapılandırması) tespit edebilirsiniz.
Ek Güvenlik Ayarları ve İyileştirmeler
Sertifikayı kurduktan sonra, Nginx sunucunuzun güvenliğini daha da artırmak için bazı ek yapılandırmalar yapabilirsiniz.
HSTS (HTTP Strict Transport Security)
* HSTS, tarayıcılara web sitenize her zaman HTTPS üzerinden bağlanmalarını söyleyen bir güvenlik mekanizmasıdır. Bu, kullanıcıların yanlışlıkla veya kötü niyetli bir saldırı sonucu HTTP üzerinden bağlanmasını engelleyerek man-in-the-middle saldırılarına karşı koruma sağlar.
* Nginx yapılandırma dosyanıza (HTTPS server bloğu içine) aşağıdaki satırı ekleyin:
# /etc/nginx/sites-available/your_domain_name
server {
listen 443 ssl;
server_name example.com www.example.com;
# ... diğer ayarlar ...
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
# ...
}
* max-age: Tarayıcının bu kuralı ne kadar süreyle hatırlayacağını saniye cinsinden belirtir (2 yıl).
* includeSubDomains: Tüm alt alan adları için de HSTS’nin geçerli olmasını sağlar.
* preload: Alan adınızı HSTS preload listesine eklemek isterseniz bu anahtar kelimeyi kullanırsınız. Bu, tarayıcıların alan adınızı ilk ziyaretlerinden önce bile HTTPS olarak kabul etmesini sağlar. hstspreload.org adresinden alan adınızı preload listesine ekleyebilirsiniz, ancak bu kalıcı bir işlem olduğu için dikkatli olunmalıdır.
* Değişiklikleri uyguladıktan sonra Nginx’i yeniden yükleyin:
sudo nginx -t
sudo systemctl reload nginx
Güçlü Şifreleme Protokolleri ve Şifre Süitleri
* Certbot’un varsayılan options-ssl-nginx.conf dosyası genellikle iyi ayarlar içerir. Ancak, daha fazla kontrol isterseniz veya belirli gereksinimleriniz varsa, bu ayarları doğrudan Nginx yapılandırmanıza ekleyebilirsiniz.
ssl_protocols TLSv1.2 TLSv1.3; # Yalnızca güvenli TLS protokollerini kullan
ssl_ciphers 'TLS_AES_128_GCM_SHA256:TLS_AES_256_GCM_SHA384:TLS_CHACHA20_POLY1305_SHA256:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256'; # Modern ve güvenli şifre süitleri
ssl_prefer_server_ciphers on; # Sunucunun şifre süitlerini tercih etmesini sağlar
Bu ayarlar, daha eski ve zayıf şifreleme yöntemlerini devre dışı bırakarak sunucunuzu daha güvenli hale getirir.
OCSP Stapling
* OCSP (Online Certificate Status Protocol) Stapling, sunucunuzun sertifika yetkilisinden (CA) sertifika durumunu alıp önbelleğe almasını ve bu bilgiyi tarayıcılara doğrudan sunmasını sağlar. Bu, tarayıcıların CA’ya ayrı bir istek göndermesini engelleyerek performansı artırır ve kullanıcının gizliliğini korur.
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem; # CA zincir dosyası
chain.pem dosyası, Certbot tarafından sertifika dizininizde otomatik olarak oluşturulur.
Diffie-Hellman Parametreleri
* Diffie-Hellman (DH) parametreleri, anahtar değişimi için kullanılır. Daha güçlü bir DH parametre dosyası oluşturmak, ileriye dönük gizliliği (Perfect Forward Secrecy) güçlendirir ve anahtar değişimini daha güvenli hale getirir.
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
# Daha fazla güvenlik için 4096 kullanabilirsiniz, ancak bu daha uzun sürer ve CPU kullanımı artırır.
# sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 4096
Bu komut biraz zaman alabilir. Oluşturulduktan sonra, Nginx yapılandırmanıza ekleyin:
ssl_dhparam /etc/ssl/certs/dhparam.pem;
Certbot’un options-ssl-nginx.conf dosyası genellikle zaten bir DH parametresi içerir, ancak manuel olarak daha güçlü bir tane oluşturmak isteyebilirsiniz.
Tüm bu değişiklikleri yaptıktan sonra, Nginx’i yeniden yüklemeyi unutmayın:
sudo nginx -t
sudo systemctl reload nginx
Web sitenizin SSL/TLS yapılandırmasını test etmek için [SSL Labs’ın SSL Testi](https://www.ssllabs.com/ssltest/) aracını kullanabilirsiniz. Genellikle A veya A+ notu almanız hedeflenir.
Sonuç ve Sıkça Sorulan Sorular
Bu rehberde, Nginx web sunucunuzu Ubuntu üzerinde Let’s Encrypt’in ücretsiz SSL/TLS sertifikaları ile nasıl güvenli hale getireceğinizi detaylı bir şekilde öğrendiniz. Certbot’un kolay kurulumu ve otomatik yenileme özellikleri sayesinde, web sitenizi güvenli ve güncel tutmak artık çok daha erişilebilir. Ek güvenlik ayarlarıyla da sunucunuzu olası tehditlere karşı daha dirençli hale getirebilirsiniz. Unutmayın, güvenli bir web deneyimi hem sizin hem de kullanıcılarınız için kritik öneme sahiptir.
Sıkça Sorulan Sorular (SSS)
Sertifika yenileme neden başarısız oluyor?
Yenileme başarısızlığının birkaç yaygın nedeni olabilir:
- Firewall Engeli: Let’s Encrypt sunucularının alan adınızın 80 veya 443 portuna erişememesi. UFW veya başka bir güvenlik duvarı ayarınızı kontrol edin.
- DNS Sorunları: Alan adınızın DNS kayıtlarının sunucunuzun IP adresini doğru şekilde göstermemesi.
- Nginx Yapılandırma Hatası: Certbot’un Nginx yapılandırmanızı okuyamaması veya test edememesi.
sudo nginx -tkomutuyla hataları kontrol edin. - Sunucu Bloğu Eksikliği: Bazı durumlarda Certbot’un doğrulamayı yapabilmesi için 80 portunda çalışan bir
serverbloğuna ihtiyacı olabilir.
Birden fazla alan adı için tek bir sertifika alabilir miyim?
Evet, Certbot tek bir komutla birden fazla alan adı (veya alt alan adı) için tek bir sertifika almanıza olanak tanır. Örneğin:
sudo certbot --nginx -d example.com -d www.example.com -d blog.example.com
Bu, tüm belirtilen alan adları için tek bir sertifika oluşturur ve yönetimi kolaylaştırır.
Wildcard sertifika nasıl alınır?
Wildcard (joker karakter) sertifikalar (örn: *.example.com), tüm alt alan adlarınızı tek bir sertifika ile korumanızı sağlar. Wildcard sertifikaları almak için DNS doğrulaması kullanmanız gerekir:
sudo certbot certonly --manual --preferred-challenges dns --nginx -d *.example.com -d example.com
Bu komut, Certbot’un size DNS TXT kaydı eklemeniz için talimatlar vermesine neden olur. Bu kaydı alan adınızın DNS sağlayıcısı üzerinden ekledikten sonra Certbot doğrulama işlemini tamamlar.
Nginx’i yeniden başlatmak veya yeniden yüklemek ne zaman gerekir?
Certbot, sertifika yenileme veya ilk kurulumdan sonra Nginx’i otomatik olarak yeniden yükler. Ancak, Nginx yapılandırma dosyalarınızda (örn. /etc/nginx/sites-available/your_domain_name) manuel bir değişiklik yaptığınızda, bu değişikliklerin etkinleşmesi için Nginx’i yeniden yüklemeniz gerekir:
sudo nginx -t # Yapılandırma hatalarını kontrol et
sudo systemctl reload nginx # Değişiklikleri uygulamak için Nginx'i yeniden yükle
Nginx’i yeniden başlatmak (sudo systemctl restart nginx) da işe yarar ancak mevcut bağlantıları keserken, yeniden yüklemek (reload) mevcut bağlantıları koruyarak yeni yapılandırmayı devreye alır.
HSTS nedir ve neden önemlidir?
HSTS (HTTP Strict Transport Security), bir web sitesinin yalnızca HTTPS üzerinden erişilebilir olması gerektiğini tarayıcılara bildiren bir güvenlik politikası mekanizmasıdır. Önemli olmasının nedenleri:
- Kullanıcıların yanlışlıkla veya manuel olarak HTTP sürümüne erişmesini engeller.
- Man-in-the-middle saldırılarında (örneğin, SSL Strip saldırıları) saldırganın HTTP bağlantısını zorlamasını engeller.
- Tarayıcıların her zaman şifreli bağlantı kullanmasını sağlayarak güvenliği artırır ve performansı optimize eder (yönlendirme ihtiyacını azaltır).
