cPanel Lisansı Olmadan Let’s Encrypt SSL: Certbot ile Ücretsiz ve Otomatik Çözüm

cPanel/WHM kullanan çoğu kişi SSL sertifikalarını AutoSSL özelliğiyle otomatik yeniliyor. Sorun şu: AutoSSL’i çalıştırabilmek için geçerli bir cPanel lisansı gerekiyor ve bu lisans aylık ciddi bir maliyet demek. Oysa AutoSSL’in arkasındaki Let’s Encrypt tamamen ücretsiz. Yani aslında ücretsiz sertifikaya erişmek için lisans parası ödüyorsunuz. Bu yazıda, cPanel’in AutoSSL’ine hiç dokunmadan, doğrudan certbot ile Let’s Encrypt sertifikası alıp Apache’a kuran ve 90 günde bir otomatik yenileyen bir sistemi adım adım kuracağız. Tüm işlemler komut satırından yapılıyor; WHM web arayüzüne girmeye gerek kalmıyor.

Ortam: AlmaLinux 8, cPanel/WHM kurulu (Apache/EA4), root SSH erişimi. Yöntem başka RHEL tabanlı dağıtımlarda da (CentOS, Rocky) benzer şekilde çalışır.
 

Önce Uyarılar (Baştan Okuyun)

Bu rehberi hazırlarken canlı bir sunucuda birkaç tuzağa denk geldim. Sizi aynı hatalardan korumak için en başa koyuyorum:
    • Eski sertifikayı WHM’den SİLMEYİN. “Manage SSL Hosts” ekranından eski AutoSSL sertifikasını silmek, o domainin SSL yapılandırma kaydını (_SSL dosyası) yok edip siteyi çökertebilir. Aşağıdaki yöntem eski sertifikanın üzerine yazar; silmeye gerek yoktur.
 
    • WordPress siteleri .well-known yolunu engelleyebilir. Bunun için klasöre özel bir .htaccess ekliyoruz.
 
    • Güvenlik katmanları (Imunify360 vb.) root sahipli dosyaları bloklayabilir. Bu yüzden doğrulama dosyasını oluşturur oluşturmaz site kullanıcısına devrediyoruz (hook script bunu yapıyor).
 
    • Her komuttan önce ne yaptığını okuyun. Acele silme/değiştirme yapmayın.
   

Adım 0: Sunucu Altyapısını Doğrulayın

Başlamadan önce sunucunuzda neyin çalıştığını görün. Aşağıdaki komutlar işletim sistemini, web sunucusunu ve certbot’un kurulu olup olmadığını gösterir:
# Isletim sistemi
cat /etc/os-release

# Web sunucusu (httpd = Apache)
ps aux | grep -E 'httpd|nginx|litespeed' | grep -v grep

# certbot kurulu mu
which certbot

# EPEL deposu aktif mi (certbot buradan gelir)
dnf repolist | grep -i epel

Adım 1: Certbot’u Kurun

Certbot kurulu değilse EPEL deposundan kurun:
dnf install epel-release -y
dnf install certbot -y

# Dogrulama
certbot --version
Certbot ve Let’s Encrypt tamamen ücretsizdir. Tek teknik sınır, aynı domain için haftada 50 sertifika gibi cömert bir limittir; normal kullanımda hiç karşılaşmazsınız.

Adım 2: Hangi Domain, Hangi Kullanıcı?

cPanel’de her domain bir kullanıcıya bağlıdır. Webroot yolu bu kullanıcı adına göre belirlenir. Eşleşmeyi görmek için:
cat /etc/userdomains
Örneğin çıktıda orneksite.com: ornekuser görürseniz, o domainin belge kökü genellikle /home/ornekuser/public_html olur. Dikkat: Kullanıcı adını yanlış yazarsanız tüm doğrulama adımları 404 verir. Emin değilseniz gerçek belge kökünü şuradan teyit edin:
grep -i "documentroot" /var/cpanel/userdata/ornekuser/orneksite.com

Adım 3: WordPress .well-known Engelini Aşın

