OpenLiteSpeed ile Let’s Encrypt Wildcard Sertifika Kurulumu

Wildcard sertifikalar, özellikle çok sayıda subdomain yöneten sysadmin’ler için hayat kurtarıcıdır. *.example.com şeklinde tek bir sertifika ile api.example.com, mail.example.com, staging.example.com gibi onlarca subdomaini kapsayabilirsiniz. Ama bu kolaylığın bir bedeli var: Let’s Encrypt wildcard sertifika almak için DNS-01 challenge yöntemini kullanmak zorundasınız. OpenLiteSpeed ile bu süreci düzgün kurmak, başta biraz karmaşık görünse de bir kez oturtunca iş akışınızı ciddi ölçüde sadeleştirir.

Bu yazıda Ubuntu 22.04 üzerinde OpenLiteSpeed ile Let’s Encrypt wildcard sertifika alma, yapılandırma ve otomatik yenileme sürecini adım adım ele alacağız.

Neden Wildcard Sertifika?

Standart Let’s Encrypt sertifikası aldığınızda, her subdomain için ayrı sertifika almanız gerekir ya da Subject Alternative Names (SAN) ile tek bir sertifikaya birden fazla domain yazmanız gerekir. Ama yarın yeni bir subdomain açtığınızda ne yapacaksınız? Sertifikayı yeniden düzenleyeceksiniz.

Wildcard sertifikası ile bu sorun ortadan kalkar. .example.com aldığınızda, mevcut ve gelecekteki tüm birinci seviye subdomainler bu sertifika kapsamına girer. Ancak dikkat: .example.com sertifikası sub.api.example.com gibi ikinci seviye subdomainleri kapsamaz. Bunun için ayrıca *.api.example.com gibi bir wildcard daha almanız gerekir.

DNS-01 Challenge Nasıl Çalışır?

Let’s Encrypt, wildcard sertifika doğrulaması için HTTP-01 ya da TLS-ALPN-01 yöntemlerini kullanmaz. Sadece DNS-01 yöntemini kabul eder. Bu yöntemde:

  • Let’s Encrypt size bir token verir
  • Siz bu token’ı _acme-challenge.example.com adında bir TXT kaydı olarak DNS’inize yazarsınız
  • Let’s Encrypt bu TXT kaydını sorgular ve doğrulama tamamlanır

Bu işlemi manuel yapabileceğiniz gibi, DNS sağlayıcınızın API’si üzerinden otomatize de edebilirsiniz. Cloudflare, Route53, DigitalOcean DNS gibi büyük sağlayıcıların hepsi için Certbot plugin’leri mevcut.

Sistem Hazırlığı

Başlamadan önce sunucunuzun güncel olduğundan emin olun:

sudo apt update && sudo apt upgrade -y
sudo apt install -y certbot python3-certbot-dns-cloudflare

Eğer Cloudflare dışında bir DNS sağlayıcı kullanıyorsanız, ilgili plugin’i kurmanız gerekir:

# Route53 için
sudo apt install -y python3-certbot-dns-route53

# DigitalOcean için
sudo apt install -y python3-certbot-dns-digitalocean

# Namecheap gibi desteklenmeyen sağlayıcılar için manuel yöntem kullanacağız

OpenLiteSpeed kurulu değilse önce onu kuralım:

wget -O - https://repo.litespeed.sh | sudo bash
sudo apt install -y openlitespeed
sudo systemctl enable lsws
sudo systemctl start lsws

Cloudflare API Token Oluşturma

Cloudflare kullanıyorsanız, Certbot’un DNS kayıtlarını otomatik yönetebilmesi için bir API token oluşturmanız gerekiyor. Bu işlem için Cloudflare dashboard’una gidin:

  • My Profile > API Tokens > Create Token yolunu izleyin
  • Edit zone DNS template’ini seçin
  • Zone Resources kısmında ilgili domaininizi seçin
  • Token’ı oluşturun ve bir yere not edin

Ardından bu token’ı bir konfigürasyon dosyasına kaydedin:

sudo mkdir -p /etc/letsencrypt/cloudflare
sudo nano /etc/letsencrypt/cloudflare/credentials.ini

Dosya içeriği şu şekilde olmalı:

# Cloudflare API token
dns_cloudflare_api_token = BURAYA_API_TOKEN_YAZIN

