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.