Let’s Encrypt, domaininizin sahibi olduğunuzu doğrulamak için http://siteniz.com/.well-known/acme-challenge/<rastgele> adresine bir dosya koyup okumaya çalışır. WordPress’in .htaccess yönlendirme kuralları bu isteği yakalayıp doğrulamayı başarısız kılabilir (belirti: X-Redirect-By: WordPress başlığı ve 301 yönlendirmesi). Çözüm: .well-known klasörüne özel, rewrite’ı kapatan bir .htaccess koymak. Bu, ana sitenin .htaccess‘ine dokunmaz, sadece bu klasörü muaf tutar:
# Klasoru olustur
mkdir -p /home/ornekuser/public_html/.well-known/acme-challenge

# Sadece bu klasor icin rewrite'i kapat
cat > /home/ornekuser/public_html/.well-known/.htaccess << 'EOF'
RewriteEngine Off
EOF

# Sahipligi site kullanicisina ver
chown -R ornekuser:ornekuser /home/ornekuser/public_html/.well-known
Test edelim (kendi sunucunuzdan ve mümkünse dışarıdan):
echo "test" > /home/ornekuser/public_html/.well-known/acme-challenge/deneme.txt
chown ornekuser:ornekuser /home/ornekuser/public_html/.well-known/acme-challenge/deneme.txt

curl -I http://orneksite.com/.well-known/acme-challenge/deneme.txt
curl -I http://www.orneksite.com/.well-known/acme-challenge/deneme.txt
İkisinden de HTTP/1.1 200 OK almalısınız. 301/302 görürseniz hâlâ bir yönlendirme var demektir; devam etmeden önce bunu çözün.

Adım 4: Root Sahiplik / Güvenlik Duvarı Tuzağı

Bir tuzak daha: Certbot doğrulama dosyasını root kullanıcısı olarak oluşturur. Imunify360 gibi güvenlik katmanları, bir site dizininde aniden beliren root sahipli dosyaları “olası arka kapı” sayıp servis etmeyi reddedebilir. Sonuç yine sinsi bir 404 olur; sunucunun kendi içinden dosyaya erişebilseniz bile dışarıdan Let’s Encrypt erişemez. Çözüm: Doğrulama dosyasını biz oluşturup anında site kullanıcısına devreden bir hook script kullanmak. Certbot’un --manual modu tam da buna izin verir.
mkdir -p /root/certbot-hooks

# Dogrulama dosyasini olusturan ve sahipligini devreden hook
cat > /root/certbot-hooks/auth-orneksite.sh << 'EOF'
#!/bin/bash
WK="/home/ornekuser/public_html/.well-known/acme-challenge"
mkdir -p "$WK"
echo -n "$CERTBOT_VALIDATION" > "$WK/$CERTBOT_TOKEN"
chown ornekuser:ornekuser "$WK/$CERTBOT_TOKEN"
chmod 644 "$WK/$CERTBOT_TOKEN"
sleep 2
EOF
chmod +x /root/certbot-hooks/auth-orneksite.sh

# Dogrulama sonrasi temizlik hook'u
cat > /root/certbot-hooks/cleanup-orneksite.sh << 'EOF'
#!/bin/bash
WK="/home/ornekuser/public_html/.well-known/acme-challenge"
rm -f "$WK/$CERTBOT_TOKEN"
EOF
chmod +x /root/certbot-hooks/cleanup-orneksite.sh
$CERTBOT_VALIDATION ve $CERTBOT_TOKEN değişkenlerini certbot otomatik doldurur; sizin elle bir şey yapmanız gerekmez.

Adım 5: Sertifikayı Alın

Şimdi certbot’u bu hook’larla çalıştırıp sertifikayı alalım. Ana domain, www ve cPanel’in standart servis alt domainlerini (cpanel, webmail, mail, webdisk, cpcalendars, cpcontacts) tek sertifikada topluyoruz:
certbot certonly --manual \
  --manual-auth-hook /root/certbot-hooks/auth-orneksite.sh \
  --manual-cleanup-hook /root/certbot-hooks/cleanup-orneksite.sh \
  --preferred-challenges http \
  --cert-name orneksite.com \
  -d orneksite.com -d www.orneksite.com \
  -d cpanel.orneksite.com -d cpcalendars.orneksite.com \
  -d cpcontacts.orneksite.com -d mail.orneksite.com \
  -d webdisk.orneksite.com -d webmail.orneksite.com \
  --email info@orneksite.com --agree-tos --no-eff-email --non-interactive
