Buyukweb
Let's Encrypt + Certbot ile SSL Kurulumu: HTTP-01 Pratik Rehber

Let's Encrypt + Certbot ile SSL Kurulumu: HTTP-01 Pratik Rehber

Let's Encrypt sertifikasını VDS sunucunuza certbot ile nasıl kurarsınız? HTTP-01 challenge, --nginx/--apache plugin, --webroot, sertifika dosya yapısı, otomatik yenileme ve sık karşılaşılan hatalar.

Büyükweb Editör EkibiHosting, Sunucu ve Sistem Yönetimi Editörü12 dakika okuma

Let's Encrypt + Certbot ile SSL Kurulumu: HTTP-01 Challenge ile Tek Domain Pratik Rehber

VDS aldınız, Nginx ya da Apache çalışıyor, port 80/443 açık. Sıra example.com ve www.example.com için Let's Encrypt sertifikasında. İyi haber: 5 dakikalık iş — certbot --nginx komutu sertifikayı alıp Nginx config'ini sizin için düzenliyor. Bu yazı pratik adımları anlatıyor: HTTP-01 challenge ile tek-domain (apex + www) sertifika alımı, dosya yapısı, otomatik yenileme, sık karşılaşılan hatalar.

Buyukweb perspektifi: cPanel hosting paketlerimizde AutoSSL standart — siteniz oluşturulduğu an Let's Encrypt sertifikası otomatik kuruluyor, 60. günde otomatik yenileniyor; siz bir şey yapmıyorsunuz. Bu rehber VDS müşterileri içindir. Buyukweb VDS Türkiye Tier 3 veri merkezimizde (Bursa Pendc) anında teslim ediliyor; root erişimi sizde, certbot dahil tam esneklik.

Wildcard sertifika (*.example.com) için bu yazı yetmez — DNS-01 challenge gerekiyor; o senaryo için Wildcard SSL DNS-01 Rehberi. ACME kavramsal altyapısı için Let's Encrypt Nedir?.

Ön Gereksinimler: Kurulumdan Önce Kontrol Listesi

Certbot'u çalıştırmadan önce şunlar tamam olmalı, yoksa "challenge failed" hatasıyla zaman kaybedersiniz:

1. DNS A kaydı sunucu IP'sine bakıyor mu?
   dig +short example.com  → VDS public IP'si dönmeli
   dig +short www.example.com  → Aynı IP

2. Port 80 ve 443 dışa açık, web sunucu listening mi?
   ss -tlnp | grep -E ':(80|443)'

3. Firewall 80/tcp ve 443/tcp ALLOW mu?
   ufw status            (Ubuntu)
   firewall-cmd --list-all (AlmaLinux)

4. curl http://example.com → HTTP 200/301/302 dönüyor mu?
   "connection refused" olmamalı

5. /.well-known/acme-challenge/ yoluna engel kural yok mu?
   IP block, basic auth, rate limit varsa challenge fail eder

dig boş dönerse DNS henüz yayılmamıştır; A kaydını ekledikten sonra TTL'e bağlı olarak 10 dakika ile birkaç saat beklemek gerekir.

Certbot Kurulumu

EFF, Let's Encrypt'in snap paketini öneriyor — her zaman güncel kalır. Ama APT/DNF paketleri de yıllarca sorunsuz çalışıyor; standart prodüksiyon için yeterli.

# Yöntem 1: APT (Ubuntu/Debian) — en pratik
sudo apt update
sudo apt install certbot python3-certbot-nginx -y
# Apache: python3-certbot-apache

# Yöntem 2: DNF (AlmaLinux 9, Rocky Linux 9)
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-nginx -y

# Yöntem 3: Snap (en güncel sürüm)
sudo snap install --classic certbot
sudo ln -s /snap/bin/certbot /usr/bin/certbot

certbot --version    # kurulum kontrol

Minimal sunucularda snapd ek yük; APT/DNF tercih edin. Bleeding edge gerekiyorsa snap.

En Hızlı Yol: certbot --nginx Tek Komut

Nginx zaten çalışıyorsa ve config'inizde server_name example.com www.example.com; satırı varsa, tek komutla hem sertifikayı alır hem Nginx config'ini günceller:

sudo certbot --nginx \
  -d example.com -d www.example.com \
  --email [email protected] \
  --agree-tos \
  --no-eff-email \
  --redirect

