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.com ve *.example.com ekleyin. 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.

Bir yanıt yazın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir