İçeriğe geç
Süreçlerinize uygun yazılımı birlikte planlayalım. Demo ve teklif için arayın: +90 546 737 48 29

TR EN DE

Nginx'te HTTPS: SSL sertifikası kurulumu

HTTPS, ziyaretçinin tarayıcısı ile sunucunuz arasındaki trafiği şifreler ve tarayıcıya gerçekten sizin sunucunuzla konuştuğunu kanıtlar. Bunun için sunucuda bir sertifika ve ona ait bir özel anahtar bulunur. Nginx'te HTTPS'i açmak üç işten oluşur: sertifikayı edinmek, Nginx'e sertifikanın yerini göstermek ve şifresiz gelen istekleri HTTPS'e yönlendirmek.

Bu rehber, ücretsiz sertifika veren Let's Encrypt ile onun yaygın istemcisi Certbot üzerinden genel akışı anlatır; sertifikayı başka bir sağlayıcıdan aldıysanız üçüncü adımdan devam edebilirsiniz. SSL ve TLS kavramlarına yabancıysanız önce SSL nedir? rehberini okuyun.

Kısaca

  • Sertifika Certbot ile alınır; Nginx'e fullchain.pem ve privkey.pem dosyaları gösterilir.
  • 80 numaralı bağlantı noktasına gelen her istek 301 ile HTTPS'e yönlendirilir.
  • HSTS önce kısa süreyle denenir, sorun yoksa uzatılır.
  • Yenileme otomatik olmalı ve yenilemeden sonra Nginx yeniden yüklenmelidir.

Gerekenler

  • Sunucuda yönetici (sudo) yetkisi ve çalışan bir Nginx
  • Sunucunun IP adresini gösteren bir alan adı (DNS kaydı)
  • Dışarıdan erişilebilen 80 ve 443 numaralı bağlantı noktaları
  • Mevcut Nginx yapılandırmasının yedeği

Dikkat

Yapılandırmayı değiştirmeden önce yedeğini alın ve her değişiklikten sonra "nginx -t" ile sınayın. Dosya yolları ve paket adları dağıtıma göre değişir; örnekleri kendi sunucunuza uyarlayın.

Bu sayfada

