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.comadı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.