Başarılı olursa Successfully received certificate mesajını ve dosyaların kaydedildiği yolu görürsünüz:
Certificate is saved at: /etc/letsencrypt/live/orneksite.com/fullchain.pem
Key is saved at:         /etc/letsencrypt/live/orneksite.com/privkey.pem

Adım 6: Sertifikayı cPanel’e Kurun (Kritik Adım)

Sertifikayı almak yetmez; Apache’ın onu sunması gerekir. Bu sunucuda Apache yapılandırmasını cPanel üretir. Bu yüzden sertifikayı Apache dosyalarına elle yazmak yerine, cPanel’in kendi API’sine kaydettirmek en doğrusudur. Bunun için whmapi1 installssl komutunu kullanıyoruz:
whmapi1 installssl \
  domain=orneksite.com \
  crt=@/etc/letsencrypt/live/orneksite.com/cert.pem \
  key=@/etc/letsencrypt/live/orneksite.com/privkey.pem \
  cabundle=@/etc/letsencrypt/live/orneksite.com/chain.pem
İki önemli ayrıntı: 1. Dosya yollarının başındaki @ işareti, whmapi1‘e “bu değeri dosyadan oku” der. Çok satırlı sertifika içeriğinin kabuk tarafından bozulmasını önler. 2. whmapi1 bir komut satırı aracıdır ve lisans doğrulaması yapan cpsrvd servisinden bağımsız çalışır. Yani WHM web paneline giremeseniz bile bu komut sertifikayı kurar.
Çıktıda result: 1 ve status: 1 görmeniz başarı demektir. cPanel bu noktada gerekli SSL yapılandırma kaydını (_SSL) yeniden oluşturur ve Apache’ı arka planda yeniden başlatır.

Adım 7: Doğrulayın

sleep 5

# Sertifika tarihleri ve verici
echo | openssl s_client -connect orneksite.com:443 -servername orneksite.com 2>/dev/null \
  | openssl x509 -noout -dates -issuer

# Kapsanan domainler (SAN listesi)
echo | openssl s_client -connect orneksite.com:443 -servername orneksite.com 2>/dev/null \
  | openssl x509 -noout -text | grep -A2 "Subject Alternative Name"
notBefore tarihinin bugünü, issuer alanının Let's Encrypt‘i göstermesi ve SAN listesinde 8 domainin de görünmesi gerekir. Son olarak tarayıcıdan https://orneksite.com adresini açıp yeşil kilidi görün.

Adım 8: Otomatik Yenilemeyi Kurun (En Önemli Adım)

Certbot sertifikayı 60. günde arka planda otomatik yeniler; ancak varsayılan olarak sadece /etc/letsencrypt/live/ klasörünü günceller. cPanel’in bundan haberi olmaz, dolayısıyla Apache eski sertifikayı sunmaya devam eder. Bunu önlemek için, her yenilemede installssl‘i tekrar çalıştıran bir deploy-hook ekliyoruz:
mkdir -p /etc/letsencrypt/renewal-hooks/deploy

cat > /etc/letsencrypt/renewal-hooks/deploy/orneksite.com.sh << 'EOF'
#!/bin/bash
if [[ "$RENEWED_LINEAGE" == *"orneksite.com"* ]]; then
  whmapi1 installssl \
    domain=orneksite.com \
    crt=@"$RENEWED_LINEAGE/cert.pem" \
    key=@"$RENEWED_LINEAGE/privkey.pem" \
    cabundle=@"$RENEWED_LINEAGE/chain.pem"
