Cron Job ile SSL Sertifikası Otomatik Yenileme

SSLYayın: Güncellendi: 9 dk okumaHazırlayan: cronjob.com.tr Editörleri

Let's Encrypt SSL/TLS sertifikaları, modern web sitelerinin güvenliğini sağlayan ve HTTPS şifrelemesini ücretsiz olarak sunan en yaygın endüstri standardıdır. Bu rehberde ele alınan classic profilli sertifikaların geçerlilik süresi 90 gündür; diğer profillerde süre farklı olabilir. Sertifika süresi dolduğu anda web tarayıcıları kullanıcıların karşısına güvensiz bağlantı uyarısı çıkarır, ziyaretçilerin siteye erişimi aksayabilir. Bu riskin önüne geçmek için sertifikaların süresi dolmadan önce arka planda sessizce ve düzenli bir şekilde yenilenmesi gerekir.

Sertifika yenileme otomasyonunda Electronic Frontier Foundation (EFF) tarafından geliştirilen Certbot yazılımı standart istemcidir. Certbot, ACME (Automated Certificate Management Environment) protokolü aracılığıyla alan adı sahipliğini teyit eder, yeni anahtar çiftlerini üretir ve web sunucusu yapılandırmasına işler. Ancak bu sürecin aksamadan çalışması için doğru bir Linux cron job zamanlaması yapılması, web sunucusunu yeniden yükleme kancalarının doğru ayarlanması ve yetki sınırlarının kusursuz biçimde tanımlanması gerekir.

Bu rehberde; Let's Encrypt 90 günlük yaşam döngüsünü, systemd timer ile crontab arasındaki çalışma farklarını, adım adım crontab üzerinden Certbot yapılandırmasını, Nginx ve Apache servislerinin kesintisiz biçimde yeni sertifikayı yüklemesini ve karşılaşılan yaygın doğrulama hatalarının kesin çözümlerini ele alıyoruz.

Let's Encrypt ve Otomatik SSL Yenileme Mantığı (90 Günlük Döngü)

Let's Encrypt sertifikalarının 90 gün gibi görece kısa bir süreyle sınırlandırılmasının iki temel nedeni vardır: Olası anahtar sızıntılarının veya güvenlik açıklarının etki süresini minimumda tutmak ve web yöneticilerini sertifika yönetimini mutlaka otomatikleştirmeye zorlamaktır. Elle yapılan 1 yıllık sertifika yenileme süreçleri unutulmaya mahkumdur; ancak otomatik çalışan zamanlanmış görevler sistemin sürekli güncel kalmasını sağlar.

Certbot 4.0.0 ve sonrasında, kalan geçerlilik süresi sertifika ömrünün üçte birinden azsa yenileme başlar; ömrü en fazla 10 gün olan sertifikalarda eşik yarı süredir. Eski sürümlerde sabit 30 günlük eşik kullanılır. Eğer sertifikanın bitimine 45 gün varsa, terminalden veya cron üzerinden certbot renew çalıştırsanız bile Certbot bu sertifikayı atlar ve işlem yapmaz. Bu akıllı eşik mekanizması, sunucunuzun her gün Let's Encrypt sunucularını lüzumsuz yere meşgul etmesini ve oran sınırlarına (rate limits) takılmasını önler.

Yenileme sırasında Certbot genellikle HTTP-01 challenge yöntemini uygular. Bu yöntemde Let's Encrypt sunucusu, sitenizin /.well-known/acme-challenge/ dizini altında geçici bir doğrulama dosyasının varlığını 80 portu üzerinden HTTP ile denetler. Dosya içeriği doğruysa yeni sertifika dosyaları /etc/letsencrypt/live/alanadiniz/ dizinine yazılır ve eski sembolik bağlar güncellenir.

Systemd Timer vs Crontab: Hangisi Kullanılmalı?

Modern Linux işletim sistemlerinde, özellikle Ubuntu cron job altyapılarında (Ubuntu 20.04, 22.04, 24.04) ve Debian sistemlerde Certbot paket yöneticisi (apt veya snap) ile kurulduğunda arka planda otomatik olarak bir systemd timer oluşturur. Bu timer genellikle günde iki kez rastgele zamanlarda çalışarak sertifikaların süresini yoklar.