Parametre açıklamaları:

  • --nginx — Nginx plugin'ini kullan (sertifika alır + config'i otomatik düzenler)
  • -d example.com -d www.example.com — Sertifikaya dahil edilecek domain'ler (apex + www)
  • --email [email protected] — Yenileme uyarıları ve önemli bildirimler için
  • --agree-tos — Let's Encrypt ToS'u kabul ediyorsunuz (interaktif soruyu atlar)
  • --no-eff-email — EFF haber bültenine kaydolmayı reddet
  • --redirect — HTTP → HTTPS otomatik 301 redirect ekle (önerilen)

Komut başarılı tamamlandığında certbot şu çıktıyı verir:

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 2026-08-07.
These names will be saved as a renewal configuration:
- example.com
- www.example.com

Successfully deployed certificate for example.com to /etc/nginx/sites-enabled/example.com
Successfully deployed certificate for www.example.com to /etc/nginx/sites-enabled/example.com
Congratulations! You have successfully enabled HTTPS on https://example.com and https://www.example.com

Tarayıcıda https://example.com artık yeşil kilit simgesiyle açılır.

Apache İçin Karşılığı: certbot --apache

Apache'da işlem aynı; sadece plugin adı değişir:

sudo certbot --apache \
  -d example.com -d www.example.com \
  --email [email protected] \
  --agree-tos \
  --no-eff-email \
  --redirect

Plugin Apache'ın <VirtualHost> bloklarını düzenleyerek SSLEngine etkinleştirir, SSLCertificateFile ve SSLCertificateKeyFile yollarını ekler, RewriteRule ile HTTP → HTTPS redirect kurar.

Webroot Yöntemi: Config'e Dokunmadan

Plugin'in config'inize otomatik dokunmasını istemiyorsanız (Ansible ile config yönetiyorsanız idempotency önemli), --webroot sertifikayı alır ama config'i kendiniz yazarsınız.

sudo certbot certonly --webroot \
  -w /var/www/html \
  -d example.com -d www.example.com \
  --email [email protected] --agree-tos --no-eff-email

-w /var/www/html document root'u gösteriyor; certbot /var/www/html/.well-known/acme-challenge/ altına geçici doğrulama dosyası bırakıyor; Let's Encrypt sunucusu HTTP üzerinden çekip doğruluyor. Birden fazla document root varsa her domain için ayrı -w belirtilebilir.

Standalone: Web Sunucu Yokken

Henüz Nginx/Apache kurulmadıysa certbot kendi başına 80 portunda dinleyebilir:

sudo systemctl stop nginx     # port 80'i boşalt
sudo certbot certonly --standalone \
  -d example.com -d www.example.com \
  --email [email protected] --agree-tos --no-eff-email
sudo systemctl start nginx

Sürekli kullanım için uygun değil — production'da --webroot veya plugin tercih edilir. İlk kurulum, headless ortam veya konteyner senaryolarında işe yarar.

Sertifika Dosya Yapısı

Sertifikalar başarıyla alındıktan sonra:

/etc/letsencrypt/
├── live/example.com/        ← sembolik linkler — config'inizde bunları gösterin
│   ├── cert.pem             → archive/cert1.pem
│   ├── chain.pem            → archive/chain1.pem
│   ├── fullchain.pem        → archive/fullchain1.pem  (Nginx/Apache için)
│   └── privkey.pem          → archive/privkey1.pem
├── archive/example.com/     ← gerçek versiyonlu dosyalar
└── renewal/example.com.conf ← yenileme yapılandırması
Dosya İçerik Nginx/Apache için
fullchain.pem cert + chain birleşik ssl_certificate
privkey.pem Private key ssl_certificate_key
chain.pem Ara CA zinciri OCSP stapling ssl_trusted_certificate
cert.pem Sadece domain sertifikası Genelde tek başına kullanılmaz

Önemli kural: Config'inizde her zaman live/ yollarını gösterin, archive/ değil. live/ sembolik link otomatik güncellenir; yenileme sonrası path değişmez.

Manuel Nginx Config: --webroot Sonrası

--webroot ile sertifika aldıysanız Nginx config'i kendiniz yazarsınız:

# /etc/nginx/sites-available/example.com

