Apache OCSP Stapling ile SSL Performans Optimizasyonu

SSL sertifika doğrulama süreci, web sitelerinin performansını etkileyen ama çoğu sysadmin’in göz ardı ettiği kritik bir noktadır. Kullanıcı tarayıcısı bir HTTPS bağlantısı kurduğunda, SSL sertifikasının hala geçerli olup olmadığını doğrulamak için Certificate Authority (CA) sunucusuna ayrı bir istek gönderir. Bu ek istek, özellikle CA sunucusu yavaş yanıt verdiğinde veya erişilemez olduğunda sayfa yükleme sürelerini ciddi şekilde artırabilir. İşte OCSP Stapling tam bu noktada devreye giriyor ve bu problemi zarif bir şekilde çözüyor.

OCSP Nedir ve Neden Performans Sorunu Yaratır

OCSP (Online Certificate Status Protocol), SSL/TLS sertifikalarının iptal durumunu kontrol etmek için kullanılan bir protokoldür. Eski yöntem olan CRL (Certificate Revocation List) tüm iptal edilmiş sertifikaların listesini indirmeyi gerektiriyordu, bu da hem yavaş hem de verimsizdi. OCSP bu sorunu çözdü ama beraberinde farklı bir problem getirdi.

Klasik OCSP akışında şu adımlar gerçekleşir:

  • Kullanıcı tarayıcısı sitenize bağlanmaya çalışır
  • Tarayıcı, sertifikanızın geçerli olup olmadığını CA’nın OCSP sunucusuna sorar
  • CA sunucusu yanıt verir (veya vermez, timeout oluşur)
  • Bağlantı kurulur

Bu akışta iki büyük sorun var. Birincisi, her yeni SSL bağlantısında ekstra bir DNS çözümleme ve HTTP isteği yapılıyor. İkincisi, CA sunucuları Avrupa veya Amerika’da bulunduğundan Türkiye’deki kullanıcılar için bu gecikme 100-300 ms’ye kadar çıkabiliyor. Günde binlerce bağlantı alan bir site için bu rakamlar çok ciddi bir yük anlamına gelir.

OCSP Stapling ise bu süreci tersine çevirir. Web sunucusu, CA’nın OCSP yanıtını periyodik olarak kendisi alır ve SSL handshake sırasında bu yanıtı istemciye “zımbalar” (staple eder). Böylece tarayıcının CA sunucusuna ayrıca gitmesi gerekmez.

Apache’de OCSP Stapling Yapılandırması

Ön Koşullar ve Sistem Kontrolü

Başlamadan önce Apache versiyonunuzu kontrol edin. OCSP Stapling desteği Apache 2.3.3 ile geldi, ancak stabil kullanım için 2.4.x önerilen versiyondur.

apache2 -v
# veya
httpd -v

SSL modülünün yüklü olduğunu doğrulayın:

apache2ctl -M | grep ssl
# Çıktıda "ssl_module (shared)" görmeli siniz

Eğer SSL modülü aktif değilse etkinleştirin:

a2enmod ssl
systemctl restart apache2

Temel OCSP Stapling Yapılandırması

Ana yapılandırmayı /etc/apache2/conf-available/ocsp-stapling.conf dosyasına alalım. Bunu merkezi yönetim açısından tercih ediyorum, her VirtualHost’a tek tek eklemek yerine.

cat > /etc/apache2/conf-available/ocsp-stapling.conf << 'EOF'
# OCSP Stapling Global Ayarları
SSLUseStapling On
SSLStaplingCache shmcb:/var/run/apache2/stapling-cache(512000)
SSLStaplingReturnResponderErrors Off
SSLStaplingFakeTryLater Off
SSLStaplingResponderTimeout 5
SSLStaplingStandardCacheTimeout 3600
SSLStaplingErrorCacheTimeout 600
EOF
a2enconf ocsp-stapling

Şimdi bu direktiflerin ne anlama geldiğini açıklayalım:

  • SSLUseStapling On: OCSP Stapling özelliğini etkinleştirir
  • SSLStaplingCache: OCSP yanıtlarının cache’leneceği paylaşımlı bellek alanı, 512KB genellikle birkaç düzine sertifika için yeterlidir
  • SSLStaplingReturnResponderErrors Off: CA’dan hata yanıtı gelirse bunu istemciye iletmez, daha güvenli bir davranış
  • SSLStaplingFakeTryLater Off: Hata durumunda sahte “try later” yanıtı üretmez
  • SSLStaplingResponderTimeout 5: CA sunucusuna yapılan isteğin timeout süresi (saniye)
  • SSLStaplingStandardCacheTimeout 3600: Başarılı OCSP yanıtlarını 1 saat cache’le
  • SSLStaplingErrorCacheTimeout 600: Hatalı yanıtları 10 dakika cache’le