Mevcut certbot.timer Durum Kontrolü

Sunucunuza yeni bir crontab kuralı eklemeden önce sisteminizde halihazırda çalışan bir timer olup olmadığını kontrol etmeniz gerekir. Aşağıdaki komutla servis durumunu sorgulayabilirsiniz:

systemctl list-timers --all | grep -i certbot

Eğer çıktıda etkin bir Certbot zamanlayıcısı ve sonraki çalışma zamanı görünüyorsa, sisteminizde zaten otomatik bir yenileme mekanizması devrededir. Bu durumda crontab içine ikinci bir görev eklemek iki farklı servisin aynı anda /etc/letsencrypt dizini üzerinde kilit (lock) oluşturmaya çalışmasına yol açabilir. Zamanlayıcı mimarilerinin detaylı karşılaştırması için cron vs systemd timer incelememizi okuyabilirsiniz. Eğer crontab üzerinden tam denetime sahip olmak istiyorsanız, kurulumunuza ait zamanlayıcıyı devre dışı bırakabilirsiniz (aşağıdaki ad apt kurulumu içindir; snap kurulumunda birim adı farklıdır):

sudo systemctl stop certbot.timer
sudo systemctl disable certbot.timer

Adım Adım Crontab ile Certbot Yapılandırması

Crontab üzerinden Certbot ile güvenli bir otomatik yenileme mekanizması kurmak için aşağıdaki sıralı adımları izleyin:

  1. Certbot Çalıştırılabilir Dosyasının Yolunu Belirleyin: Cron ortamları dar bir $PATH değişkenine sahip olduğundan ikili dosyanın tam yolu verilmelidir. Terminalde which certbot komutunu çalıştırarak yolu (genellikle /usr/bin/certbot veya /snap/bin/certbot) öğrenin.
  2. Root Crontab Tablosunu Açın: Sertifika dosyaları ve /etc/letsencrypt dizini yalnızca kök kullanıcı (root) erişimine açıktır. Standart kullanıcı hesabı sertifikaları yenileyemez. Bu yüzden sudo crontab -e komutunu kullanın. Yetki sınırları hakkında bilgi almak için cron permission denied rehberimize göz atabilirsiniz.
  3. Yenileme Komutunu ve Zamanlamasını Ekleyin: Certbot'un her gün veya haftada iki kez sabaha karşı çalışması önerilir. Bu saatlerde sunucu trafiği genellikle en düşük seviyededir.
  4. Web Sunucusunu Yeniden Yükleme Kancasını (Hook) Tanımlayın: Sertifika yenilendiğinde Nginx veya Apache servislerinin bellekteki eski sertifikayı bırakıp yeni dosyaları okuması için reload sinyali alması zorunludur.

certbot renew Komutu ve Güvenli Çalıştırma Bayrakları

Crontab içinde Certbot çalıştırılırken iki temel parametreye mutlaka yer verilmelidir:

Yenileme Sonrası Web Sunucusunu Tetikleme (--deploy-hook)

Çoğu web yöneticisinin yaptığı en büyük hata --post-hook ile --deploy-hook arasındaki farkı bilmemektir. --post-hook komutu, yalnızca yenileme zamanı gelen bir sertifika için girişim yapıldığında, girişim başarılı olsun ya da olmasın çalışır. Oysa --deploy-hook parametresi yalnızca en az bir sertifika başarıyla yenilendiğinde devreye girer:

--deploy-hook "systemctl reload nginx"

Bu sayede Nginx yalnızca diske gerçekten yeni bir SSL sertifikası indiğinde konfigürasyonunu yeniler ve aktif bağlantılar kesintiye uğramaz.

Gerçek Kod Örnekleri

Farklı sunucu senaryolarına uygun çalışan ve test edilmiş crontab yapılandırmaları aşağıdadır.

Senaryo 1: Nginx İçin Haftada İki Kez Çalışan Güvenli Crontab Satırı