# HTTP → HTTPS redirect
server {
    listen 80;
    server_name example.com www.example.com;

    # ACME challenge yolu — yenileme için açık kalmalı
    location /.well-known/acme-challenge/ {
        root /var/www/html;
    }
    location / {
        return 301 https://$host$request_uri;
    }
}

# HTTPS — apex + www
server {
    listen 443 ssl http2;
    server_name example.com www.example.com;

    ssl_certificate     /etc/letsencrypt/live/example.com/fullchain.pem;
    ssl_certificate_key /etc/letsencrypt/live/example.com/privkey.pem;

    ssl_protocols       TLSv1.2 TLSv1.3;
    ssl_prefer_server_ciphers off;
    ssl_session_cache   shared:SSL:10m;

    # OCSP Stapling
    ssl_stapling on;
    ssl_stapling_verify on;
    ssl_trusted_certificate /etc/letsencrypt/live/example.com/chain.pem;
    resolver 1.1.1.1 8.8.8.8 valid=300s;

    # HSTS — 6 ay
    add_header Strict-Transport-Security "max-age=15768000; includeSubDomains" always;

    root /var/www/example.com;
    index index.html index.php;
    # ... uygulama bloğunuz
}

Test edip yükleyin: sudo nginx -t && sudo systemctl reload nginx. Cipher listesi ve protokol seçimi için Mozilla'nın SSL Configuration Generator'ı (old/intermediate/modern profil bazlı hazır config) pratik referans.

Otomatik Yenileme: 90 Gün Sorunu

Let's Encrypt 90 gün geçerli; certbot 30 gün kala otomatik yeniliyor. Snap veya APT ile certbot kurulduğunda certbot.timer zaten kurulu, günde iki kez kontrol ediyor.

# Timer durumu (modern dağıtımlar)
sudo systemctl status certbot.timer
sudo systemctl enable --now certbot.timer

# Eski sistemlerde cron alternatifi
sudo crontab -e
# 0 3 * * * certbot renew --quiet --deploy-hook "systemctl reload nginx"

# Yenilemeyi test et — staging endpoint, rate limit harcamaz
sudo certbot renew --dry-run

--deploy-hook parametresi sertifika yenilendiğinde Nginx'i reload eder; yenileme olmadıysa hook çalışmıyor — gereksiz reload yok. Apache için systemctl reload apache2 (Debian) veya httpd (RHEL).

--dry-run çıktısında "Congratulations, all simulated renewals succeeded" görmelisiniz. Hata varsa burada görünür; production yenileme zamanına kadar sürpriz çıkmaz.

Sık Karşılaşılan Hatalar

Could not bind to IPv4 or IPv6

--standalone modu çalıştırıldı ama port 80 zaten Nginx/Apache tarafından kullanılıyor. Çözüm: --standalone yerine --webroot veya plugin (--nginx/--apache) kullanın.

Connection refused veya Timeout

Firewall port 80'i kapatmış, web sunucu çalışmıyor, ya da cloud provider'da network security group izin vermiyor.

# UFW (Ubuntu)
sudo ufw allow 80/tcp && sudo ufw allow 443/tcp

# firewalld (AlmaLinux)
sudo firewall-cmd --permanent --add-service=http
sudo firewall-cmd --permanent --add-service=https
sudo firewall-cmd --reload

sudo systemctl status nginx    # web sunucu kontrol

Cloud provider tarafında security group veya VPC firewall kuralları da kontrol edilmeli.

DNS problem: NXDOMAIN

Domain için A kaydı yok ya da DNS yayılımı tamamlanmadı. dig +short example.com boş dönerse panel üzerinden A kaydını ekleyin, TTL kadar bekleyin.

too many certificates already issued

Let's Encrypt rate limit: aynı registered domain için haftada 50 sertifika; aynı SAN seti için haftada 5 duplicate; başarısız doğrulama için saatte 5 hatalı deneme. Test/geliştirme yapıyorsanız --staging endpoint kullanın:

sudo certbot --nginx --staging -d example.com

Production rate limit'e takıldıysanız 1 saat (hatalı doğrulama) veya 1 hafta (sertifika sayısı) beklemek gerekir.

/.well-known/acme-challenge/ 404 Not Found

Web sunucu config'inde bu yola özel block, rewrite veya WordPress .htaccess kuralı varsa challenge dosyasına erişim engellenir.

