Cloudflare ile SSL/TLS Sertifikası: Mod Seçimi ve Yapılandırma
Cloudflare’i DNS yöneticisi olarak kullandığınızda, SSL/TLS sertifikası meselesi sandığınızdan çok daha karmaşık bir hal alıyor. Çoğu kişi Cloudflare’i devreye alıp “SSL aktif, işim bitti” diye düşünüyor. Oysa yanlış mod seçimi, hem güvenlik açıkları yaratıyor hem de production ortamında beklenmedik hatalar çıkarıyor. Bu yazıda Cloudflare SSL/TLS modlarını, hangi senaryoda hangisini kullanmanız gerektiğini ve doğru yapılandırmayı adım adım ele alacağız.
Cloudflare SSL/TLS Nasıl Çalışır?
Cloudflare proxy’si devreye girdiğinde aslında iki ayrı bağlantı söz konusu oluyor:
- Ziyaretçi ile Cloudflare arası bağlantı: Kullanıcının tarayıcısından Cloudflare edge sunucularına
- Cloudflare ile origin sunucu arası bağlantı: Cloudflare’den sizin sunucunuza
Bu ikili yapı çok önemli çünkü seçtiğiniz SSL modu bu iki bağlantının nasıl şifreleneceğini belirliyor. Proxy turuncu bulut aktifken Cloudflare araya giriyor ve her iki taraftaki bağlantıyı ayrı ayrı yönetiyor.
DNS kaydınızın proxy durumunu kontrol etmek için Cloudflare API’yi kullanabilirsiniz:
curl -X GET "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/dns_records"
-H "Authorization: Bearer {API_TOKEN}"
-H "Content-Type: application/json" | jq '.result[] | {name: .name, proxied: .proxied, type: .type}'
Çıktıda "proxied": true görüyorsanız Cloudflare SSL/TLS yönetimi devrededir.
Dört SSL/TLS Modu
1. Off (Kapalı)
HTTP üzerinden her şey düz metin gidiyor. 2024 yılında bu modu kullanmak için geçerli bir neden yok. Cloudflare dashboard’unda bile artık bu modu seçmek için ek bir uyarı ekranı karşınıza çıkıyor.
2. Flexible (Esnek)
Ziyaretçi ile Cloudflare arasındaki bağlantı HTTPS ile şifrelenmiş. Ama Cloudflare’den sizin sunucunuza giden trafik HTTP ile gidiyor. Yani sunucunuzda hiç SSL sertifikası olmasa da kullanıcı tarayıcısında kilit işareti görüyor.
Bu mod neden tehlikeli? Çünkü veriler sunucunuza şifresiz ulaşıyor. Login formları, ödeme bilgileri, kişisel veriler… Sunucu ile Cloudflare arasındaki yolda tamamen açık. Bunu “güvenli” zannetmek kullanıcıyı yanıltmak demek.
Flexible modunun tek meşru kullanım senaryosu: Shared hosting ortamlarında SSL sertifikası kuramıyorsunuz ve geçici bir süre için tek seçeneğiniz bu. Ama bu durum bile birkaç günden fazla sürmemeli.
3. Full (Tam)
Hem ziyaretçiden Cloudflare’e hem de Cloudflare’den sunucuya olan bağlantı HTTPS ile şifrelenmiş. Ancak burada kritik bir nokta var: Sunucunuzdaki sertifikanın geçerliliği doğrulanmıyor. Kendi imzaladığınız (self-signed) bir sertifika da işe yarıyor.
Bu mod, sertifika doğrulaması olmadığı için ortadaki adam saldırılarına karşı tam koruma sağlamıyor. Ama en azından veriler şifreli gidiyor.
4. Full (Strict) – Tam ve Katı
İşte production için kullanmanız gereken mod bu. Her iki bağlantı da HTTPS ile şifreli ve sunucunuzdaki sertifika mutlaka geçerli bir CA tarafından imzalanmış olmalı. Let’s Encrypt sertifikası veya Cloudflare Origin CA sertifikası burada çalışıyor. Self-signed sertifikalar kabul edilmiyor.
Origin CA Sertifikası Oluşturma
Cloudflare kendi CA’sından ücretsiz origin sertifikası sunuyor. Bu sertifikalar 15 yıla kadar geçerli olabiliyor ve yalnızca Cloudflare proxy’si aktifken güvenilir kabul ediliyor. Yani doğrudan IP üzerinden sunucunuza erişilirse tarayıcı uyarı verecek ama bu zaten istediğiniz davranış.
Cloudflare dashboard’undan SSL/TLS > Origin Server > Create Certificate yolunu izleyebilirsiniz. Ya da API ile:
curl -X POST "https://api.cloudflare.com/client/v4/certificates"
-H "Authorization: Bearer {API_TOKEN}"
-H "Content-Type: application/json"
--data '{
"hostnames": ["example.com", "*.example.com"],
"requested_validity": 5475,
"request_type": "origin-rsa",
"csr": ""
}'
requested_validity değeri gün cinsinden. 5475 gün yaklaşık 15 yıl ediyor.
API’den dönen yanıtta certificate ve private_key alanları gelecek. Bunları sunucunuza kaydediyorsunuz:
# Sertifika ve key dosyalarını oluştur
sudo mkdir -p /etc/ssl/cloudflare
sudo nano /etc/ssl/cloudflare/origin.crt # certificate içeriğini yapıştır
sudo nano /etc/ssl/cloudflare/origin.key # private_key içeriğini yapıştır
# Doğru izinleri ayarla
sudo chmod 644 /etc/ssl/cloudflare/origin.crt
sudo chmod 600 /etc/ssl/cloudflare/origin.key
sudo chown root:root /etc/ssl/cloudflare/origin.*
Nginx Yapılandırması
Origin CA sertifikasını Nginx ile kullanmak için:
server {
listen 443 ssl http2;
server_name example.com www.example.com;
ssl_certificate /etc/ssl/cloudflare/origin.crt;
ssl_certificate_key /etc/ssl/cloudflare/origin.key;
# Cloudflare'in önerdiği TLS ayarları
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;
ssl_prefer_server_ciphers off;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
# HSTS header - dikkatli kullan
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
root /var/www/html;
index index.html;
location / {
try_files $uri $uri/ =404;
}
}
server {
listen 80;
server_name example.com www.example.com;
return 301 https://$host$request_uri;
}
Nginx yapılandırmasını test edip yeniden başlatın:
sudo nginx -t && sudo systemctl reload nginx
Apache Yapılandırması
Apache kullananlar için:
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/html
SSLEngine on
SSLCertificateFile /etc/ssl/cloudflare/origin.crt
SSLCertificateKeyFile /etc/ssl/cloudflare/origin.key
# Modern TLS yapılandırması
SSLProtocol -all +TLSv1.2 +TLSv1.3
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLSessionTickets off
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
<Directory /var/www/html>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
Cloudflare IP’lerini Sunucuda Tanıma
Gerçek ziyaretçi IP adreslerini loglarınızda görmek için Cloudflare’in IP aralıklarına güvenmek zorundasınız. Aksi halde tüm istekler Cloudflare IP’lerinden geliyormuş gibi görünecek.
# Cloudflare IP listesini çek
curl -s https://www.cloudflare.com/ips-v4 > /tmp/cf_ips.txt
curl -s https://www.cloudflare.com/ips-v6 >> /tmp/cf_ips.txt
cat /tmp/cf_ips.txt
Nginx için ngx_http_realip_module modülünü kullanın:
# /etc/nginx/conf.d/cloudflare-real-ip.conf
# Cloudflare IPv4
set_real_ip_from 103.21.244.0/22;
set_real_ip_from 103.22.200.0/22;
set_real_ip_from 103.31.4.0/22;
set_real_ip_from 104.16.0.0/13;
set_real_ip_from 104.24.0.0/14;
set_real_ip_from 108.162.192.0/18;
set_real_ip_from 131.0.72.0/22;
set_real_ip_from 141.101.64.0/18;
set_real_ip_from 162.158.0.0/15;
set_real_ip_from 172.64.0.0/13;
set_real_ip_from 173.245.48.0/20;
set_real_ip_from 188.114.96.0/20;
set_real_ip_from 190.93.240.0/20;
set_real_ip_from 197.234.240.0/22;
set_real_ip_from 198.41.128.0/17;
# Cloudflare IPv6
set_real_ip_from 2400:cb00::/32;
set_real_ip_from 2606:4700::/32;
set_real_ip_from 2803:f800::/32;
set_real_ip_from 2405:b500::/32;
set_real_ip_from 2405:8100::/32;
set_real_ip_from 2a06:98c0::/29;
set_real_ip_from 2c0f:f248::/32;
real_ip_header CF-Connecting-IP;
Firewall ile Origin Sunucuyu Koruma
Full Strict modunun en büyük avantajlarından biri: Origin sunucunuzun IP adresini gizleyebiliyorsunuz. Eğer yalnızca Cloudflare’den gelen trafiğe izin verirseniz, DDoS saldırıları ve direkt tarama girişimlerini engelleyebilirsiniz.
#!/bin/bash
# cloudflare-firewall.sh
# Sadece Cloudflare IP'lerinden HTTP/HTTPS trafiğine izin ver
# Mevcut kuralları temizle
iptables -F INPUT
# Loopback ve established bağlantılara izin ver
iptables -A INPUT -i lo -j ACCEPT
iptables -A INPUT -m state --state ESTABLISHED,RELATED -j ACCEPT
# SSH'a izin ver (kendi IP'nizi ekleyin)
iptables -A INPUT -p tcp --dport 22 -j ACCEPT
# Cloudflare IPv4 aralıkları için HTTP/HTTPS
for ip in $(curl -s https://www.cloudflare.com/ips-v4); do
iptables -A INPUT -p tcp --dport 80 -s $ip -j ACCEPT
iptables -A INPUT -p tcp --dport 443 -s $ip -j ACCEPT
done
# Diğer tüm HTTP/HTTPS trafiğini engelle
iptables -A INPUT -p tcp --dport 80 -j DROP
iptables -A INPUT -p tcp --dport 443 -j DROP
echo "Cloudflare-only firewall kuralları uygulandı."
sudo chmod +x cloudflare-firewall.sh
sudo bash cloudflare-firewall.sh
Authenticated Origin Pulls
Cloudflare’in Authenticated Origin Pulls özelliği, sunucunuza yalnızca gerçek Cloudflare trafiğinin ulaşmasını sağlıyor. Bu özellik aktif olduğunda Cloudflare, her istekte özel bir istemci sertifikası gönderiyor ve siz bu sertifikayı sunucunuzda doğruluyorsunuz.
Cloudflare’in CA sertifikasını indirin:
curl -o /etc/ssl/cloudflare/cloudflare-authenticated-origin-pull-ca.pem
https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem
Nginx yapılandırmasına ekleyin:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/cloudflare/origin.crt;
ssl_certificate_key /etc/ssl/cloudflare/origin.key;
# Authenticated Origin Pulls doğrulaması
ssl_client_certificate /etc/ssl/cloudflare/cloudflare-authenticated-origin-pull-ca.pem;
ssl_verify_client on;
ssl_protocols TLSv1.2 TLSv1.3;
location / {
root /var/www/html;
index index.html;
}
}
Cloudflare dashboard’unda SSL/TLS > Origin Server > Authenticated Origin Pulls seçeneğini aktif edin. Artık sunucunuz yalnızca Cloudflare’in imzaladığı istekleri kabul edecek.
HSTS ve Always Use HTTPS Ayarları
Cloudflare dashboard’unda SSL/TLS > Edge Certificates altında birkaç önemli ayar var:
Always Use HTTPS: Aktif olduğunda Cloudflare, HTTP ile gelen tüm istekleri otomatik olarak HTTPS’e yönlendiriyor. Sunucunuzda ayrıca redirect yapmanıza gerek kalmıyor ama her iki yerde de yapmanız zararına değil.
HSTS (HTTP Strict Transport Security): Tarayıcıya “bu siteye her zaman HTTPS ile bağlan” talimatı veriyor. Dikkat: includeSubDomains aktifken bu ayarı açarsanız, tüm alt alan adlarınızın HTTPS desteklemesi gerekiyor. Geri almak çok zor çünkü tarayıcılar bu bilgiyi cache’liyor.
Minimum TLS Version: TLSv1.2 ya da TLSv1.3 seçin. TLSv1.0 ve TLSv1.1 artık güvensiz kabul ediliyor ve PCI DSS uyumluluğu için bu versiyonları devre dışı bırakmak şart.
TLS 1.3: Kesinlikle aktif etmenizi öneririm. Hem daha hızlı hem daha güvenli. 0-RTT özelliği bağlantı süresini ciddi ölçüde kısaltıyor.
Gerçek Dünya Senaryosu: WordPress + Cloudflare
WordPress kullanan bir sitede Cloudflare SSL yapılandırırken karşılaşılan en yaygın sorun: Sonsuz yönlendirme döngüsü.
Senaryo şu: Flexible mod aktif, WordPress’in wp-config.php dosyasında HTTPS zorlaması var ya da bir güvenlik eklentisi HTTP’yi HTTPS’e yönlendiriyor. Cloudflare HTTP ile gelip HTTPS’e yönlendirilen bir istek gönderiyor, bu sefer HTTPS gibi davranıyor ama aslında HTTP’ye düşüyor, bu da döngü yaratıyor.
Çözüm 1: Flexible yerine Full Strict kullanın.
Çözüm 2: wp-config.php dosyasına Cloudflare’in HTTP header’ını tanıtın:
// wp-config.php başına ekle
if (isset($_SERVER['HTTP_X_FORWARDED_PROTO']) && $_SERVER['HTTP_X_FORWARDED_PROTO'] === 'https') {
$_SERVER['HTTPS'] = 'on';
}
define('WP_HOME', 'https://example.com');
define('WP_SITEURL', 'https://example.com');
Bu sayede WordPress, Cloudflare’den gelen isteğin zaten HTTPS üzerinden geldiğini anlıyor ve tekrar yönlendirmeye çalışmıyor.
SSL Sertifikası Doğrulama ve Test
Yapılandırmanızı test etmek için:
# SSL bağlantısını test et
openssl s_client -connect example.com:443 -servername example.com
# Sertifika geçerlilik tarihini kontrol et
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null |
openssl x509 -noout -dates
# TLS versiyonlarını kontrol et
nmap --script ssl-enum-ciphers -p 443 example.com
# Curl ile HTTP header kontrolü
curl -I https://example.com
SSL Labs üzerinden de kapsamlı bir test yapabilirsiniz. Hedef A+ notu almak olmalı. Full Strict mod ve doğru cipher suite ayarlarıyla bunu kolaylıkla elde edebilirsiniz.
Let’s Encrypt ile Full Strict Kullanımı
Origin CA sertifikası kullanmak istemeyenler Let’s Encrypt sertifikasıyla da Full Strict modunu kullanabilir. Certbot ile kurulum:
# Certbot kurulumu (Ubuntu/Debian)
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# Sertifika al (Cloudflare proxy geçici olarak kapatılmalı ya da DNS challenge kullanılmalı)
sudo certbot --nginx -d example.com -d www.example.com
# Otomatik yenileme için cron
echo "0 12 * * * root /usr/bin/certbot renew --quiet" | sudo tee /etc/cron.d/certbot
Let’s Encrypt ile dikkat edilmesi gereken nokta: HTTP-01 challenge için Cloudflare proxy’sini geçici olarak devre dışı bırakmanız ya da DNS-01 challenge kullanmanız gerekiyor. DNS-01 için Cloudflare API token’ı gerekli:
# certbot-dns-cloudflare eklentisi ile DNS challenge
sudo apt install python3-certbot-dns-cloudflare -y
# API token dosyası oluştur
sudo mkdir -p /etc/cloudflare
sudo nano /etc/cloudflare/credentials.ini
credentials.ini içeriği:
dns_cloudflare_api_token = YOUR_CLOUDFLARE_API_TOKEN_HERE
sudo chmod 600 /etc/cloudflare/credentials.ini
# DNS challenge ile sertifika al (proxy aktifken de çalışır)
sudo certbot certonly
--dns-cloudflare
--dns-cloudflare-credentials /etc/cloudflare/credentials.ini
-d example.com
-d *.example.com
Bu yöntemle wildcard sertifika da alabiliyorsunuz, ki bu oldukça değerli.
Yaygın Hatalar ve Çözümleri
ERR_TOO_MANY_REDIRECTS hatası: Büyük ihtimalle Flexible mod + sunucuda HTTP->HTTPS redirect kombinasyonu. Çözüm: Full Strict moda geçin.
525 SSL Handshake Failed: Cloudflare sunucunuzla SSL el sıkışmasını tamamlayamıyor. Sertifika dosyalarının doğru yüklendiğini, Nginx/Apache’nin 443 portunda dinlediğini ve firewall kurallarının Cloudflare IP’lerine izin verdiğini kontrol edin.
526 Invalid SSL Certificate: Full Strict modunda sertifikanız geçersiz veya süresi dolmuş. Sertifika tarihlerini ve CA zincirini kontrol edin.
Sertifika uyarısı doğrudan IP üzerinden erişimde: Bu beklenen bir davranış. Origin CA sertifikaları yalnızca Cloudflare proxy’si üzerinden erişimde güvenilir. Doğrudan IP erişimini firewall ile engelleyin.
Otomatik SSL Mod Kontrolü
Dashboard yerine API üzerinden SSL modunu kontrol etmek ve değiştirmek için:
# Mevcut SSL modunu kontrol et
curl -X GET "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/settings/ssl"
-H "Authorization: Bearer {API_TOKEN}"
-H "Content-Type: application/json"
# SSL modunu full_strict olarak ayarla
curl -X PATCH "https://api.cloudflare.com/client/v4/zones/{ZONE_ID}/settings/ssl"
-H "Authorization: Bearer {API_TOKEN}"
-H "Content-Type: application/json"
--data '{"value": "strict"}'
value için geçerli değerler: off, flexible, full, strict
Bu API çağrısını CI/CD pipeline’larına ya da infrastructure-as-code araçlarınıza entegre edebilirsiniz. Terraform Cloudflare provider kullanıyorsanız cloudflare_zone_settings_override resource’u ile aynı işlemi yapabilirsiniz.
Sonuç
Cloudflare SSL/TLS yapılandırması göründüğünden daha çok katmana sahip. Özetlemek gerekirse:
- Flexible modu kullanmayın. Geçici çözüm bile olsa olabildiğince hızlı çıkın.
- Full Strict mod, production için tek doğru seçenek. Origin CA sertifikası ya da Let’s Encrypt ile birlikte kullanın.
- Authenticated Origin Pulls ile Cloudflare olmayan trafiği sunucu seviyesinde engelleyin.
- Firewall kuralları ile origin IP’nizi koruyun, yalnızca Cloudflare IP aralıklarına HTTP/HTTPS trafiğine izin verin.
- HSTS’yi acele açmayın. Tüm altyapınız HTTPS’e hazır olduğundan emin olduktan sonra aktif edin.
- API kullanmayı alışkanlık haline getirin. Dashboard’dan yapılan değişiklikler izlenemez ama API çağrıları loglanabilir, otomatikleştirilebilir ve versiyon kontrolüne alınabilir.
Yanlış SSL modu, güvenlik açığı olduğu kadar operasyonel bir baş ağrısı da. Sonsuz redirect döngüleri, 525/526 hataları, gerçek IP adresini görememe… Bunların hepsi baştan doğru yapılandırmayla önlenebilecek sorunlar. Biraz zaman ayırıp Full Strict moda geçmek, uzun vadede hem sizi hem de kullanıcılarınızı koruyor.