Dosya izinlerini kısıtlayın, bu dosya hassas bilgi içeriyor:

sudo chmod 600 /etc/letsencrypt/cloudflare/credentials.ini
sudo chown root:root /etc/letsencrypt/cloudflare/credentials.ini

Wildcard Sertifika Alma

Artık sertifikayı alabiliriz. --dns-cloudflare-propagation-seconds parametresi, DNS değişikliklerinin yayılması için bekleme süresini belirler. DNS propagation bazen yavaş olabildiği için bunu en az 60 saniye tutmanızı öneririm:

sudo certbot certonly 
  --dns-cloudflare 
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini 
  --dns-cloudflare-propagation-seconds 60 
  -d example.com 
  -d "*.example.com" 
  --email [email protected] 
  --agree-tos 
  --non-interactive

Başarılı bir çıktı şu şekilde görünür:

Saving debug log to /var/log/letsencrypt/letsencrypt.log
Requesting a certificate for example.com and *.example.com
Waiting 60 seconds for DNS changes to propagate
Successfully received certificate.
Certificate is saved at: /etc/letsencrypt/live/example.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/example.com/privkey.pem
This certificate expires on 2024-09-15.

Sertifika dosyalarınız /etc/letsencrypt/live/example.com/ dizininde oluşacak:

  • fullchain.pem: Sertifika + ara sertifikalar zinciri (bu dosyayı sunucuya tanımlarsınız)
  • privkey.pem: Özel anahtar
  • cert.pem: Sadece domain sertifikası
  • chain.pem: Sadece ara sertifikalar

Manuel DNS-01 Challenge Yöntemi

Cloudflare veya desteklenen bir DNS sağlayıcı kullanmıyorsanız, manuel yöntemi kullanabilirsiniz. Bu yöntemde otomatik yenileme olmayacak, ama en azından sertifikayı alabilirsiniz:

sudo certbot certonly 
  --manual 
  --preferred-challenges dns 
  -d example.com 
  -d "*.example.com" 
  --email [email protected] 
  --agree-tos

Bu komut çalıştığında Certbot size şöyle bir çıktı verecek:

Please deploy a DNS TXT record under the name:
_acme-challenge.example.com
with the following value:
xKs9mHjPQr2vLnT4wBdEfGhIiJkLmNoP

Before continuing, verify the TXT record has been deployed.

Bu TXT kaydını DNS yönetim panelinizde oluşturun, ardından kaydın yayıldığını teyit edin:

dig TXT _acme-challenge.example.com +short

Beklediğiniz değeri gördükten sonra Certbot’ta Enter’a basın ve süreç tamamlanır.

OpenLiteSpeed’de Sertifikayı Tanımlama

Sertifikalar hazır, şimdi OpenLiteSpeed’e tanıtma vakti. OpenLiteSpeed’i iki şekilde yapılandırabilirsiniz: web admin paneli üzerinden ya da konfigürasyon dosyalarını doğrudan düzenleyerek.

Web Admin Paneli Üzerinden

OpenLiteSpeed admin paneline https://sunucu-ip:7080 adresinden erişin. Varsayılan kullanıcı adı admin, şifreyi /usr/local/lsws/conf/htpasswd dosyasından görebilirsiniz.

Panel üzerinden Virtual Hosts > example.com > SSL bölümüne gidin ve şu değerleri girin:

  • Private Key File: /etc/letsencrypt/live/example.com/privkey.pem
  • Certificate File: /etc/letsencrypt/live/example.com/fullchain.pem
  • CA Certificate File: /etc/letsencrypt/live/example.com/chain.pem

Konfigürasyon Dosyası Üzerinden

Doğrudan konfigürasyon dosyasını düzenlemek bazen daha hızlı ve tekrarlanabilir bir yöntem. Virtual host konfigürasyon dosyanızı açın:

sudo nano /usr/local/lsws/conf/vhosts/example.com/vhconf.conf

SSL konfigürasyonunu şu şekilde ekleyin:

vhssl  {
  keyFile                 /etc/letsencrypt/live/example.com/privkey.pem
  certFile                /etc/letsencrypt/live/example.com/fullchain.pem
  cacertFile              /etc/letsencrypt/live/example.com/chain.pem
  certChain               1
  sslProtocol             24
  enableSpdy              15
  enableQuic              1
}