# Nginx — ana config'e ekleyin
location /.well-known/acme-challenge/ {
    root /var/www/html;
    try_files $uri =404;
}
# Apache .htaccess
RewriteEngine On
RewriteRule ^.well-known/acme-challenge/ - [L]

Cloudflare Arkasında: İki Senaryo

Cloudflare proxy kapalı (Gri Bulut, DNS-only): Trafik direkt VDS'e geliyor; Let's Encrypt HTTP-01 sorunsuz çalışır.

Cloudflare proxy açık (Turuncu Bulut): Trafik Cloudflare üzerinden geçiyor; ziyaretçi Cloudflare Universal SSL'i görüyor. Origin'de Let's Encrypt sertifikası Cloudflare-to-origin bağlantısı için kullanılıyor (Cloudflare SSL modunu "Full (strict)" yapmanız önerilir).

Cloudflare proxy aktif kullanıyorsanız Cloudflare Origin Certificate alternatif — 15 yıl geçerli, origin'de Let's Encrypt yenileme yükü olmuyor; tarayıcı görmüyor, sadece Cloudflare. Sürekli proxy kullanımı için daha az operasyonel yük.

ZeroSSL ve Caddy: Alternatif Yollar

ZeroSSL Let's Encrypt rate limit'ine takıldığınızda yedek bir ücretsiz ACME CA. Aynı certbot ile çalışıyor, sadece server URL değişiyor: --server https://acme.zerossl.com/v2/DV90. ZeroSSL EAB (External Account Binding) gerektirebiliyor; --eab-kid ve --eab-hmac-key parametreleri ZeroSSL panel'inden alınır.

Caddy web sunucusu Let's Encrypt'i native destekliyor — config'inizde example.com { ... } yazmanız yeterli, Caddy başlatıldığı an sertifika alır ve otomatik yeniler. Nginx'in olgun ekosistemiyle kıyaslandığında daha az yaygın ama yeni kurulumlar için pratik. Traefik (Docker/Kubernetes) de aynı şekilde Let's Encrypt'i native destekliyor.

Buyukweb Tarafı: cPanel vs VDS

cPanel Web Hosting müşterileri: AutoSSL Let's Encrypt'i HTTP-01 challenge ile otomatik kuruyor — bu yazıyı okumanıza gerek yok. Yeni domain eklediğinizde 24-48 saat içinde otomatik sertifika alıyor; cPanel arayüzünde SSL/TLS → SSL/TLS Status menüsünden manuel de tetiklenebiliyor. Plesk Web Hosting paketlerinde de Let's Encrypt eklentisi tek tıkla aktif.

VDS Sunucu müşterileri: Bu yazı tam size yönelik — Ubuntu, Debian, AlmaLinux veya Rocky Linux fark etmez, certbot adımları benzer. Buyukweb VDS Türkiye Tier 3 veri merkezimizde (Bursa Pendc) anında teslim ediliyor; root erişimi sizde, certbot dahil tam esneklik. Birden fazla domain (3-5 SAN) varsa hepsini -d bayraklarıyla aynı sertifikaya dahil edebilirsiniz.

Sıkça Sorulan Sorular

Buyukweb cPanel AutoSSL ile bu yazıdaki certbot kurulumunun farkı nedir?

cPanel AutoSSL panel tarafından yönetilen Let's Encrypt entegrasyonu — sertifika otomatik kuruluyor ve yenileniyor. Bu yazıdaki certbot kurulumu ise VDS'de elle yapılan iş; tam kontrol sizde, root erişiminiz var, plugin yerine --webroot veya --standalone alternatiflerini seçebilirsiniz. AutoSSL altta zaten Let's Encrypt kullanıyor; aralarındaki fark "kim yönetiyor".

Tek-domain mi wildcard mı tercih etmeliyim?

3-5 sabit subdomain'iniz varsa (www, blog, api) tek-domain SAN sertifika daha pratik — -d bayraklarıyla hepsini aynı sertifikaya dahil edersiniz, HTTP-01 yeterli. Wildcard (*.example.com) gerçekten anlamlı olduğu yer dinamik subdomain üreten SaaS uygulamaları veya 10+ subdomain ekosistemleri. Wildcard DNS-01 zorunlu kıldığından kurulum karmaşıklığı artıyor — gerçekten gerekli olduğunda alın.

Snap mi APT mi certbot için?