Yedi adımda HTTPS

  1. Ön koşulları kontrol edin

    Let's Encrypt, sertifika vermeden önce alan adının gerçekten sizin denetiminizde olduğunu doğrular. En yaygın yöntemde doğrulama sunucusu, alan adınıza 80 numaralı bağlantı noktasından bağlanıp geçici bir dosya ister. Bu yüzden:

    • Alan adının (ve kullanıyorsanız www adının) DNS kaydı bu sunucuyu göstermelidir.
    • Güvenlik duvarında 80 ve 443 açık olmalıdır.
    • Nginx'te bu alan adı için server_name satırı doğru yazılmış bir server bloğu bulunmalıdır.

    Site dosyalarının yeri dağıtıma göre değişir: /etc/nginx/conf.d yaygındır, /etc/nginx/sites-available ise Debian/Ubuntu düzenidir.

    Akış şeması: alan adı ve bağlantı noktaları, sertifika alma, HTTPS sunucu bloğu, yönlendirme, sınama, HSTS ve otomatik yenileme : Büyüt
  2. Certbot ile sertifikayı alın

    Certbot'un kurulum komutu dağıtıma ve paket yöneticisine göre değişir; aşağıdaki ilk satır yalnızca bir örnektir. Kurulumdan sonra --nginx seçeneği, sertifikayı alır ve ilgili server bloğuna gerekli satırları kendisi ekler. Her -d bir alan adıdır.

    Bash
    # Kurulum dağıtıma göre değişir. Örnek (Debian/Ubuntu paket deposu):
    sudo apt install certbot python3-certbot-nginx
    
    # Sertifikayı al ve Nginx yapılandırmasına işle
    sudo certbot --nginx -d ornek.com -d www.ornek.com

    Certbot dosyaları /etc/letsencrypt/live/ornek.com/ altına yerleştirir. Nginx için iki dosya önemlidir:

    • fullchain.pem: sitenizin sertifikası ile ara sertifika birlikte. ssl_certificate bunu gösterir.
    • privkey.pem: özel anahtar. ssl_certificate_key bunu gösterir. Kimseyle paylaşılmaz, web kökünün altına konmaz.
    Şema: fullchain.pem site sertifikası ile ara sertifikayı içerir ve ssl_certificate ile gösterilir; privkey.pem özel anahtardır ve ssl_certificate_key ile gösterilir : Büyüt
  3. HTTPS sunucu bloğunu ve yönlendirmeyi yazın

    Certbot yapılandırmayı kendisi düzenlediyse bu adımda yalnızca sonucu gözden geçirin. Elle yazıyorsanız iki blok gerekir: biri 80'de dinleyip her isteği kalıcı (301) olarak HTTPS'e yönlendirir, diğeri 443'te sertifikayla yanıt verir.

    Nginx
    # 80: her isteği HTTPS'e yönlendir
    server {
        listen 80;
        listen [::]:80;
        server_name ornek.com www.ornek.com;
    
        return 301 https://$host$request_uri;
    }
    
    # 443: sertifikayla yanıt ver
    server {
        listen 443 ssl;
        listen [::]:443 ssl;
        server_name ornek.com www.ornek.com;
    
        ssl_certificate     /etc/letsencrypt/live/ornek.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;
    
        ssl_protocols TLSv1.2 TLSv1.3;
        ssl_session_cache shared:SSL:10m;
        ssl_session_timeout 1h;
    
        root /var/www/ornek.com/public;
        index index.html;
    }

    return 301 https://$host$request_uri; satırı, ziyaretçinin istediği adresi ve sorgu dizgisini koruyarak yönlendirir. ssl_protocols TLSv1.2 TLSv1.3; eski ve güvensiz protokol sürümlerini kapatır. HTTP/2'yi açan yönergenin yazımı Nginx sürümüne göre değişir; kendi sürümünüzün belgelerine bakın.

  4. Sınayın ve yeniden yükleyin

    Önce sözdizimini sınayın; hata yoksa Nginx'i yeniden yükleyin. Yeniden yükleme (reload) açık bağlantıları kesmez. Ardından yönlendirmeyi ve sertifikayı dışarıdan kontrol edin.

    Bash
    # Sözdizimini sına, sonra yeniden yükle
    sudo nginx -t
    sudo systemctl reload nginx
    
    # HTTP adresi HTTPS'e yönleniyor mu?
    curl -sI http://ornek.com/ | grep -i -E "^(HTTP|location)"
    
    # HTTPS yanıtı ve başlıkları
    curl -sI https://ornek.com/
    
    # Sunulan sertifika zincirini göster
    openssl s_client -connect ornek.com:443 -servername ornek.com < /dev/null

    İlk curl çıktısında 301 ve https:// ile başlayan bir location satırı görmelisiniz. Tarayıcıda adres çubuğundaki bağlantı bilgisinden sertifikanın alan adını ve bitiş tarihini kontrol edin. Sorun çıkarsa aşağıdaki "Sık hatalar" bölümüne bakın.

    Şema: HTTPS kurulumunda sık hatalar; eksik ara sertifika, karışık içerik, yönlendirme döngüsü, süresi dolan sertifika : Büyüt
  5. Arka uca aktarıyorsanız: SSL sonlandırma

    Nginx çoğu kurulumda ters vekil (reverse proxy) olarak çalışır: isteği karşılar ve arkadaki uygulamaya iletir. Bu düzende şifreli bağlantı Nginx'te açılır; buna SSL sonlandırma (SSL termination) denir. Sertifika tek yerde durur, arka uç sunucusu (backend) şifreleme işiyle uğraşmaz.

    Nginx
    upstream uygulama {
        server 127.0.0.1:8080;
    }
    
    server {
        listen 443 ssl;
        server_name ornek.com www.ornek.com;
    
        ssl_certificate     /etc/letsencrypt/live/ornek.com/fullchain.pem;
        ssl_certificate_key /etc/letsencrypt/live/ornek.com/privkey.pem;
    
        location / {
            # Şifre burada çözüldü; arka uca düz HTTP gider
            proxy_pass http://uygulama;
    
            proxy_set_header Host $host;
            proxy_set_header X-Real-IP $remote_addr;
            proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
            # Ziyaretçinin kullandığı protokol: https
            proxy_set_header X-Forwarded-Proto $scheme;
        }
    }

    Nginx ile arka uç arasındaki bağlantı için iki seçenek vardır:

    • Düz HTTP: arka uç aynı sunucudaysa (127.0.0.1) ya da güvenilir, kapalı bir iç ağdaysa yaygın tercihtir.
    • Yeniden şifreleme: trafik güvenmediğiniz bir ağdan geçiyorsa proxy_pass https://… kullanılır. Nginx arka ucun sertifikasını varsayılan olarak doğrulamaz; doğrulama için proxy_ssl_verify on; ve proxy_ssl_trusted_certificate gerekir.

    Arka uç isteği HTTP olarak gördüğü için ziyaretçinin HTTPS ile geldiğini bilemez. X-Forwarded-Proto başlığı bu bilgiyi taşır; uygulama güvenli çerez ve doğru adres üretmek için bu başlığa bakar. Uygulama bu başlığa yalnızca kendi vekil sunucunuzdan geldiğinde güvenmelidir. Ayrıntılar: Nginx ile ters vekil kurulumu.

    SSL sonlandırma şeması: tarayıcı Nginx'e HTTPS ile bağlanır, şifre Nginx'te çözülür, istek arka uca HTTP ya da yeniden şifrelenmiş olarak X-Forwarded-Proto başlığıyla iletilir : Büyüt
  6. HSTS'yi önce kısa süreyle açın

    HSTS (Strict-Transport-Security) başlığı tarayıcıya "bu siteye belirtilen süre boyunca yalnızca HTTPS ile bağlan" der. Güçlü bir korumadır ama geri alınması zordur: tarayıcı süre dolana kadar HTTP'ye dönmez. Bu yüzden önce birkaç dakikalık max-age ile deneyin.

    Nginx
    # Deneme: 5 dakika
    add_header Strict-Transport-Security "max-age=300" always;
    
    # Sorun yoksa yukarıdaki satırın yerine: 1 yıl
    # add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;

    Başlığı yalnızca 443'teki blokta tanımlayın. always sözcüğü başlığın hata yanıtlarında da gönderilmesini sağlar. includeSubDomains eklemeden önce tüm alt alan adlarınızın HTTPS ile çalıştığından emin olun. Diğer başlıklar için Güvenlik başlıkları ve HTTPS rehberine bakın.

  7. Otomatik yenilemeyi doğrulayın

    Let's Encrypt sertifikaları kısa ömürlüdür; elle takip edilmez, otomatik yenilenir. Certbot paketleri genellikle bir zamanlayıcı (systemd timer ya da cron) kurar; bu görev düzenli çalışır ve yalnızca süresi yaklaşan sertifikaları yeniler. Kurulumun gerçekten çalıştığını deneme yenilemesiyle doğrulayın.

    Bash
    # Deneme yenilemesi: gerçek sertifikaya dokunmaz
    sudo certbot renew --dry-run
    
    # Sertifikalar ve bitiş tarihleri
    sudo certbot certificates
    
    # Zamanlayıcı kurulu mu? (systemd kullanan dağıtımlarda)
    systemctl list-timers | grep -i certbot
    
    # Yenilenen sertifikadan sonra Nginx'i yeniden yükle
    sudo certbot renew --deploy-hook "systemctl reload nginx"

    Nginx sertifika dosyasını yalnızca başlarken ve yeniden yüklenirken okur. Yenilemeden sonra yeniden yükleme yapılmazsa dosya yenilenmiş olsa bile ziyaretçilere eski sertifika sunulur. --deploy-hook ile verilen komut yalnızca bir sertifika gerçekten yenilendiğinde çalışır. Kalıcı olması için aynı komutu /etc/letsencrypt/renewal-hooks/deploy/ klasörüne çalıştırılabilir bir betik olarak da koyabilirsiniz; Certbot başarılı her yenilemeden sonra bu klasördeki betikleri çalıştırır.

    Akış şeması: zamanlayıcı certbot renew komutunu çalıştırır, süresi yaklaşan sertifika yenilenir, Nginx yeniden yüklenir, yeni sertifika sunulur : Büyüt