VirtualHost Yapılandırması

SSL VirtualHost’unuza gerekli direktifleri ekleyin. Önemli olan nokta, SSLCACertificateFile direktifinin doğru chain sertifikasını göstermesidir.

cat > /etc/apache2/sites-available/example.com-ssl.conf << 'EOF'
<VirtualHost *:443>
    ServerName example.com
    ServerAlias www.example.com
    DocumentRoot /var/www/example.com

    # SSL Temel Ayarlar
    SSLEngine On
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/example.com-chain.crt

    # OCSP Stapling için CA Bundle
    SSLCACertificateFile /etc/ssl/certs/ca-bundle.crt

    # OCSP Stapling VirtualHost Düzeyinde Açık
    SSLUseStapling On

    # Modern SSL Ayarları
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384
    SSLHonorCipherOrder Off
    SSLSessionTickets Off

    ErrorLog ${APACHE_LOG_DIR}/example.com-error.log
    CustomLog ${APACHE_LOG_DIR}/example.com-access.log combined
</VirtualHost>
EOF

Let’s Encrypt Sertifikaları için Özel Yapılandırma

Let’s Encrypt kullananlar için chain dosyası yolu farklıdır. Let’s Encrypt, fullchain.pem içinde hem sertifikayı hem de intermediate CA’yı barındırır.

<VirtualHost *:443>
    ServerName example.com

    SSLEngine On
    SSLCertificateFile /etc/letsencrypt/live/example.com/cert.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/example.com/privkey.pem
    SSLCertificateChainFile /etc/letsencrypt/live/example.com/chain.pem

    # Let's Encrypt için CA sertifikası
    SSLCACertificateFile /etc/letsencrypt/live/example.com/chain.pem

    SSLUseStapling On
</VirtualHost>

Buradaki ince nokta: SSLCACertificateFile ile SSLCertificateChainFile aynı chain.pem dosyasını gösteriyor. Bu Let’s Encrypt sertifikaları için doğru yaklaşım.

Yapılandırmayı Test Etme

Söz Dizimi Kontrolü

apache2ctl configtest
# Çıktı: "Syntax OK" olmalı

# Ardından yeniden yükleyin
systemctl reload apache2

OpenSSL ile OCSP Stapling Doğrulama

Yapılandırmanızın çalışıp çalışmadığını test etmenin en güvenilir yolu OpenSSL’dir:

openssl s_client -connect example.com:443 -status -tlsextdebug 2>&1 | head -40

Başarılı bir çıktıda şunu görmelisiniz:

OCSP response:
======================================
OCSP Response Data:
    OCSP Response Status: successful (0x0)
    Response Type: Basic OCSP Response
    Version: 1 (0x0)
    Responder Id: ...
    Produced At: Dec 15 10:23:45 2024 GMT
    Responses:
    Certificate ID:
      Hash Algorithm: sha1
      ...
    Cert Status: good
    This Update: Dec 15 10:23:45 2024 GMT
    Next Update: Dec 22 10:23:45 2024 GMT

Eğer OCSP response: no response sent görüyorsanız bir problem var demektir. En yaygın sorunları sonraki bölümde ele alacağız.

Nmap ile Test

nmap --script ssl-cert,ssl-enum-ciphers -p 443 example.com

SSL Labs ile Online Test

Komut satırı araçlarına ek olarak Qualys SSL Labs (ssllabs.com/ssltest) sitesini kullanarak detaylı bir analiz yapabilirsiniz. OCSP Stapling bölümünde “Yes” yazıyorsa yapılandırma başarılıdır.

Yaygın Sorunlar ve Çözümleri

Sorun 1: Web Sunucusu CA’ya Ulaşamıyor

En sık karşılaştığım sorun bu. Web sunucunuz outbound HTTP/HTTPS trafiğine kapalıysa OCSP yanıtını alamaz.

# Apache'nin CA OCSP URL'sine ulaşabildiğini test edin
# Önce sertifikanızdaki OCSP URL'sini bulun
openssl x509 -in /etc/ssl/certs/example.com.crt -noout -text | grep "OCSP"

# Örnek çıktı:
# OCSP - URI:http://ocsp.int-x3.letsencrypt.org

# Şimdi bu URL'ye curl ile test yapın
curl -v http://ocsp.int-x3.letsencrypt.org

Eğer firewall kısıtlaması varsa:

# UFW kullanıyorsanız
ufw allow out 80/tcp
ufw allow out 443/tcp