İkisi de çalışıyor. Snap her zaman güncel; APT/DNF paketleri dağıtım deposundaki sürümle. Standart prodüksiyonda APT/DNF yeterli — yıllarca sorunsuz çalışıyor. Bleeding edge istiyorsanız snap. Minimal sunucularda snapd dependency yer kapladığından APT/DNF tercih edilir.

Renewal hook nedir, ne zaman gerekir?

--deploy-hook "komut" parametresi sertifika yenilendiğinde çalışacak komutu belirtir. En yaygın kullanım web sunucu reload — sertifika dosyaları değiştiğinde Nginx/Apache'ın yeni sertifikayı bellekten yüklemesi için. Yenileme olmadıysa hook çalışmaz; gereksiz reload yapmıyor.

Cloudflare proxy açıkken Let's Encrypt nasıl alırım?

Proxy açıkken HTTP-01 challenge Cloudflare'e gelip orada SSL sonlandırılıyor. Pratik çözümler: (1) Sertifika alma sırasında Cloudflare proxy'yi geçici "DNS-only" yap, sertifikayı al, sonra proxy'yi tekrar aç. (2) Kalıcı: DNS-01 challenge'a geç (acme.sh + Cloudflare DNS API). (3) Cloudflare Origin Certificate'a geç — 15 yıl geçerli, Let's Encrypt yenileme derdi olmuyor.

Sertifika yenilemesi başarısız oldu, ne yapmalıyım?

Önce log: /var/log/letsencrypt/letsencrypt.log. Sık nedenler: A kaydı doğru IP'yi göstermiyor, port 80 kapalı, web sunucu çalışmıyor, /.well-known/acme-challenge/ engelleyen rewrite kuralı eklenmiş. certbot renew --dry-run ile manuel test edip hatayı inceleyin. Düzeltince certbot renew --force-renewal ile zorla yeniden deneyin (rate limit'e dikkat).

Let's Encrypt neden 90 gün, daha uzun olamaz mı?

Politika gereği maksimum 90 gün; kısa ömür otomasyonu zorunlu kılarak güvenliği artırıyor — ele geçirilmiş bir private key maksimum 90 gün zararlı olabilir. Otomatik yenileme certbot timer/cron ile arka planda çalışıyor; bir kez kurulunca elden geçirme gerekmiyor. Daha uzun geçerlilik için ücretli CA gerekiyor ama otomasyon avantajı kayboluyor.

Sonuç

Let's Encrypt + certbot ile tek-domain SSL kurulumu öğleden sonra başlayıp 5 dakikada bitiren bir iş — özellikle certbot --nginx veya certbot --apache plugin'iyle. HTTP-01 challenge port 80 üzerinden domain sahipliğini doğruluyor, sertifika 90 gün geçerli, certbot timer 30 gün kala otomatik yeniliyor. Sertifika dosyaları /etc/letsencrypt/live/example.com/ altında; Nginx/Apache config'inizde her zaman live/ yollarını gösterin.

Sık karşılaşılan hatalar firewall, DNS yayılımı eksikliği veya /.well-known/acme-challenge/ yoluna erişim engelleyen rewrite kuralları. certbot renew --dry-run her ay bir kez çalıştırın — yenileme zamanına kadar sürpriz çıkmaz.

Buyukweb cPanel hosting'de AutoSSL bu işi sizin için zaten yapıyor; VDS müşterileriyseniz bu yazı tam yol haritası. Wildcard sertifika için DNS-01 challenge ile wildcard SSL yazısına bakabilirsiniz; ACME protokolünün ayrıntılı kavramsal anlatımı için Let's Encrypt Nedir? yazısı temel kaynak. Teknik destek için 0850 302 60 70 numaralı hat 7/24 açık.


İlgili Buyukweb Hizmetleri

Let's Encrypt sertifikası ve sunucu güvenliği için Türkiye Tier 3 veri merkezimizdeki paketler:

Sertifika kurulumu veya yenileme sorunlarında 0850 302 60 70 numaralı destek hattımıza veya iletişim sayfamıza yazabilirsiniz.

Güvenlik & SSL İlgili Hizmetlerimiz

Bu yazıda anlatılan teknik konuyu profesyonel altyapıyla deneyimleyin

Etiketler:

#ssl#certbot#let's encrypt#kurulum rehberi#ssl sertifikası#güvenlik

Bu yazıyı paylaş