Certbot yapılandırmaya dokunmasın istiyorsanız: webroot yöntemi

Nginx yapılandırmasını tümüyle kendiniz yönetmek istiyorsanız Certbot'a yalnızca sertifikayı aldırabilirsiniz. Bu yöntemde doğrulama dosyası sizin belirlediğiniz bir klasöre yazılır; 80'deki blokta bu yol yönlendirmenin dışında tutulur.

Nginx
listen 80;
listen [::]:80;
server_name ornek.com www.ornek.com;

# Doğrulama dosyaları yönlendirilmez
location /.well-known/acme-challenge/ {
    root /var/www/letsencrypt;
}

location / {
    return 301 https://$host$request_uri;
}
Bash
# Yalnız sertifikayı al; Nginx yapılandırmasına dokunma
sudo certbot certonly --webroot -w /var/www/letsencrypt -d ornek.com -d www.ornek.com

Joker (wildcard) sertifikalar bu yöntemle alınamaz; DNS kaydı üzerinden doğrulama gerekir ve adımları DNS sağlayıcınıza göre değişir.

TLS ayarları: ne yazmalı, ne yazmamalı?

  • Protokol: ssl_protocols TLSv1.2 TLSv1.3; güncel tarayıcılar için yeterlidir. TLS 1.3 için Nginx'in birlikte derlendiği OpenSSL kitaplığının bu sürümü desteklemesi gerekir.
  • Tek yerde tanımlayın: aynı sunucuda birden çok site varsa protokol ayarını http bloğunda bir kez yazmak, siteler arasında tutarsızlığı önler.
  • Oturum önbelleği: ssl_session_cache shared:SSL:10m; tekrar gelen ziyaretçilerde el sıkışmanın yeniden yapılmasını azaltır.
  • Şifre takımları (cipher): internette dolaşan eski listeleri kopyalamayın. Öneriler zamanla değişir; güncel öneriler için sunucu yazılımınızın belgelerine bakın. Emin değilseniz varsayılanı bırakmak, eski bir listeyi yapıştırmaktan iyidir.