Pazartesi ve Perşembe günleri sabaha karşı saat 03:30'da çalışır, rastgele bekleme süresi uygular ve yalnızca yenileme başarılı olursa Nginx servisini yeniden yükler:

# Root crontab (sudo crontab -e)
30 3 * * 1,4 /usr/bin/certbot renew --quiet --random-sleep-on-renew --deploy-hook "systemctl reload nginx"

Senaryo 2: Apache Sunucusu İçin Günlük Kontrol ve Detaylı Loglama

Her gece saat 02:15'te çalışır, standart hataları ve yenileme kayıtlarını özel bir günlük dosyasına ekler:

# Apache web sunucusu için günlük SSL yenileme
15 2 * * * /usr/bin/certbot renew --quiet --deploy-hook "systemctl reload apache2" >> /var/log/certbot-cron.log 2>&1

Senaryo 3: Yenileme ve Kanca Mekanizmasını Simüle Eden Test Komutu

Gerçek bir yenileme yapmadan ve Let's Encrypt kotanızı harcamadan tüm kancaların ve izinlerin düzgün çalıştığını doğrulamak için --dry-run ile birlikte --run-deploy-hooks parametresini kullanabilirsiniz:

sudo certbot renew --dry-run --run-deploy-hooks

Bu komut başarılı şekilde tamamlanırsa ve ekranda Simulating renewal of an existing certificate ile birlikte Nginx'in yeniden yüklendiği bildirilirse doğrulama ve kanca mekanizması test ortamında çalışmış demektir; cron ortamını ayrıca kontrol etmelisiniz.

Sık Karşılaşılan Hatalar ve Çözümleri

SSL otomatik yenileme süreçlerinde karşılaşılan yaygın problemler, kök nedenleri ve çözüm yöntemleri aşağıda listelenmiştir:

Hata 1: Certbot failed to authenticate some domains (Unauthorized 404)
Nedeni: Let's Encrypt doğrulama sunucusu sitenizin http://alanadiniz.com/.well-known/acme-challenge/test-token adresine erişmeye çalıştığında 404 Not Found yanıtı almaktadır. Nginx veya Apache yapılandırmanızda webroot dizini yanlış tanımlanmış ya da gizli dosyalara erişim kısıtlanmıştır.
Çözümü: Nginx sunucu bloğunuzun içine aşağıdaki kuralı ekleyin ve web sunucusunu reload edin:
location /.well-known/acme-challenge/ {
    root /var/www/html;
    allow all;
}
Hata 2: Attempting to renew cert from /etc/letsencrypt/renewal/... failed: [Errno 13] Permission denied
Nedeni: Zamanlanmış görev root kullanıcısı yerine standart bir sistem kullanıcısının (örneğin ubuntu veya www-data) crontab dosyasına yazılmıştır. /etc/letsencrypt/ altındaki özel anahtarlar güvenlik gerekçesiyle yalnızca root okuma yetkisine sahiptir.
Çözümü: Mevcut kullanıcı crontab'ından görevi kaldırın (crontab -e) ve görevi mutlaka root kullanıcısının tablosuna (sudo crontab -e) taşıyın.
Hata 3: systemctl reload nginx failed
Nedeni: Deploy hook tetiklendiğinde Nginx konfigürasyonunda sözdizimi hatası bulunmaktadır ya da cron alt kabuğu systemctl komutunun tam yolunu bulamamaktadır.
Çözümü: Terminalde sudo nginx -t komutuyla yapılandırma dosyalarınızın sözdizimini doğrulayın. Ayrıca crontab içindeki hook komutunda /bin/systemctl reload nginx şeklinde mutlak yol kullanın.
Hata 4: There were too many requests of a given type: Rate limit reached
Nedeni: Canlı Let's Encrypt ACME API sunucusuna aynı alan adı için kısa süre içinde çok sayıda başarısız doğrulama isteği gönderilmiştir. Let's Encrypt saat başına ve alan adı başına katı sınırlar uygular.
Çözümü: Hata ayıklama ve test adımlarınızda mutlaka --dry-run veya --staging bayrağını kullanın. Limit aşıldıysa hata yanıtında belirtilen yeniden deneme zamanına kadar beklemelisiniz. Zamanlanmış göreviniz hiç tetiklenmiyorsa cron job çalışmıyor rehberimizdeki genel kontrol adımlarını uygulayın.