# iptables kullanıyorsanız
iptables -A OUTPUT -p tcp --dport 80 -j ACCEPT
iptables -A OUTPUT -p tcp --dport 443 -j ACCEPT

Sorun 2: Yanlış Chain Sertifikası

# Sertifika zincirini doğrulayın
openssl verify -CAfile /etc/ssl/certs/ca-bundle.crt /etc/ssl/certs/example.com.crt

# Çıktı: "example.com.crt: OK" olmalı

# Chain'i kontrol edin
openssl x509 -in /etc/ssl/certs/example.com-chain.crt -noout -subject -issuer

Sorun 3: Cache Dolması

Çok sayıda VirtualHost kullanıyorsanız varsayılan 512KB cache yetersiz gelebilir. Her sertifika için yaklaşık 10-15KB hesaplayın:

# 50 sertifika için 1MB yeterli olur
SSLStaplingCache shmcb:/var/run/apache2/stapling-cache(1048576)

Performans İzleme ve Log Analizi

Apache Log Formatına OCSP Bilgisi Ekleme

# /etc/apache2/apache2.conf veya ilgili VirtualHost'a ekleyin
LogFormat "%h %l %u %t "%r" %>s %O "%{Referer}i" "%{User-Agent}i" %{SSL_PROTOCOL}x %{SSL_CIPHER}x" ssl_combined

CustomLog ${APACHE_LOG_DIR}/ssl-access.log ssl_combined

OCSP Cache Durumunu İzleme

Apache server-status modülü aktifse OCSP cache bilgisine ulaşabilirsiniz:

# mod_status etkinleştirin
a2enmod status

# /etc/apache2/conf-available/status.conf
cat > /etc/apache2/conf-available/status.conf << 'EOF'
<Location "/server-status">
    SetHandler server-status
    Require ip 127.0.0.1 ::1
</Location>
ExtendedStatus On
EOF

a2enconf status
systemctl reload apache2

# Durumu kontrol edin
curl -s http://localhost/server-status | grep -i ocsp

Periyodik OCSP Doğrulama Script’i

Otomatik izleme için basit bir script yazalım. Bunu cron’a ekleyerek düzenli kontrol sağlayabilirsiniz:

cat > /usr/local/bin/check-ocsp-stapling.sh << 'SCRIPT'
#!/bin/bash

DOMAIN=$1
LOG_FILE="/var/log/ocsp-check.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

if [ -z "$DOMAIN" ]; then
    echo "Kullanim: $0 <domain>"
    exit 1
fi

OCSP_RESPONSE=$(echo "" | openssl s_client -connect ${DOMAIN}:443 
    -status -tlsextdebug 2>/dev/null | 
    grep -A1 "OCSP response:")

if echo "$OCSP_RESPONSE" | grep -q "successful"; then
    echo "${DATE} - ${DOMAIN}: OCSP Stapling AKTIF ve calisiyor" >> $LOG_FILE
    echo "OK: ${DOMAIN} OCSP Stapling aktif"
    exit 0
elif echo "$OCSP_RESPONSE" | grep -q "no response sent"; then
    echo "${DATE} - ${DOMAIN}: OCSP Stapling CEVAP YOK" >> $LOG_FILE
    echo "UYARI: ${DOMAIN} OCSP Stapling cevap gondermiyor"
    exit 1
else
    echo "${DATE} - ${DOMAIN}: OCSP Stapling BILINMEYEN DURUM" >> $LOG_FILE
    echo "HATA: ${DOMAIN} OCSP durumu belirlenemiyor"
    exit 2
fi
SCRIPT

chmod +x /usr/local/bin/check-ocsp-stapling.sh

# Cron'a ekleyin - her saat kontrol
echo "0 * * * * www-data /usr/local/bin/check-ocsp-stapling.sh example.com" >> /etc/cron.d/ocsp-check

Gerçek Dünya Senaryosu: E-Ticaret Sitesi Optimizasyonu

Birkaç ay önce yüksek trafikli bir e-ticaret sitesinde yaptığım optimizasyon çalışmasından gerçek rakamlara göre konuşayım. Site günlük 50.000’in üzerinde benzersiz ziyaretçi alıyordu ve SSL handshake süreleri ortalama 450ms civarındaydı. OCSP Stapling etkinleştirdikten sonra bu süre 180ms’ye düştü. Sayfa yükleme sürelerinde genel olarak %15-20 iyileşme gözlemledik.

Bu senaryoda karşılaştığımız özel durum, sitenin arkasında load balancer kullanmasıydı. Load balancer arkasındaki her Apache instance’ının kendi OCSP cache’i olduğundan, başlangıçta bazı instancelar yanıt verirken bazıları vermiyordu.