keyFile: Özel anahtar dosya yolu certFile: Tam sertifika zinciri cacertFile: CA sertifika dosyası certChain: Sertifika zincirini etkinleştir (1 = açık) sslProtocol: 24, TLS 1.2 ve TLS 1.3’ü etkinleştirir enableSpdy: HTTP/2 ve SPDY desteği enableQuic: HTTP/3 (QUIC) desteği

Değişiklikleri uygulamak için OpenLiteSpeed’i graceful restart yapın:

sudo /usr/local/lsws/bin/lswsctrl restart

Ya da admin panelindeki “Graceful Restart” butonunu kullanabilirsiniz. Graceful restart, mevcut bağlantıları kesmeden yeniden başlatır, bu yüzden production ortamlarda tercih edilmeli.

Listener Konfigürasyonu

HTTPS’nin çalışması için 443 portunda bir listener tanımlı olması gerekiyor. httpd_config.conf dosyasını kontrol edin:

sudo nano /usr/local/lsws/conf/httpd_config.conf

443 portu için listener şu şekilde görünmeli:

listener HTTPS {
  address                 *:443
  secure                  1
  keyFile                 /etc/letsencrypt/live/example.com/privkey.pem
  certFile                /etc/letsencrypt/live/example.com/fullchain.pem
  cacertFile              /etc/letsencrypt/live/example.com/chain.pem
  
  map                     example.com example.com
}

Eğer birden fazla domain için wildcard sertifika alıyorsanız ve hepsini aynı listener’a bağlamak istiyorsanız, SNI (Server Name Indication) desteğini etkinleştirdiğinizden emin olun. Modern tarayıcılar SNI’yi destekler, dolayısıyla sorun yaşamazsınız.

Sertifika Doğrulama

Sertifikanın doğru çalışıp çalışmadığını test etmek için birkaç yöntem kullanabilirsiniz:

# SSL Labs benzeri lokal test
openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -text | grep -A 2 "Subject Alternative Name"

# Sertifika geçerlilik tarihi
echo | openssl s_client -connect example.com:443 -servername example.com 2>/dev/null | openssl x509 -noout -dates

# Wildcard'ın subdomain için çalışıp çalışmadığı
echo | openssl s_client -connect api.example.com:443 -servername api.example.com 2>/dev/null | openssl x509 -noout -subject

Sertifika doğru kurulmuşsa, Subject Alternative Names bölümünde hem example.com hem de *.example.com‘u göreceksiniz.

Otomatik Yenileme Kurulumu

Let’s Encrypt sertifikaları 90 günde bir sona erer. Otomatik yenileme için Certbot’un systemd timer veya cron job’unu kullanabilirsiniz. Modern Ubuntu kurulumlarında systemd timer zaten aktif gelir:

sudo systemctl status certbot.timer

Eğer aktif değilse etkinleştirin:

sudo systemctl enable certbot.timer
sudo systemctl start certbot.timer

Yenileme sonrasında OpenLiteSpeed’i otomatik restart etmek için bir hook scripti yazacağız. Bu kritik adım, pek çok sysadmin’in atladığı ve “sertifika yenilendi ama site hala eski sertifikayla çalışıyor” sorununa yol açan bir şey:

sudo nano /etc/letsencrypt/renewal-hooks/deploy/restart-openlitespeed.sh

Script içeriği:

#!/bin/bash
# OpenLiteSpeed restart hook - Certbot yenileme sonrasi calisir

LOG_FILE="/var/log/letsencrypt-deploy.log"
DATE=$(date '+%Y-%m-%d %H:%M:%S')

echo "[$DATE] Sertifika yenilendi, OpenLiteSpeed yeniden baslatiliyor..." >> $LOG_FILE

/usr/local/lsws/bin/lswsctrl restart

if [ $? -eq 0 ]; then
    echo "[$DATE] OpenLiteSpeed basariyla yeniden baslatildi." >> $LOG_FILE
else
    echo "[$DATE] HATA: OpenLiteSpeed yeniden baslatilamadi!" >> $LOG_FILE
    # Opsiyonel: Mail bildirimi
    # echo "OLS restart failed" | mail -s "SSL Renewal Error" [email protected]