Sık hatalar ve çözümleri

BelirtiOlası nedenÇözüm
Tarayıcıda açılıyor; bazı telefonlarda, uygulamalarda ya da curl ile sertifika hatasıEksik ara sertifika: ssl_certificate yalnızca site sertifikasını gösteriyorfullchain.pem dosyasını gösterin
Kilit simgesinde uyarı, bazı görseller ya da betikler yüklenmiyorKarışık içerik (mixed content): sayfa http:// ile kaynak çağırıyorSayfadaki ve veritabanındaki adresleri https:// yapın
"Çok fazla yönlendirme" hatasıYönlendirme döngüsü: öndeki CDN ya da vekil sunucuya HTTP ile bağlanıyor, sunucu yine HTTPS'e yönlendiriyorÖndeki hizmeti sunucuya HTTPS ile bağlanacak şekilde ayarlayın ya da koşullu yönlendirin
Sertifika süresi doldu uyarısıYenileme çalışmıyor ya da yenilemeden sonra Nginx yeniden yüklenmediDeneme yenilemesini çalıştırın; yeniden yükleme kancasını ekleyin
Sertifika alınamıyorDNS başka sunucuyu gösteriyor ya da 80 kapalıDNS kaydını ve güvenlik duvarını kontrol edin
Ad uyuşmazlığı uyarısıSertifika www adını ya da alt alan adını kapsamıyorEksik adı -d ile ekleyip sertifikayı yeniden alın

