Cpanel Web Sunucusunda Otomatik SSL Sertifikası Alma ve Apache VirtualHost Yapılandırması
Bu makalede, bir web sunucusunda Let’s Encrypt üzerinden SSL sertifikası almayı ve Apache web sunucusunda ilgili domain için bir VirtualHost yapılandırması yapmayı sağlayan bir Bash scriptinin kullanımını adım adım inceleyeceğiz. Bu script, yeni domain eklemek, SSL sertifikası almak ve VirtualHost yapılandırmasını oluşturmak gibi adımları otomatik hale getirir.
Cpanel sunucusun da çalışan bir projeye dışarıdan yönlendirilen alan adı için cpanel de account oluşturmadan projeyi çalıştırmak ve ssl sertifikası almak için aşağıdaki adımların yapılması gerekir.
1. Bash Scriptinin İşlevi
Yukarıdaki script, yeni eklenen alan adları için SSL sertifikası almayı ve bu alan adlarını Apache VirtualHost yapılandırmalarına ekleyip etkinleştirmeyi amaçlar. Ayrıca Apache sunucusunu her işlemden sonra yeniden başlatır.
2. Scriptin Çalışma Adımları
a. Alan Adı Listesini Okuma
Script, /etc/domains.txt
dosyasından alan adlarını okur. Her satırda bir alan adı olacak şekilde bu dosyada bulunan domain’ler işlenir:
DOMAINS_FILE="/etc/domains.txt"
b. Log Dosyası Belirleme
Sertifika alma ve VirtualHost yapılandırma işlemleri sırasında oluşabilecek hataları kaydetmek için bir log dosyası tanımlanmıştır:
LOG_FILE="/var/log/certbot-auto.log"
c. Certbot Kullanarak SSL Sertifikası Alma
Her bir domain için Let’s Encrypt üzerinden bir SSL sertifikası almak için certbot
komutu kullanılır. Daha önce alınmış bir sertifika olup olmadığını kontrol eder ve eğer yoksa sertifika alır:
CERTBOT_CMD="/usr/bin/certbot"
if $CERTBOT_CMD certificates | grep -q "$DOMAIN"; then
echo "$(date) - $DOMAIN için zaten bir SSL sertifikası mevcut." >> "$LOG_FILE"
else
echo "$(date) - $DOMAIN için SSL sertifikası alınıyor..." >> "$LOG_FILE"
$CERTBOT_CMD certonly --webroot -w "$WEBROOT_PATH" -d "$DOMAIN" -d "www.$DOMAIN" --non-interactive --agree-tos --email "$EMAIL" >> "$LOG_FILE" 2>&1
fi
d. Apache VirtualHost Yapılandırması
Script, her domain için ayrı bir VirtualHost yapılandırma dosyası oluşturur ve hem HTTP hem de HTTPS bağlantılarını destekleyecek şekilde yapılandırır. 80 numaralı portta gelen HTTP istekleri, 443 numaralı HTTPS portuna yönlendirilir:
conf_file="${apache_available}/${DOMAIN}.conf"
cat <<EOL > "$conf_file"
<VirtualHost 192.168.100.100:80>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot $WEBROOT_PATH
ServerAdmin root@sv1.server.com
# HTTP'den HTTPS'e yönlendirme
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^ https://%{HTTP_HOST}%{REQUEST_URI} [L,R=301]</VirtualHost>
<VirtualHost 192.168.100.100:443>
ServerName $DOMAIN
ServerAlias www.$DOMAIN
DocumentRoot $WEBROOT_PATH
ServerAdmin root@sv1.server.com
# SSL Ayarları
SSLEngine on
SSLCertificateFile $ssl_dir/$DOMAIN/fullchain.pem
SSLCertificateKeyFile $ssl_dir/$DOMAIN/privkey.pem
</VirtualHost>
EOL
e. Apache Yapılandırmasının Etkinleştirilmesi
Apache’de yeni oluşturulan her VirtualHost yapılandırması, a2ensite
komutu kullanılarak etkinleştirilir ve sonrasında Apache yeniden başlatılır:
sudo a2ensite "${DOMAIN}.conf"
sudo systemctl restart httpd
3. Scriptin Kurulumu ve Çalıştırılması
Scriptin çalıştırılabilmesi için aşağıdaki adımları izleyebilirsiniz:
a. Script Dosyasını Oluşturma
Öncelikle, scriptin bulunduğu dizinde bir dosya oluşturun ve bu dosyaya yukarıdaki scripti yapıştırın. Örneğin, scripti /usr/local/bin
altına kaydedelim:
sudo nano /usr/local/bin/auto_ssl.sh
Scripti dosyanın içine yapıştırdıktan sonra kaydedin.
b. Çalıştırılabilir İzinleri Verme
Scripti çalıştırılabilir hale getirmek için aşağıdaki komutu kullanın:
sudo chmod +x /usr/local/bin/auto_ssl.sh
c. Scripti Çalıştırma
Scripti çalıştırmak için aşağıdaki komutu kullanabilirsiniz:
sudo /usr/local/bin/auto_ssl.sh
Bu komut, domains.txt
dosyasındaki tüm alan adları için SSL sertifikası alacak ve Apache yapılandırmalarını yapacaktır.
4. Crontab ile Zamanlanmış Görev Olarak Ayarlama
Bu scripti her 6 saatte bir otomatik olarak çalıştırmak istiyorsanız, bir crontab
görevi ekleyebilirsiniz. Terminalde aşağıdaki komutu çalıştırarak crontab’ı düzenleyin:
sudo crontab -e
Aşağıdaki satırı ekleyerek scriptin her 6 saatte bir çalışmasını sağlayın:
0 */6 * * * /bin/bash /usr/local/bin/auto_ssl.sh >> /var/log/server.log 2>&1
Apache’nin Erişeceği Dosya ve Dizinlere Ekstra İzin Verme (ACL Kullanarak)
Eğer Apache’nin belirli dizinlere erişim sağlamasını istiyor, fakat dizini 750 izni ile tutmak istiyorsanız, ACL (Access Control Lists) kullanarak Apache’ye ekstra izin verebilirsiniz.
- ACL desteğinin etkin olup olmadığını kontrol edin
mount | grep acl
Eğer etkin değilse,/etc/fstab
dosyasına eklemeniz gerekebilir. - ACL kullanarak user dizinini Apache kullanıcısına açın:
setfacl -m u:nobody:rx /home/user/public_html
Eğer Apache kullanıcısıapache
ise:setfacl -m u:apache:rx /home/user/public_html
Bu komutla Apache’ye okuma ve çalıştırma izni vermiş olursunuz. - Apache’yi yeniden başlatın:
systemctl restart httpd
5. Sonuç
Bu makalede, bir web sunucusunda Let’s Encrypt sertifikalarını almak ve Apache VirtualHost yapılandırmalarını otomatik hale getirmek için oluşturulan bir Bash scriptini detaylı olarak inceledik. Bu script, sunucunuzdaki işlemleri kolaylaştırarak alan adlarının hızlı bir şekilde eklenmesini ve güvenli hale getirilmesini sağlar.
Eğer sorunlarla karşılaşırsanız, Apache hata loglarını inceleyebilir veya Let’s Encrypt log dosyasına bakarak daha fazla bilgi edinebilirsiniz:
sudo tail -f /var/log/httpd/error_log
sudo tail -f /var/log/certbot-auto.log
Full bash script hali için tıklayınız.