fi

Script’e çalıştırma yetkisi verin:

sudo chmod +x /etc/letsencrypt/renewal-hooks/deploy/restart-openlitespeed.sh

Yenileme işlemini test etmek için:

sudo certbot renew --dry-run

--dry-run parametresi gerçek sertifika almadan sürecin başarıyla tamamlanıp tamamlanmayacağını simüle eder. Çıktıda “The dry run was successful” görüyorsanız, otomatik yenileme de çalışacak demektir.

Çoklu Subdomain Senaryosu

Gerçek dünyada genellikle birden fazla virtual host için aynı wildcard sertifikayı kullanmak istiyoruz. Diyelim ki api.example.com, admin.example.com ve staging.example.com subdomainleri var.

Her virtual host için ayrı vhconf dosyası oluşturun ve hepsinde aynı sertifika dosyalarını işaret edin:

# api.example.com için
sudo nano /usr/local/lsws/conf/vhosts/api.example.com/vhconf.conf
docRoot                   /var/www/api
vhDomain                  api.example.com

vhssl  {
  keyFile                 /etc/letsencrypt/live/example.com/privkey.pem
  certFile                /etc/letsencrypt/live/example.com/fullchain.pem
  cacertFile              /etc/letsencrypt/live/example.com/chain.pem
  certChain               1
}

Aynı yapıyı admin.example.com ve staging.example.com için tekrarlayın. Hepsi aynı wildcard sertifikayı kullandığı için tek bir yenileme işlemi tüm subdomainlerinizi kapsar.

HTTP’den HTTPS’ye Yönlendirme

SSL sertifikanız hazır, şimdi HTTP isteklerini otomatik olarak HTTPS’ye yönlendirmeliyiz. OpenLiteSpeed’de bu işlemi rewrite kuralları ile yapıyoruz:

sudo nano /usr/local/lsws/conf/vhosts/example.com/vhconf.conf

Mevcut konfigürasyona rewrite bölümünü ekleyin:

rewrite  {
  enable                  1
  rules                   <<<END_rules
RewriteCond %{HTTPS} !on
RewriteCond %{HTTP:X-Forwarded-Proto} !https
RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
END_rules
}

X-Forwarded-Proto kontrolü, eğer bir load balancer veya CDN arkasındaysanız sonsuz yönlendirme döngüsüne girmenizi önler.

Sorun Giderme

Sertifika Alınırken DNS Propagation Hatası

Bu en sık karşılaşılan sorun. DNS değişikliklerinin yayılması bazen 5 dakikayı aşabilir. Propagation süresini artırmayı deneyin:

sudo certbot certonly 
  --dns-cloudflare 
  --dns-cloudflare-credentials /etc/letsencrypt/cloudflare/credentials.ini 
  --dns-cloudflare-propagation-seconds 120 
  -d example.com 
  -d "*.example.com"

OpenLiteSpeed Sertifikayı Görmüyor

Sertifika yollarının doğru olduğunu ve OpenLiteSpeed kullanıcısının bu dosyaları okuyabildiğini kontrol edin:

sudo ls -la /etc/letsencrypt/live/example.com/
sudo ls -la /etc/letsencrypt/archive/example.com/

# OpenLiteSpeed genellikle nobody kullanıcısıyla çalışır
sudo -u nobody cat /etc/letsencrypt/live/example.com/fullchain.pem

Eğer izin hatası alıyorsanız:

