Debian 10 Üzerinde Nginx Web Sunucusunu Let’s Encrypt ve Certbot ile Güvenli Hale Getirme Rehberi
Günümüz web dünyasında, bir web sitesinin istemci (tarayıcı) ile sunucu arasındaki iletişimini şifrelemek yalnızca bir tercih değil, temel bir zorunluluktur. HTTPS protokolu, aktarılan verilerin üçüncü şahıslar tarafından dinlenmesini (eavesdropping), değiştirilmesini (tampering) veya taklit edilmesini (man-in-the-middle saldırıları) engeller. Arama motorlarının HTTPS kullanan sitelere öncelik tanıması ve modern tarayıcıların HTTP bağlantılarını “Güvenli Değil” olarak işaretlemesi, SSL/TLS sertifikalarının kullanımını zorunlu kılmıştır.
Bu kapsamlı teknik rehberde, Debian 10 (Buster) işletim sistemi üzerinde çalışan bir Nginx web sunucusunun, Let’s Encrypt tarafından sağlanan ücretsiz, otomatikleştirilmiş ve güvenilir bir SSL/TLS sertifikası ile nasıl yapılandırılacağını adım adım inceleyeceğiz. Ayrıca, sertifikasyon sürecinin yanı sıra TLS protokolü sıkılaştırma, HSTS entegrasyonu, OCSP Stapling ve otomatik yenileme mekanizmalarını da detaylandıracağız.
1. SSL/TLS Sertifikaları ve Let’s Encrypt Teknolojisinin Çalışma Mantığı
SSL (Secure Sockets Layer) ve onun modern, daha güvenli halefi olan TLS (Transport Layer Security), ağ üzerindeki iletişimi şifreleyen kriptografik protokollerdir. SSL/TLS sertifikaları, asimetrik şifreleme (açık ve özel anahtar çiftleri) kullanarak istemci ile sunucu arasında güvenli bir el sıkışma (handshake) gerçekleştirir.
Let me Encrypt, İnternet Güvenliği Araştırma Grubu (ISRG) tarafından sunulan ücretsiz, otomatik ve açık bir Sertifika Yetkilisidir (CA – Certificate Authority). Let’s Encrypt, manuel sertifika talep, doğrulama ve kurulum süreçlerini ortadan kaldırmak için Otomatik Sertifika Yönetim Ortamı (ACME – Automated Certificate Management Environment) protokolünü kullanır. Certbot ise bu ACME protokolünü uygulayan ve istemci tarafında sertifika alma/yenileme işlemlerini otomatikleştiren açık kaynaklı bir araçtır.
ACME HTTP-01 Doğrulama Süreci
Certbot, sunucunuz adına bir sertifika isteminde bulunduğunda, Let’s Encrypt CA sunucuya bir “meydan okuma” (challenge) gönderir. HTTP-01 doğrulama türünde, Certbot web sunucunuzun belirli bir dizinine (.well-known/acme-challenge/) geçici bir token dosyası yerleştirir. Let’s Encrypt CA sunucusu, belirtilen alan adı üzerinden bu dosyaya HTTP isteği atarak erişmeye çalışır. Erişim başarılı olursa, alan adının kontrolünün gerçekten sizde olduğu doğrulanır ve dijital olarak imzalanmış SSL/TLS sertifikası sunucunuza iletilir.
2. Ön Gereksinimler ve Sistem Hazırlığı
Kuruluma başlamadan önce, sisteminizde aşağıdaki gereksinimlerin karşılandığından emin olmanız gerekmektedir:
- Sistem ve Yetkiler: Debian 10 (Buster) işletim sistemine sahip bir sunucu ve
sudoyetkilerine sahip root dışı bir kullanıcı hesabı. - Geçerli Alan Adı (Domain Name): Kendinize ait kayıtlı bir alan adı. Bu rehberde örnek olarak
ornekdomain.comvewww.ornekdomain.comifadeleri kullanılacaktır. - DNS Kayıtları: Sunucunuzun kamuya açık IP adresine yönlendirilmiş DNS “A” kayıtları (veya IPv6 kullanılıyorsa “AAAA” kayıtları).
- Çalışan Nginx Kurulumu: Sunucunuzda Nginx web sunucusunun kurulu ve temel seviyede yapılandırılmış olması.
DNS Kayıtlarının Kontrol Edilmesi
DNS değişikliklerinin küresel olarak yayılması zaman alabilir. Sertifika alma işlemine geçmeden önce alan adınızın doğru IP adresine yönlendiğini komut satırından doğrulamanız önerilir:
dig A ornekdomain.com +short
dig A www.ornekdomain.com +short
Dönen çıktıların sunucunuzun public IP adresi ile birebir eşleştiğinden emin olun.
3. Adım 1: Certbot ve Nginx Eklentisinin Debian 10 Üzerine Kurulması
Debian 10 (Buster) depolarında Certbot ve Nginx entegrasyonunu sağlayan resmi eklentiler mevcuttur. Kuruluma başlamadan önce sistem paket listesini güncelleyelim.
sudo apt update
sudo apt upgrade -y
Paket veritabanı güncellendikten sonra, Certbot ve Python tabanlı Nginx eklentisi olan python3-certbot-nginx paketini yükleyebiliriz. Bu eklenti, Nginx konfigürasyon dosyalarını otomatik olarak okuma, SSL bloklarını yazma ve web sunucusunu yeniden başlatma yeteneğine sahiptir.
sudo apt install certbot python3-certbot-nginx -y
Kurulum tamamlandıktan sonra Certbot’un sistemde doğru şekilde yüklendiğini kontrol etmek için versiyon bilgisini sorgulayabilirsiniz:
certbot --version
4. Adım 2: Nginx Konfigürasyonunun Doğrulanması
Certbot’un Nginx için otomatik SSL yapılandırması yapabilmesi için, Nginx yapılandırma dosyalarınızda server_name yönergesinin doğru tanımlanmış olması şarttır. Certbot, mevcut blokları tarayarak alan adınızla eşleşen sanal konak (Virtual Host / Server Block) yapısını tespit eder.
Örnek bir Nginx konfigürasyon dosyasını (genellikle /etc/nginx/sites-available/ornekdomain.com) kontrol edelim veya oluşturalım:
sudo nano /etc/nginx/sites-available/ornekdomain.com
Dosya içeriğinin aşağıdaki gibi temel bir HTTP konfigürasyonuna sahip olduğundan emin olun:
server {
listen 80;
listen [::]:80;
server_name ornekdomain.com www.ornekdomain.com;
root /var/www/ornekdomain.com/html;
index index.html index.htm;
location / {
try_files $uri $uri/ =404;
}
}
Eğer dosya yeni oluşturulduysa, bu konfigürasyonu aktifleştirmek için sites-enabled dizinine bir sembolik bağ (symlink) oluşturmanız gerekir:
sudo ln -s /etc/nginx/sites-available/ornekdomain.com /etc/nginx/sites-enabled/
Nginx yapılandırmanızda herhangi bir sözdizimi (syntax) hatası olup olmadığını test edin:
sudo nginx -t
Eğer çıktı syntax is ok ve test is successful mesajlarını dönüyorsa, Nginx servisini yeniden yükleyin:
sudo systemctl reload nginx
5. Adım 3: Güvenlik Duvarı (UFW) Ayarlarının Güncellenmesi
Eğer Debian sunucunuzda varsayılan güvenlik duvarı olarak UFW (Uncomplicated Firewall) aktif durumda ise, varsayılan HTTP (Port 80) ve HTTPS (Port 443) trafiğine izin vermeniz gerekmektedir.
Mevcut UFW durumunu ve profillerini inceleyin:
sudo ufw status
Nginx, UFW için hazır profiller sunar. Bu profilleri listelemek için:
sudo ufw app list
Çıktıda ‘Nginx Full’, ‘Nginx HTTP’ ve ‘Nginx HTTPS’ profillerini göreceksiniz. HTTPS trafiğine izin vermek için ‘Nginx Full’ profilini etkinleştirmemiz gerekir:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'
Yapılandırma sonrasında durum tekrar kontrol edildiğinde Port 80 ve Port 443 geçişlerine izin verildiği doğrulanmalıdır.
6. Adım 4: Let’s Encrypt SSL/TLS Sertifikasının Alınması
Certbot, Nginx eklentisi sayesinde sertifika alma ve konfigürasyon dosyasını güncelleme sürecini tek bir komutla halledebilir. Sertifikayı almak için aşağıdaki komutu çalıştırın:
sudo certbot --nginx -d ornekdomain.com -d www.ornekdomain.com
Bu komut çalıştırıldığında Certbot etkileşimli bir kurulum başlatır. Sırasıyla şu adımlar gerçekleşir:
- E-posta Adresi İstenmesi: Sertifika yenileme bildirimleri ve güvenlik uyarıları için geçerli bir e-posta adresi girmeniz istenir.
- Hizmet Şartlarının Kabulü (Terms of Service): Let’s Encrypt kullanım koşullarını kabul etmek için
A(Agree) tuşuna basmanız gerekir. - E-posta Paylaşımı: EFF (Electronic Frontier Foundation) ile e-posta adresinizi paylaşmak isteyip istemediğiniz sorulur (İsteğe bağlı,
YveyaN). - Challenge Doğrulaması: Certbot, Let’s Encrypt sunucuları ile iletişime geçerek ACME HTTP-01 doğrulamasını gerçekleştirir.
- HTTP Yönlendirmesi (Redirection): Sertifika başarıyla üretildikten sonra Certbot size tüm HTTP trafiğini otomatik olarak HTTPS’e yönlendirmek isteyip istemediğinizi sorar:
1: No redirect– Nginx konfigürasyonu değiştirilmez. HTTP ve HTTPS ayrı çalışır.2: Redirect– Tüm HTTP istekleri otomatik olarak 301 (Permanent Redirect) ile HTTPS’e yönlendirilir. (Önerilen Seçenek: 2)
Seçiminizi yapıp Enter tuşuna bastığınızda Certbot, Nginx konfigürasyon dosyanızı güncelleyecek ve Nginx servisini otomatik olarak yeniden yükleyecektir.
Üretilen Sertifika Dosyalarının İncelemesi
Sertifikalarınız sunucunuzda /etc/letsencrypt/live/ornekdomain.com/ dizini altında saklanır. Bu dizinde bulunan kritik dosyalar şunlardır:
| Dosya Adı | Açıklama |
|---|---|
privkey.pem |
Sertifikanın Özel Anahtarı (Private Key). Kesinlikle gizli tutulmalıdır. |
fullchain.pem |
Sunucu sertifikanız ile Let’s Encrypt ara sertifikalarının (intermediate certificates) birleşimi olan ana sertifika dosyası. |
cert.pem |
Sadece alan adınıza ait yalın sunucu sertifikası. |
chain.pem |
Let’s Encrypt zincir/ara sertifikaları. |
7. Adım 5: Otomatik Sertifika Yenilemesinin (Auto-Renewal) Test Edilmesi
Let’s Encrypt tarafından verilen SSL/TLS sertifikaları 90 gün süreyle geçerlidir. Bu kısa süre, çalınan anahtarların etki alanını daraltmak ve güvenliği artırmak amacıyla uygulanır. Certbot, Debian 10 üzerinde sistem arka planında çalışan bir systemd timer veya cron job mekanizması ile birlikte gelir.
Sisteminizdeki otomasyon zamanlayıcısının aktif olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın:
sudo systemctl status certbot.timer
Bu zamanlayıcı, günde iki kez çalışarak süresi bitmesine 30 günden az kalmış sertifikaları tespit eder ve otomatik olarak yeniler.
Kuru Çalışma (Dry-Run) Testi
Yenileme sürecinde herhangi bir yapılandırma hatası veya ağ engeli yaşanıp yaşanmayacağını anlamak için gerçek bir sertifika isteminde bulunmadan simülasyon (dry-run) yapabilirsiniz:
sudo certbot renew --dry-run
Eğer çıktının sonunda Congratulations, all simulated renewals succeeded mesajını görüyorsanız, otomatik yenileme mekanizmanız sorunsuz bir şekilde yapılandırılmış demektir.
8. Adım 6: Nginx SSL/TLS Güvenliğini Sıkılaştırma (Hardening)
Certbot varsayılan olarak güvenli bir yapılandırma sunsa da, sunucunuzun SSL Labs veya benzeri güvenlik testlerinden A+ alabilmesi için ek kryptografik sıkılaştırmalar yapılması tavsiye edilir.
A. Diffie-Hellman Parametrelerinin Oluşturulması
Diffie-Hellman (DH) anahtar değişimi, istemci ve sunucunun güvensiz bir kanal üzerinden güvenli bir şekilde gizli anahtar oluşturmasını sağlar. Varsayılan 1024-bit DH parametreleri yerine 2048-bit güçlü bir parametre grubu oluşturmak güvenliği önemli ölçüde artırır:
sudo openssl dhparam -out /etc/ssl/certs/dhparam.pem 2048
Not: Bu işlem sunucu işlemci gücüne bağlı olarak birkaç dakika sürebilir.
B. Nginx SSL Konfigürasyonunun İyileştirilmesi
Nginx SSL ayarlarını global olarak optimize etmek için ortak bir yapılandırma parçası (snippet) oluşturalım:
sudo nano /etc/nginx/conf.d/ssl-params.conf
Aşağıdaki parametreleri dosya içerisine ekleyin. Bu yapılandırma eski ve zayıf kabul edilen SSLv2, SSLv3, TLSv1.0 ve TLSv1.1 protokollerini devre dışı bırakır, yalnızca TLSv1.2 ve TLSv1.3 kullanılmasına izin verir.
# TLS Protokol Seviyeleri
ssl_protocols TLSv1.2 TLSv1.3;
Güçlü Şifreleme Algoritmaları (Cipher Suites)
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;
Diffie-Hellman Parametresi
ssl_dhparam /etc/ssl/certs/dhparam.pem;
SSL Session Ayarları
ssl_session_timeout 1d;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
OCSP Stapling (Sunucu Tarafında Sertifika Durum Doğrulaması)
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
HSTS (HTTP Strict Transport Security) - 1 Yıl Süreyle zorunlu HTTPS
add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload" always;
Güvenlik Başlıkları (Security Headers)
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";
C. Nginx Server Bloğunun Güncellenmesi
Şimdi Nginx sanal konak dosyamızı güncelleyerek Certbot’un oluşturduğu ayarları ve yeni eklediğimiz güvenlik parametrelerini birleştirelim:
sudo nano /etc/nginx/sites-available/ornekdomain.com
Yapılandırmanız nihai olarak aşağıdaki yapıya benzer olmalıdır:
server {
listen 80;
listen [::]:80;
server_name ornekdomain.com www.ornekdomain.com;
# HTTP isteklerini HTTPS'e 301 yönlendirmesi
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
listen [::]:443 ssl http2;
server_name ornekdomain.com www.ornekdomain.com;
root /var/www/ornekdomain.com/html;
index index.html index.htm;
# Let's Encrypt Sertifika Yolları
ssl_certificate /etc/letsencrypt/live/ornekdomain.com/fullchain.pem;
ssl_certificate_key /etc/letsencrypt/live/ornekdomain.com/privkey.pem;
# Özel SSL Parametrelerinin Dahil Edilmesi
include /etc/nginx/conf.d/ssl-params.conf;
location / {
try_files $uri $uri/ =404;
}
}
Değişikliklerin geçerli olabilmesi için konfigürasyon testini yapın ve Nginx’i yeniden başlatın:
sudo nginx -t
sudo systemctl restart nginx
9. Sık Karşılaşılan Sorunlar ve Çözüm Yolları (Troubleshooting)
Sertifika alırken veya Nginx SSL yapılandırmasında karşılaşılabilecek olası problemler ve çözüm yöntemleri şunlardır:
1. “Failed authorization procedure” / HTTP-01 Challenge Başarısızlığı
Bu hata, Let’s Encrypt sunucularının alan adınıza HTTP (Port 80) üzerinden erişemediği anlamına gelir.
- Çözüm: DNS A kayıtlarının doğru IP’ye gittiğinden emin olun. Sunucu üzerindeki UFW veya sağlayıcınızın (AWS, DigitalOcean, Hetzner vb.) dış güvenlik duvarında (Security Group) Port 80 ve 443’ün açık olup olmadığını kontrol edin.
2. “Too Many Requests” (Rate Limit) Hatası
Let’s Encrypt, kötüye kullanımı engellemek için belirli bir alan adı için haftalık sertifika alma sınırı (rate limit) uygular.
- Çözüm: Test ve deneme süreçlerinizde komutlarınıza
--dry-runparametresini ekleyerek Let’s Encrypt Staging ortamını kullanın. Limit takılması durumunda üretim ortamında bir süre beklemeniz gerekecektir.
3. Mixed Content (Karma İçerik) Uyarıları
Siteniz HTTPS üzerinden yüklense de HTML kodları içindeki görseller, CSS veya JavaScript dosyaları http:// protokolü ile çağrılıyorsa tarayıcılar uyarı verecektir.
- Çözüm: Web sitenizin kaynak kodlarındaki tüm iç bağlantıları göreceli (relative path) yapın veya protokollü bağlantıları
https://olarak güncelleyin.
10. Sonuç ve Güvenlik Doğrulaması
Bu rehberde, Debian 10 (Buster) işletim sistemi üzerinde Nginx web sunucusunun Let’s Encrypt ve Certbot kullanılarak nasıl güvenli hale getirileceğini detaylı bir şekilde ele aldık. Alan adı doğrulamasından otomatik sertifika yenilemeye, HSTS sıkılaştırmasından Diffie-Hellman parametrelerinin oluşturulmasına kadar modern bir HTTPS altyapısının tüm bileşenlerini yapılandırdık.
Sisteminizin güvenliğini tam olarak doğrulamak için bağımsız bir test platformu olan Qualys SSL Labs SSL Server Test aracını kullanabilirsiniz. Alan adınızı bu teste tabi tutarak sunucu yapılandırmanızın SSL/TLS güvenlik derecesini (A+ hedefli) görüntüleyebilir ve olası zayıf şifreleme algoritmalarını tespit edip müdahale edebilirsiniz.