Çözüm olarak tüm instance’lar için yapılandırmayı senkronize ettik ve OCSP cache dosyasını shared storage’a taşıdık:

# /etc/apache2/conf-available/ocsp-stapling.conf
# Load balancer arkasında birden fazla sunucu için
SSLStaplingCache shmcb:/shared/apache/stapling-cache(1048576)
SSLStaplingStandardCacheTimeout 7200
# Daha uzun cache süresi = daha az CA isteği

HTTP Strict Transport Security ile Birlikte Kullanım

OCSP Stapling’i HSTS ile birlikte kullandığınızda güvenlik ve performans açısından en iyi sonucu elde edersiniz:

<VirtualHost *:443>
    ServerName example.com

    SSLEngine On
    SSLCertificateFile /etc/ssl/certs/example.com.crt
    SSLCertificateKeyFile /etc/ssl/private/example.com.key
    SSLCertificateChainFile /etc/ssl/certs/example.com-chain.crt
    SSLCACertificateFile /etc/ssl/certs/ca-bundle.crt

    SSLUseStapling On

    # HSTS - 1 yil, subdomain dahil
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    # Ek guvenlik headerlari
    Header always set X-Content-Type-Options "nosniff"
    Header always set X-Frame-Options "SAMEORIGIN"
</VirtualHost>

Must-Staple Sertifikaları

Bazı CA’lar “Must-Staple” özelliğini destekler. Bu, sertifikanın TLS Extension olarak işaretlenmesini ve tarayıcının OCSP yanıtını zorunlu tutmasını sağlar. Bu özelliği Let’s Encrypt ile etkinleştirmek için:

# Certbot ile must-staple sertifikası alın
certbot certonly --must-staple -d example.com -d www.example.com

# Mevcut sertifikayı yenileyin
certbot renew --must-staple

Must-Staple sertifikaları daha güvenlidir çünkü MITM saldırılarında OCSP yanıtının atlatılmasını zorlaştırır. Ancak dikkat: OCSP Stapling yapılandırmanız doğru çalışmıyorsa Must-Staple sertifikasıyla siteniz erişilemez hale gelebilir. Önce normal OCSP Stapling’i kararlı şekilde çalıştırın, sonra Must-Staple’a geçin.

Birden Fazla Sertifika ile Çalışmak

Aynı sunucuda farklı domainler için farklı sertifikalar kullanıyorsanız, her birinin OCSP yanıtı ayrı ayrı cache’lenir. Yapılandırma şu şekilde olmalı:

# Her VirtualHost kendi chain dosyasına işaret etmeli
<VirtualHost *:443>
    ServerName site1.com
    SSLCertificateFile /etc/ssl/certs/site1.crt
    SSLCertificateChainFile /etc/ssl/certs/site1-chain.crt
    SSLCACertificateFile /etc/ssl/certs/site1-chain.crt
</VirtualHost>

<VirtualHost *:443>
    ServerName site2.com
    SSLCertificateFile /etc/ssl/certs/site2.crt
    SSLCertificateChainFile /etc/ssl/certs/site2-chain.crt
    SSLCACertificateFile /etc/ssl/certs/site2-chain.crt
</VirtualHost>

Cache boyutunu buna göre ayarlayın. Her domain için 15KB hesap edip toplam boyutu belirleyin.

Sonuç

OCSP Stapling, kurulumu görece basit ama performans etkisi son derece yüksek bir optimizasyondur. Özellikle Türkiye’deki kullanıcılar için CA sunucularına olan coğrafi uzaklık göz önünde bulundurulduğunda, SSL handshake sürelerinde ciddi iyileşmeler sağlar. Benim deneyimlerimde genellikle %30-60 arasında handshake süre azalması görülmüştür.

Yapılacaklar listesi olarak şunu önerebilirim: Önce mevcut SSL handshake sürelerinizi openssl s_client ve curl -w ile ölçün, baseline alın. Ardından bu yazıdaki adımları uygulayın. Bir hafta sonra aynı ölçümleri tekrarlayın. Farkı gördüğünüzde OCSP Stapling’in gerçek değerini anlayacaksınız.

Son bir uyarı: Sertifikanızı yenilediğinizde Apache’yi yeniden yüklemeyi unutmayın. Yeni sertifika için OCSP yanıtının cache’e alınması birkaç dakika sürebilir, bu süre zarfında bazı tarayıcılar OCSP yanıtsızlığı nedeniyle biraz yavaş davranabilir. Bu normaldir ve birkaç dakika içinde düzelir.

Yorum yapın