sudo chmod 755 /etc/letsencrypt/live/
sudo chmod 755 /etc/letsencrypt/archive/
sudo chmod 644 /etc/letsencrypt/live/example.com/*.pem
sudo chmod 640 /etc/letsencrypt/live/example.com/privkey.pem

Certbot Renew Sonrası Eski Sertifika Kullanılıyor

Bu, deploy hook’un çalışmadığı anlamına gelir. Hook script’ini manuel test edin:

sudo bash /etc/letsencrypt/renewal-hooks/deploy/restart-openlitespeed.sh
cat /var/log/letsencrypt-deploy.log

Script düzgün çalışıyorsa, yenileme sürecinin hook’u tetikleyip tetiklemediğini kontrol edin:

sudo certbot renew --dry-run --deploy-hook /etc/letsencrypt/renewal-hooks/deploy/restart-openlitespeed.sh

Güvenlik Sertleştirmesi

Sertifikayı aldıktan sonra birkaç ek güvenlik adımı atmanızı öneririm. OpenLiteSpeed’de TLS konfigürasyonunuzu güçlendirin:

sudo nano /usr/local/lsws/conf/httpd_config.conf

SSL global ayarlarına şunları ekleyin:

SSLDefaultCiphers ECDH+AESGCM:ECDH+AES256:ECDH+AES128:!aDH:!aECDH:!DSS:!3DES:!NULL:!eNULL:!EXPORT:!MEDIUM:!LOW:!RC4
SSLProtocol -ALL +TLSv1.2 +TLSv1.3

HSTS (HTTP Strict Transport Security) header’ı eklemek için virtual host konfigürasyonuna:

headers  {
  header                  Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"
  header                  X-Content-Type-Options "nosniff"
  header                  X-Frame-Options "SAMEORIGIN"
}

Bu ayarlar tarayıcıların sitenize her zaman HTTPS üzerinden bağlanmasını zorunlu kılar ve çeşitli saldırı vektörlerini kapatır.

Sertifika İzleme

90 günlük son kullanma tarihini takip etmek için basit bir monitoring scripti:

sudo nano /usr/local/bin/ssl-check.sh
#!/bin/bash
DOMAIN="example.com"
THRESHOLD=30
CURRENT_DATE=$(date +%s)
EXPIRY_DATE=$(echo | openssl s_client -connect ${DOMAIN}:443 -servername ${DOMAIN} 2>/dev/null | openssl x509 -noout -enddate 2>/dev/null | cut -d= -f2)
EXPIRY_EPOCH=$(date -d "${EXPIRY_DATE}" +%s)
DAYS_REMAINING=$(( ($EXPIRY_EPOCH - $CURRENT_DATE) / 86400 ))

if [ $DAYS_REMAINING -lt $THRESHOLD ]; then
    echo "UYARI: ${DOMAIN} sertifikasi ${DAYS_REMAINING} gun icinde surecek!" | mail -s "SSL Sertifika Uyarisi" [email protected]
    echo "$(date): UYARI - ${DOMAIN} icin ${DAYS_REMAINING} gun kaldi" >> /var/log/ssl-check.log
else
    echo "$(date): OK - ${DOMAIN} icin ${DAYS_REMAINING} gun kaldi" >> /var/log/ssl-check.log
fi
sudo chmod +x /usr/local/bin/ssl-check.sh
# Crontab'a ekleyin - her gün saat 09:00'da calissin
echo "0 9 * * * root /usr/local/bin/ssl-check.sh" | sudo tee /etc/cron.d/ssl-check

Sonuç

OpenLiteSpeed ile Let’s Encrypt wildcard sertifika kurulumu, ilk bakışta karmaşık görünse de aslında birkaç temel adımdan oluşuyor: DNS API erişimini ayarla, sertifikayı al, OpenLiteSpeed’e tanıt, otomatik yenilemeyi konfigüre et.

Bu yapıyı bir kez kurduğunuzda, yeni bir subdomain açmak artık sertifika meselesi olmaktan çıkar. app.example.com‘u DNS’e ekleyin, OpenLiteSpeed’de virtual host oluşturun ve mevcut wildcard sertifikayı işaret edin, olur biter. Sertifika yenileme de tamamen otomatik çalışır, müdahale gerektirmez.

Cloudflare dışında bir DNS sağlayıcı kullanıyorsanız, muhtemelen acme.sh gibi alternatif bir ACME istemcisine bakmanız gerekecek. Acme.sh, çok daha fazla DNS sağlayıcıyı destekliyor ve bazı sysadmin’lerin Certbot’a tercih ettiği bir araç. Ama temel mantık aynı: DNS-01 challenge, otomatik TXT kaydı yönetimi, deploy hook ile sunucu restart.

Production ortamında bu kurulumu uygulamadan önce staging ortamında --dry-run ile test etmeyi ihmal etmeyin. Ayrıca /etc/letsencrypt/ dizinini yedekleme planınıza dahil etmeyi unutmayın; sertifika özel anahtarlarını kaybetmek ciddi bir operasyonel sorun yaratabilir.

Bir yanıt yazın

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