Yönlendirme döngüsünde, Nginx'in önünde TLS'i sonlandıran bir hizmet varsa (ör. Cloudflare gibi bir CDN) ve sunucuya HTTP ile bağlanıyorsa, 80'deki blokta yönlendirmeyi öndeki hizmetin bildirdiği protokole bağlayabilirsiniz:

Nginx
listen 80;
server_name ornek.com www.ornek.com;

# Yalnız ziyaretçi öndeki hizmete HTTP ile geldiyse yönlendir
if ($http_x_forwarded_proto = "http") {
    return 301 https://$host$request_uri;
}

root /var/www/ornek.com/public;

Bu başlığa yalnızca isteklerin gerçekten kendi vekilinizden geldiğinden eminseniz güvenin. Kalıcı çözüm, öndeki hizmet ile sunucunuz arasını da şifrelemektir. Aynı sorun, Nginx'in arkasındaki uygulama kendi içinde HTTPS'e yönlendirme yapıyor ama X-Forwarded-Proto başlığını dikkate almıyorsa da görülür.

Kontrol listesi

  • ssl_certificate tam zinciri (fullchain.pem), ssl_certificate_key özel anahtarı gösteriyor.
  • Özel anahtar yalnızca yetkili kullanıcı tarafından okunabiliyor; yedeklerde ve depolarda açıkta durmuyor.
  • http:// adresi tek adımda, 301 ile https:// adresine gidiyor; döngü yok.
  • Yalnızca TLS 1.2 ve 1.3 açık.
  • Karışık içerik uyarısı yok.
  • HSTS kısa süreyle denendi, sonra uzatıldı.
  • Deneme yenilemesi başarılı; yenilemeden sonra Nginx yeniden yükleniyor.
  • Sertifika bitiş tarihi ayrıca izleniyor: yedekleme ve izleme.

Sık sorulan sorular

Let's Encrypt sertifikası ücretli sertifikadan daha mı az güvenli?

Hayır. Şifreleme açısından fark yoktur; tarayıcılar ikisini de aynı şekilde kabul eder. Ücretli sertifikalarda fark, kuruluş kimliğinin ayrıca doğrulanması, destek ve garanti gibi ek hizmetlerdedir.

Sertifikayı yeniledim ama tarayıcı hâlâ eskisini gösteriyor; neden?

Nginx sertifika dosyasını yalnızca başlarken ve yeniden yüklenirken okur. "nginx -t" ile sınayıp "systemctl reload nginx" çalıştırın ve yenileme sonrasına bir yeniden yükleme kancası ekleyin.

www'li ve www'siz adres için ayrı sertifika gerekir mi?

Hayır. Tek bir sertifika birden çok adı kapsayabilir; Certbot komutunda her adı ayrı bir -d seçeneğiyle verin.

Sunucumun önünde CDN var; yine de sunucuda sertifika gerekir mi?

Evet, önerilir. CDN ile sunucunuz arasındaki bağlantı şifresiz kalırsa trafik o bölümde korunmaz ve yönlendirme döngüsü gibi sorunlar çıkabilir. CDN'i sunucuya HTTPS ile bağlanacak ve sertifikayı doğrulayacak şekilde ayarlayın.

HSTS'yi açtıktan sonra geri alabilir miyim?

Başlığı max-age=0 ile göndererek tarayıcılardaki kaydı silebilirsiniz; ancak bu, siteyi yeniden ziyaret eden tarayıcılarda ve yalnızca HTTPS çalışırken etkili olur. Bu yüzden uzun süreye geçmeden önce kısa süreyle denemek gerekir.

BYK Yazılım Destek Ekibi
Bu rehber BYK Yazılım destek ekibi tarafından hazırlanır ve düzenli olarak gözden geçirilir. Son güncelleme: 04.10.2026.

İlgili rehberler

Web sitenizin altyapısını birlikte konuşalım

BYK Yazılım kurumsal web siteleri geliştirir. Sitenizle ilgili sorularınız için bize yazabilirsiniz.

Bize ulaşın Kurumsal web sitesi hizmetimiz