cronjob.com.tr ile HTTP Tabanlı Alternatif Kurulum (SSL Bağlantı Kontrolü)

Sunucu içi Certbot ve crontab mekanizmaları güçlü olsa da tamamen bağımsız bir güvenlik katmanı değildir. Sunucunun diski dolduğunda, işletim sistemi kilitlendiğinde ya da Nginx hatalı bir güncelleme sonrası başlayamadığında Certbot yenileme yapamaz ve SSL süresi sessizce dolabilir. Dışarıdan bağımsız bir gözlemci olmadan bu çöküşü ancak müşterileriniz siteye giremediğinde fark edersiniz.

cronjob.com.tr platformu, web sitenizi ve SSL sertifikanızı harici bir HTTP katmanından periyodik olarak denetleyen bulut tabanlı bir zamanlama ve izleme servisidir. Platformumuz TLS protokolünü sıkı biçimde doğrular: Yapılan her istekte sunucunuzun sunduğu SSL sertifikasının geçerliliği, alan adı eşleşmesi ve bitiş tarihi kontrol edilir. Eğer sunucunuz süresi dolmuş veya geçersiz bir sertifika sunarsa istek anında bağlantı hatası olarak işaretlenir.

Kullanım için sunucunuzda crontab yapılandırmak zorunda değilsiniz. cronjob.com.tr kontrol panelinden ücretsiz hesap oluşturarak (kredi kartı gerekmez) sitenizin ana sayfasına veya özel bir kontrol uç noktasına (örneğin https://alanadiniz.com/api/health) periyodik istek tanımlayabilirsiniz:

Sıkça Sorulan Sorular (SSS)

Certbot sertifikayı süresi dolmadan ne zaman yeniler?

Certbot 4.0.0 ve sonrasında kalan ömür üçte birin altına düştüğünde yenileme yapılır; ömrü en fazla 10 gün olan sertifikalarda eşik yarıdır. Önceki sürümlerde eşik sabit 30 gündür. Yenileme zamanı gelmeyen sertifikalar atlanır.

Crontab'a her gün çalıştırma eklersem Let's Encrypt limitlerine takılır mıyım?

Hayır, crontab üzerinden günde bir veya iki kez certbot renew çalıştırmak Let's Encrypt oran sınırlarına (rate limits) takılmaz. Komut yalnızca yenileme eşiğine gelen sertifikalar için ACME sunucularına istek gönderir; günü gelmeyen sertifikalar yerel kontrolde elenir.

--deploy-hook ile --post-hook arasındaki fark nedir?

--deploy-hook parametresi yalnızca en az bir sertifika başarıyla yenilendiğinde çalışır ve web sunucusunu gereksiz yere reload etmekten kaçınır. --post-hook ise yalnızca yenileme zamanı gelen sertifikalar için bir girişim yapıldıktan sonra, girişim başarılı olsun ya da olmasın çalışır.

Web sunucusunu reload etmezsem ne olur?

Yeni sertifika dosyaları diske indirilse bile Nginx veya Apache gibi web sunucuları bellekteki eski sertifikayı kullanmaya devam eder. Bu durum sertifikanın süresi dolduğunda sitenizin tarayıcılarda güvenlik uyarısı vermesine yol açar.

Hemen Ücretsiz Cron Job Oluşturun

Certbot yenilemesi bir gün çalışmazsa ilk siz haberdar olun: cronjob.com.tr sitenizi dışarıdan HTTPS ile yoklar, geçersiz veya süresi dolmuş sertifika bağlantı hatası sayılır ve ardışık hata eşiği aşılınca e-posta uyarısı gönderilir. Kayıt ücretsizdir, kredi kartı istenmez.

Ücretsiz Başla →

İlgili Rehberler