fi
EOF
chmod +x /etc/letsencrypt/renewal-hooks/deploy/orneksite.com.sh
Şimdi tüm yenileme zincirini gerçek bir yenileme beklemeden test edin. --dry-run gerçek sertifika üretmez, sadece süreci simüle eder:
certbot renew --cert-name orneksite.com --dry-run
Congratulations, all simulated renewals succeeded mesajını görürseniz, bu domain artık 90 günde bir kendi kendine yenilenecek; bir daha elle dokunmanıza gerek kalmayacak.

Adım 9: AutoSSL’i Bu Hesap İçin Kapatın

Son olarak, cPanel’in AutoSSL’i periyodik taramalarında bu domaine tekrar müdahale etmesin diye onu devre dışı bırakın. Bu işlemi WHM arayüzünden yapmak en güvenlisidir:
  1. WHM → SSL/TLS → Manage AutoSSL
  2. Üst sekmelerden Manage Users
  3. İlgili kullanıcıyı bulun
  4. O kullanıcı için Disable AutoSSL seçin
  5. Kullanıcının solundaki kutuyu işaretleyip “Disable AutoSSL on selected 1 users” butonuna basın
Bu yalnızca ilgili hesabı etkiler; diğer hesaplarda AutoSSL çalışmaya devam eder. Tekrar hatırlatma: eski sertifikayı silmeyininstallssl zaten üzerine yazdı.

Bonus: Tüm İşi Tek Komuta İndiren Script

Birden çok domaininiz varsa, yukarıdaki adımları her seferinde tek tek yapmak yorucu olur. Aşağıdaki script tek bir domain için 5 adımı (hazırlık, hook, sertifika alma, kurma, yenileme hook’u) otomatik yapar. Bilinçli olarak silme adımı içermez.
#!/bin/bash
# Kullanim:  ./ssl-kur.sh <domain> <cpanel_kullanici>
# Ornek:     ./ssl-kur.sh orneksite.com ornekuser

set -e
DOMAIN="$1"
USER="$2"

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

WEBROOT="/home/$USER/public_html"
if [[ ! -d "$WEBROOT" ]]; then
  echo "HATA: $WEBROOT bulunamadi. Kullanici adi dogru mu?"
  exit 1
fi

echo "=== [$DOMAIN] Adim 1: .well-known hazirligi ==="
mkdir -p "$WEBROOT/.well-known/acme-challenge"
cat > "$WEBROOT/.well-known/.htaccess" << 'HTACCESS'
RewriteEngine Off
HTACCESS
chown -R "$USER:$USER" "$WEBROOT/.well-known"

echo "=== [$DOMAIN] Adim 2: hook scriptleri ==="
mkdir -p /root/certbot-hooks
AUTH="/root/certbot-hooks/auth-$DOMAIN.sh"
CLEAN="/root/certbot-hooks/cleanup-$DOMAIN.sh"

cat > "$AUTH" << HOOK
#!/bin/bash
WK="/home/$USER/public_html/.well-known/acme-challenge"
mkdir -p "\$WK"
echo -n "\$CERTBOT_VALIDATION" > "\$WK/\$CERTBOT_TOKEN"
chown $USER:$USER "\$WK/\$CERTBOT_TOKEN"
chmod 644 "\$WK/\$CERTBOT_TOKEN"
sleep 2
HOOK
chmod +x "$AUTH"

cat > "$CLEAN" << HOOK
#!/bin/bash
WK="/home/$USER/public_html/.well-known/acme-challenge"
rm -f "\$WK/\$CERTBOT_TOKEN"
HOOK
chmod +x "$CLEAN"

echo "=== [$DOMAIN] Adim 3: certbot ile sertifika alma ==="
certbot certonly --manual \
  --manual-auth-hook "$AUTH" \
  --manual-cleanup-hook "$CLEAN" \
  --preferred-challenges http \
  --cert-name "$DOMAIN" \
  -d "$DOMAIN" -d "www.$DOMAIN" \
  -d "cpanel.$DOMAIN" -d "cpcalendars.$DOMAIN" \
  -d "cpcontacts.$DOMAIN" -d "mail.$DOMAIN" \
  -d "webdisk.$DOMAIN" -d "webmail.$DOMAIN" \
  --email "info@$DOMAIN" --agree-tos --no-eff-email --non-interactive

