Cloudflare Full Strict SSL Modu: Origin Sertifikası Kurulumu
Cloudflare üzerinde bir web sitesi yönetiyorsanız ve güvenliği ciddiye alıyorsanız, SSL ayarlarınızın “Flexible” veya “Full” modunda bırakmak sizi ciddi güvenlik açıklarına karşı savunmasız bırakabilir. Full (Strict) modu, Cloudflare ile origin sunucunuz arasındaki trafiği de şifreleyip doğrulayan tek gerçek güvenli seçenektir. Bu yazıda Cloudflare Origin CA sertifikasını sıfırdan nasıl oluşturup yapılandıracağınızı, yaygın hataları ve production ortamında dikkat etmeniz gereken ince noktaları ele alacağız.
Cloudflare SSL Modlarını Anlamak
Önce büyük resmi görelim. Cloudflare’in dört SSL modu var ve aralarındaki fark kritik:
- Off: Tüm trafik HTTP üzerinden gider, hiçbir şifreleme yok
- Flexible: Ziyaretçi ile Cloudflare arasında HTTPS, Cloudflare ile sunucunuz arasında HTTP (tehlikeli!)
- Full: Her iki tarafta da HTTPS ama origin sertifikası doğrulanmıyor (self-signed kabul eder)
- Full (Strict): Her iki tarafta HTTPS ve origin sertifikası mutlaka geçerli, güvenilir bir CA tarafından imzalanmış olmalı
Pek çok sistem yöneticisi “Full” modunun yeterli olduğunu düşünür. Yeterli değil. Full modda Cloudflare, sunucunuzdan dönen sertifikayı doğrulamaz, yani ortadaki adam saldırısına açık kalırsınız. Strict modda ise Cloudflare, sunucunuzdaki sertifikanın geçerliliğini kontrol eder.
İşte burada Cloudflare Origin CA devreye giriyor. Bu sertifika, Cloudflare’in kendi CA’sı tarafından imzalanmış özel bir sertifikadır. Sadece Cloudflare tarafından tanınır (yani doğrudan erişimde tarayıcılar güvenmez), ama Cloudflare proxy’si arkasında çalışırken Full Strict için mükemmel bir çözüm sunar.
Neden Let’s Encrypt Yerine Origin CA?
Mantıklı bir soru. Let’s Encrypt ücretsiz, yaygın olarak tanınan bir CA. Neden Cloudflare’in kendi sertifikasını kullanalım?
- Süre: Origin CA sertifikaları 15 yıla kadar geçerli olabilir, Let’s Encrypt 90 günde bir yenileme ister
- Otomasyon gerektirmez: Certbot veya acme.sh gibi araçlara ihtiyaç duymadan çalışır
- Cloudflare entegrasyonu: Cloudflare DNS arkasındayken herhangi bir HTTP challenge sorunuyla uğraşmazsınız
- Port esnekliği: 443 dışındaki portlarda da sorunsuz çalışır
- Wildcard desteği: Ücretsiz ve zahmetsizce wildcard sertifika alırsınız
Elbette dezavantajı da var: Cloudflare proxy’sini devre dışı bırakırsanız (sarı bulut gri olursa), ziyaretçiler sertifikaya güvenmez. Ama bu zaten tasarım gereği böyle.
Gereksinimler
Başlamadan önce şunların hazır olması gerekiyor:
- Cloudflare’de yönetilen bir alan adı
- Origin sunucuya SSH erişimi (Nginx veya Apache çalışıyor olsun)
- Cloudflare hesabında alan adının proxied modda olması (turuncu bulut)
- Sunucuda root veya sudo yetkisi
Adım 1: Cloudflare Dashboard’dan Origin Sertifikası Oluşturma
Cloudflare dashboard’una giriş yapın ve ilgili alan adını seçin. Sol menüden SSL/TLS > Origin Server yolunu izleyin.
“Create Certificate” butonuna tıklayın. Karşınıza bir form gelecek:
- Private key type: RSA (2048) genellikle yeterli, ama EdDSA veya ECDSA P-256 da seçebilirsiniz. Modern sistemler için ECDSA önerilir.
- Hostnames: Hangi domainler için geçerli olacak. Örneğin
example.comve*.example.comekleyin. Wildcard eklemek, tüm subdomain’leri kapsar. - Certificate Validity: 1 ay ile 15 yıl arasında seçin. Production için 1 yıl makul bir seçim, 15 yıl da kullanılabilir ama sertifika sızarsa uzun süre risk altında kalırsınız.
“Create” butonuna bastığınızda iki şey göreceksiniz: Origin Certificate (PEM formatında) ve Private Key. Bu private key’i bir daha göremeyeceksiniz. Hemen kopyalayıp güvenli bir yere saklayın.
Adım 2: Sertifika Dosyalarını Sunucuya Yerleştirme
SSH ile sunucunuza bağlanın. Sertifika dosyaları için standart bir dizin yapısı oluşturalım:
sudo mkdir -p /etc/ssl/cloudflare
sudo chmod 700 /etc/ssl/cloudflare
Şimdi sertifika ve key dosyalarını oluşturun. Dashboard’daki içeriği kopyalayıp yapıştıracağız:
sudo nano /etc/ssl/cloudflare/origin.pem
# Cloudflare'den kopyaladığınız Origin Certificate içeriğini buraya yapıştırın
# -----BEGIN CERTIFICATE----- ile başlayıp -----END CERTIFICATE----- ile bitmeli
sudo nano /etc/ssl/cloudflare/origin.key
# Private Key içeriğini buraya yapıştırın
Dosya izinlerini düzenleyin. Private key’e yalnızca root erişebilmeli:
sudo chmod 644 /etc/ssl/cloudflare/origin.pem
sudo chmod 600 /etc/ssl/cloudflare/origin.key
sudo chown root:root /etc/ssl/cloudflare/origin.pem
sudo chown root:root /etc/ssl/cloudflare/origin.key
Dosyaların doğru yerleştirildiğini kontrol edelim:
sudo openssl x509 -in /etc/ssl/cloudflare/origin.pem -text -noout | grep -E "Subject|Issuer|Not After"
Çıktıda Issuer: C=US, O=CloudFlare, Inc., OU=CloudFlare Origin CA görmelisiniz. “Not After” kısmı seçtiğiniz süreyi yansıtmalı.
Adım 3: Nginx Yapılandırması
Nginx kullanıyorsanız, sanal host yapılandırmanızı şu şekilde güncelleyin:
server {
listen 80;
server_name example.com www.example.com;
# HTTP'yi HTTPS'e yönlendir
return 301 https://$host$request_uri;
}
server {
listen 443 ssl http2;
server_name example.com www.example.com;
# Cloudflare Origin CA sertifikaları
ssl_certificate /etc/ssl/cloudflare/origin.pem;
ssl_certificate_key /etc/ssl/cloudflare/origin.key;
# Modern SSL yapılandırması
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;
# HSTS (Cloudflare arkasında dikkatli kullanın)
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
# Session cache
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 1d;
ssl_session_tickets off;
root /var/www/example.com;
index index.html index.php;
location / {
try_files $uri $uri/ =404;
}
}
Yapılandırmayı test edip servisi yeniden başlatın:
sudo nginx -t
sudo systemctl reload nginx
Adım 4: Apache Yapılandırması
Apache kullananlar için eşdeğer yapılandırma:
<VirtualHost *:80>
ServerName example.com
ServerAlias www.example.com
Redirect permanent / https://example.com/
</VirtualHost>
<VirtualHost *:443>
ServerName example.com
ServerAlias www.example.com
DocumentRoot /var/www/example.com
SSLEngine on
SSLCertificateFile /etc/ssl/cloudflare/origin.pem
SSLCertificateKeyFile /etc/ssl/cloudflare/origin.key
# Modern SSL ayarları
SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256
SSLHonorCipherOrder off
SSLSessionTickets off
# HSTS header
Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains"
<Directory /var/www/example.com>
AllowOverride All
Require all granted
</Directory>
</VirtualHost>
sudo a2enmod ssl headers
sudo apache2ctl configtest
sudo systemctl reload apache2
Adım 5: Cloudflare’de Full (Strict) Modunu Aktifleştirme
Sunucu tarafı hazır. Şimdi Cloudflare dashboard’una dönelim:
- SSL/TLS > Overview sayfasına gidin
- SSL/TLS encryption mode altında Full (strict) seçeneğini işaretleyin
Bu değişiklik anında etkinleşir. Eğer sertifikayı doğru kurduysanız siteniz sorunsuz çalışmaya devam eder.
Authenticated Origin Pulls: Ekstra Güvenlik Katmanı
Bu kısmı çoğu rehber atlıyor ama production ortamında mutlaka yapılandırmanızı öneririm. Authenticated Origin Pulls, origin sunucunuzun yalnızca Cloudflare’den gelen bağlantıları kabul etmesini sağlar. Böylece biri sunucunuzun IP adresini bulup doğrudan bağlanmaya çalışsa, sertifika doğrulaması başarısız olur.
Cloudflare’nin Origin Pull CA sertifikasını indirin:
sudo curl -o /etc/ssl/cloudflare/cloudflare-origin-pull-ca.pem
https://developers.cloudflare.com/ssl/static/authenticated_origin_pull_ca.pem
Nginx için yapılandırma:
server {
listen 443 ssl http2;
server_name example.com;
ssl_certificate /etc/ssl/cloudflare/origin.pem;
ssl_certificate_key /etc/ssl/cloudflare/origin.key;
# Authenticated Origin Pulls
ssl_client_certificate /etc/ssl/cloudflare/cloudflare-origin-pull-ca.pem;
ssl_verify_client on;
# Diğer SSL ayarları...
ssl_protocols TLSv1.2 TLSv1.3;
location / {
try_files $uri $uri/ =404;
}
}
Cloudflare dashboard’unda SSL/TLS > Origin Server altında “Authenticated Origin Pulls” toggle’ını aktifleştirin. Artık sunucunuz yalnızca Cloudflare’in istemci sertifikasını sunduğu bağlantıları kabul edecek.
Gerçek Dünya Senaryosu: Mevcut Let’s Encrypt’ten Geçiş
Diyelim ki siteniz halihazırda Let’s Encrypt ile çalışıyor ve Full Strict’e geçmek istiyorsunuz. Burada dikkat etmeniz gereken birkaç nokta var.
Önce mevcut durumu kontrol edin:
# Mevcut sertifikayı inceleyin
sudo openssl x509 -in /etc/letsencrypt/live/example.com/fullchain.pem -text -noout | grep -E "Issuer|Not After|Subject"
# Nginx'in hangi sertifikayı kullandığını bulun
sudo grep -r "ssl_certificate" /etc/nginx/sites-enabled/
Geçiş sırasında downtime yaşamamak için şu sırayı takip edin:
- Önce Origin CA sertifikasını sunucuya yükleyin (henüz Nginx’e bağlamadan)
- Nginx yapılandırmasını güncelleyin ama henüz reload etmeyin
- Cloudflare’i Full (Strict)’e çevirin
- Nginx’i reload edin
- Tarayıcıdan test edin
Aslında bu sıraya uymak çok kritik değil çünkü Cloudflare zaten proxy arkasında çalışıyor ve son kullanıcılar doğrudan origin’e bağlanmıyor. Ama dikkatli olmak her zaman iyi.
Yaygın Hatalar ve Çözümleri
526: Invalid SSL Certificate
Bu hata, Cloudflare Full Strict modundayken origin sertifikanızı doğrulayamadığı anlamına gelir.
# Sertifikanın doğru yüklendiğini test edin
sudo openssl s_client -connect localhost:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -E "Issuer|Subject"
# Nginx'in sertifika dosyasını okuyup okuyamadığını kontrol edin
sudo nginx -T | grep ssl_certificate
Olası sebepler:
- Sertifika dosyasının içeriği eksik ya da hatalı yapıştırılmış
- Private key ile sertifika eşleşmiyor
- Dosya izinleri nedeniyle Nginx sertifikayı okuyamıyor
- Sertifika süresi dolmuş
Key ile sertifikanın eşleşip eşleşmediğini kontrol etmek için:
# Bu iki komutun çıktısı aynı olmalı
sudo openssl x509 -noout -modulus -in /etc/ssl/cloudflare/origin.pem | openssl md5
sudo openssl rsa -noout -modulus -in /etc/ssl/cloudflare/origin.key | openssl md5
525: SSL Handshake Failed
Cloudflare ile origin arasında TLS handshake tamamlanamıyor demek. Genellikle şu sebeplerden kaynaklanır:
- Origin sunucuda port 443 açık değil veya firewall tarafından bloklanıyor
- Web sunucusu servisi çalışmıyor
- TLS versiyonu uyumsuzluğu
# Port 443'ün dinlenip dinlenmediğini kontrol edin
sudo ss -tlnp | grep :443
# Firewall kurallarını inceleyin
sudo ufw status
# veya
sudo iptables -L -n | grep 443
Mixed Content Uyarıları
Full Strict’e geçtikten sonra bazı kaynaklar HTTP üzerinden yüklenmeye çalışabilir:
# Nginx'de HTTP'yi HTTPS'e yönlendirin ve header ekleyin
# server bloğuna ekleyin:
add_header Content-Security-Policy "upgrade-insecure-requests" always;
Cloudflare IP Aralıklarını Firewall’da İzin Verme
Authenticated Origin Pulls kurduysanız veya sadece Cloudflare trafiğini kabul etmek istiyorsanız, Cloudflare’nin IP aralıklarını whitelist’e alın:
# Cloudflare'nin güncel IP listelerini çekin
curl -s https://www.cloudflare.com/ips-v4 | while read ip; do
sudo ufw allow from $ip to any port 443
done
curl -s https://www.cloudflare.com/ips-v6 | while read ip; do
sudo ufw allow from $ip to any port 443
done
# Doğrudan erişimi engelleyin (Cloudflare dışı)
sudo ufw deny 443
sudo ufw reload
Bu yaklaşım, birinin Cloudflare’i bypass ederek doğrudan origin IP’nize bağlanmasını engeller.
Sertifika Yenileme Planı
15 yıllık bir Origin CA sertifikası aldıysanız ve takvim hatırlatıcısı koymadıysanız, 10 yıl sonra patlayan bir bomba bırakmış olursunuz. Basit bir cron job ile sertifika süresini izleyebilirsiniz:
# /usr/local/bin/check-ssl-expiry.sh dosyası oluşturun
sudo nano /usr/local/bin/check-ssl-expiry.sh
#!/bin/bash
CERT="/etc/ssl/cloudflare/origin.pem"
DOMAIN="example.com"
ALERT_EMAIL="[email protected]"
DAYS_THRESHOLD=90
# Sertifika bitiş tarihini al
EXPIRY=$(openssl x509 -enddate -noout -in "$CERT" | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "$EXPIRY" +%s)
NOW_EPOCH=$(date +%s)
DAYS_LEFT=$(( ($EXPIRY_EPOCH - $NOW_EPOCH) / 86400 ))
if [ $DAYS_LEFT -lt $DAYS_THRESHOLD ]; then
echo "UYARI: $DOMAIN sertifikasi $DAYS_LEFT gun icinde sona eriyor!" |
mail -s "SSL Sertifika Uyarisi: $DOMAIN" $ALERT_EMAIL
echo "Uyari gonderildi: $DAYS_LEFT gun kaldi"
else
echo "Sertifika gecerli. $DAYS_LEFT gun kaldi."
fi
sudo chmod +x /usr/local/bin/check-ssl-expiry.sh
# Haftada bir çalışacak şekilde cron'a ekleyin
echo "0 9 * * 1 root /usr/local/bin/check-ssl-expiry.sh" | sudo tee -a /etc/cron.d/ssl-check
Docker ve Konteyner Ortamları
Nginx veya başka bir web sunucusunu Docker içinde çalıştırıyorsanız, sertifika dosyalarını volume ile mount edin:
# docker-compose.yml örneği
# volumes bölümüne ekleyin:
# - /etc/ssl/cloudflare:/etc/ssl/cloudflare:ro
# Bu sayede host'taki sertifikayı konteyner içinden okuyabilirsiniz
docker run -d
--name nginx
-p 443:443
-p 80:80
-v /etc/ssl/cloudflare:/etc/ssl/cloudflare:ro
-v /etc/nginx/nginx.conf:/etc/nginx/nginx.conf:ro
nginx:alpine
Kubernetes ortamında ise sertifikayı Secret olarak saklayın:
# Kubernetes Secret oluşturun
kubectl create secret tls cloudflare-origin-cert
--cert=/etc/ssl/cloudflare/origin.pem
--key=/etc/ssl/cloudflare/origin.key
--namespace=production
SSL Yapılandırmasını Doğrulama
Her şeyi ayarladıktan sonra kapsamlı bir test yapalım:
# Cloudflare üzerinden SSL testini çalıştırın
# (Bu komut Cloudflare proxy üzerinden bağlanır)
curl -I https://example.com
# Doğrudan origin'e bağlanarak sertifikayı test edin
# (Origin IP'nizi kullanın)
openssl s_client -connect ORIGIN_IP:443 -servername example.com 2>/dev/null |
openssl x509 -noout -subject -issuer -dates
# TLS versiyonlarını test edin
nmap --script ssl-enum-ciphers -p 443 example.com
Cloudflare dashboard’unda SSL/TLS > Edge Certificates altından da SSL durumunu izleyebilirsiniz. “Your SSL/TLS encryption mode is Full (strict)” mesajını görüyorsanız her şey yolunda demektir.
Ayrıca Qualys SSL Labs üzerinden sitenizi test etmenizi öneririm: https://www.ssllabs.com/ssltest/analyze.html?d=example.com Bu test, Cloudflare edge sertifikasını analiz edecektir. Origin CA sertifikanızı direkt test etmek için ?hideResults=on&d=ORIGIN_IP kullanabilirsiniz.
Sonuç
Cloudflare Full Strict SSL modu, sadece “yeşil kilit” göstermekten çok daha fazlasını ifade ediyor. Cloudflare ile origin sunucunuz arasındaki trafiğin de şifrelenip doğrulandığından emin olarak gerçek anlamda uçtan uca güvenlik sağlıyor. Origin CA sertifikası ise bu yapının omurgası: ücretsiz, wildcard destekli, 15 yıla kadar geçerli ve Cloudflare proxy ile kusursuz entegre.
Özet olarak yaptıklarımız:
- Origin CA sertifikası oluşturup sunucuya yükledik
- Nginx ve Apache için SSL yapılandırmasını hazırladık
- Cloudflare’de Full Strict modunu aktifleştirdik
- Authenticated Origin Pulls ile ekstra güvenlik katmanı ekledik
- Cloudflare IP’lerini firewall’da whitelist’e aldık
- Sertifika süresi izleme scripti yazdık
Eğer siteniz hala Flexible modunda çalışıyorsa, bu geçişi bir hafta sonu planlanmış bakım penceresine koymanızı öneririm. Geçiş süreci tahmin ettiğinizden çok daha hızlı ve sorunsuz ilerleyecek. Flexible modda çalışan bir site, aslında origin’e HTTP ile bağlandığı için şifreli görünse de gerçek anlamda güvenli değil. Bunu düzeltmek, yapabileceğiniz en basit ve etkili güvenlik iyileştirmelerinden biri.