echo "=== [$DOMAIN] Adim 4: cPanel'e kurma ==="
whmapi1 installssl \
  domain="$DOMAIN" \
  crt=@/etc/letsencrypt/live/"$DOMAIN"/cert.pem \
  key=@/etc/letsencrypt/live/"$DOMAIN"/privkey.pem \
  cabundle=@/etc/letsencrypt/live/"$DOMAIN"/chain.pem

echo "=== [$DOMAIN] Adim 5: otomatik yenileme hook'u ==="
cat > "/etc/letsencrypt/renewal-hooks/deploy/$DOMAIN.sh" << HOOK
#!/bin/bash
if [[ "\$RENEWED_LINEAGE" == *"$DOMAIN"* ]]; then
  whmapi1 installssl \\
    domain=$DOMAIN \\
    crt=@"\$RENEWED_LINEAGE/cert.pem" \\
    key=@"\$RENEWED_LINEAGE/privkey.pem" \\
    cabundle=@"\$RENEWED_LINEAGE/chain.pem"
fi
HOOK
chmod +x "/etc/letsencrypt/renewal-hooks/deploy/$DOMAIN.sh"

echo ""
echo "=== [$DOMAIN] TAMAMLANDI ==="
sleep 5
echo | openssl s_client -connect "$DOMAIN":443 -servername "$DOMAIN" 2>/dev/null \
  | openssl x509 -noout -dates -issuer
echo "NOT: AutoSSL'i bu hesap ($USER) icin WHM'den DISABLE etmeyi unutma."
echo "NOT: Sertifikayi WHM'den SILME - installssl zaten uzerine yazdi."
Script’i sunucuya kaydedip çalıştırılabilir yapın:
chmod +x /root/ssl-kur.sh
/root/ssl-kur.sh orneksite.com ornekuser
Windows’ta düzenlediyseniz dikkat: Dosyayı Windows’ta oluşturup sunucuya attıysanız satır sonları bozuk olabilir ve /bin/bash^M: bad interpreter hatası alırsınız. Tek komutla düzeltin:
sed -i 's/\r$//' /root/ssl-kur.sh

Sık Karşılaşılan Hatalar

  • Tüm domainler 404 veriyor: Büyük ihtimalle kullanıcı adını / webroot’u yanlış girdiniz. /etc/userdomains ve documentroot değerini kontrol edin.
  • Sadece 404, sunucudan curl 200 dönüyor: Güvenlik katmanı (Imunify360) root sahipli dosyayı blokluyor olabilir. Hook script’in chown satırının çalıştığından emin olun.
  • 301 yönlendirmesi ve X-Redirect-By: WordPress: .well-known klasöründeki RewriteEngine Off içeren .htaccess eksik.
  • installssl sonrası site “güvensiz”: Apache’ın yeniden başlamasını birkaç saniye bekleyin, sonra tekrar kontrol edin.

Sonuç

Bu yöntemle SSL sertifikalarınız için cPanel lisansına bağımlılığı ortadan kaldırdınız. Certbot sertifikayı alıyor, whmapi1 installssl cPanel’e kaydediyor ve deploy-hook 60 günde bir otomatik yeniliyor; hepsi komut satırından, WHM paneline hiç girmeden çalışıyor. Let’s Encrypt ücretsiz olduğu için tek maliyetiniz birkaç dakikalık kurulum zamanı oluyor. Not: Bu rehber cPanel’in kurulu olduğu ama SSL yönetimini komut satırından yaptığınız senaryoyu anlatır. Hesap ekleme gibi işler için WHM’e ihtiyaç duyarsanız, o işlemleri de komut satırı araçlarıyla yapmanın yolları vardır.

Elif Yaldız
Elif Yaldız
2. Sınıf Elektrik ve Elektronik Mühendisliği Öğrencisi. Burada sizlerle bilgi alış verişinde bulunmaktan memnuniyet duyuyorum.
guest
0 Yorum
Arıcılık Malzemeleri

Yeni Yazılar

Mühendislik Maaşları

Bunları Gördünüz mü?