Apache SSL/TLS Sertifikası Kurulumu ve HTTPS Zorlama

Web siteniz HTTP üzerinden çalışıyorsa, ziyaretçilerinizin verilerini açık havada bırakıyorsunuz demektir. Günümüzde HTTPS artık bir lüks değil, temel bir gereklilik. Google arama sıralamasında HTTP siteleri cezalandırılıyor, modern tarayıcılar “Güvenli Değil” uyarısı gösteriyor ve kullanıcılar bu uyarıyı görünce kaçıyor. Bu yazıda Apache üzerinde SSL/TLS sertifikası kurulumunu, Let’s Encrypt ile ücretsiz sertifika almayı ve tüm HTTP trafiğini HTTPS’e yönlendirmeyi adım adım ele alacağız.

Ön Gereksinimler

Başlamadan önce birkaç şeyin hazır olması gerekiyor. Sunucunuzda Apache 2.4 veya üzeri kurulu olmalı, 80 ve 443 portları dışarıya açık olmalı ve alan adınızın DNS kaydı sunucu IP’nize doğru bakıyor olmalı. Let’s Encrypt kullanacaksanız alan adı doğrulaması yapılacağı için DNS kaydının doğru olması kritik.

Önce sistemin güncel olduğundan emin olalım:

# Ubuntu/Debian
sudo apt update && sudo apt upgrade -y

# CentOS/RHEL/AlmaLinux
sudo dnf update -y

Apache’nin çalıştığını doğrulayalım:

sudo systemctl status apache2    # Ubuntu/Debian
sudo systemctl status httpd      # CentOS/RHEL

Apache SSL Modülünü Aktif Etmek

Ubuntu/Debian tabanlı sistemlerde SSL modülü varsayılan olarak kurulu gelir ama aktif değildir. Birkaç komutla aktif edebilirsiniz:

# SSL modülünü etkinleştir
sudo a2enmod ssl

# Rewrite modülünü da etkinleştir (HTTPS yönlendirmesi için lazım)
sudo a2enmod rewrite

# Headers modülü HSTS için gerekli
sudo a2enmod headers

# Apache'yi yeniden başlat
sudo systemctl restart apache2

CentOS/AlmaLinux tarafında ise mod_ssl paketi ayrıca yüklenmesi gerekebilir:

sudo dnf install mod_ssl -y
sudo systemctl restart httpd

Modüllerin aktif olduğunu doğrulamak için:

apache2ctl -M | grep -E "ssl|rewrite|headers"

Çıktıda ssl_module, rewrite_module ve headers_module görmeniz gerekiyor.

Let’s Encrypt ile Ücretsiz SSL Sertifikası

Let’s Encrypt, ücretsiz ve güvenilir SSL sertifikaları sunan bir sertifika otoritesidir. Certbot aracı sayesinde kurulum ve yenileme işlemleri tamamen otomatik hale geliyor. Ticari projeler dahil her türlü site için kullanabilirsiniz.

Certbot Kurulumu

# Ubuntu/Debian
sudo apt install certbot python3-certbot-apache -y

# CentOS/RHEL/AlmaLinux
sudo dnf install epel-release -y
sudo dnf install certbot python3-certbot-apache -y

Sertifika Alma

Certbot, Apache konfigürasyonunuzu otomatik olarak düzenleyebilir. --apache parametresi bunu sağlar:

sudo certbot --apache -d siteniz.com -d www.siteniz.com

Komut çalıştırıldığında sizden birkaç bilgi istenir: e-posta adresiniz (yenileme bildirimleri için), hizmet şartlarını kabul edip etmediğiniz ve EFF bültenine abone olmak isteyip istemediğiniz. Ardından certbot alan adı doğrulamasını yapar ve sertifikayı /etc/letsencrypt/live/siteniz.com/ dizinine kaydeder.

Sadece sertifika alıp konfigürasyonu kendiniz yapmak isterseniz:

sudo certbot certonly --webroot -w /var/www/html -d siteniz.com -d www.siteniz.com

Bu komut /etc/letsencrypt/live/siteniz.com/ altında dört dosya oluşturur:

  • fullchain.pem: Sertifika ve ara sertifika zinciri (Apache konfigürasyonunda bu kullanılır)
  • privkey.pem: Özel anahtar (kesinlikle dışarıya sızdırılmamalı)
  • cert.pem: Sadece site sertifikası
  • chain.pem: Sadece ara sertifika zinciri

Manuel SSL Konfigürasyonu

Certbot’un otomatik konfigürasyonu yerine kendi VirtualHost ayarlarınızı yazmayı tercih edebilirsiniz. Bu yol daha fazla kontrol sağlar ve tam olarak ne yaptığınızı anlamanıza yardımcı olur.

VirtualHost Konfigürasyonu

Ubuntu/Debian sistemlerde /etc/apache2/sites-available/siteniz.com-ssl.conf dosyasını oluşturun:

sudo nano /etc/apache2/sites-available/siteniz.com-ssl.conf

İçeriği şu şekilde olmalı:

<VirtualHost *:443>
    ServerName siteniz.com
    ServerAlias www.siteniz.com
    DocumentRoot /var/www/siteniz.com/public_html

    # SSL Motorunu Aç
    SSLEngine on

    # Sertifika Dosyaları
    SSLCertificateFile /etc/letsencrypt/live/siteniz.com/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/siteniz.com/privkey.pem

    # Güvenli SSL Protokolleri (TLS 1.2 ve 1.3)
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1

    # Güçlü Şifreleme Algoritmaları
    SSLCipherSuite ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384

    # Sunucu şifre tercihini etkinleştir
    SSLHonorCipherOrder off

    # HSTS başlığı (1 yıl, subdomain dahil)
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    # Ek güvenlik başlıkları
    Header always set X-Frame-Options DENY
    Header always set X-Content-Type-Options nosniff

    ErrorLog ${APACHE_LOG_DIR}/siteniz.com-ssl-error.log
    CustomLog ${APACHE_LOG_DIR}/siteniz.com-ssl-access.log combined
</VirtualHost>

CentOS/RHEL tarafında konfigürasyonu /etc/httpd/conf.d/siteniz.com-ssl.conf olarak kaydedin. Dizin yapısı farklıdır ama içerik aynı kalır.

Siteyi aktif edin (Ubuntu/Debian):

sudo a2ensite siteniz.com-ssl.conf
sudo systemctl reload apache2

HTTP’den HTTPS’e Yönlendirme

Sertifika kurulduktan sonra en önemli adım HTTP trafiğini HTTPS’e yönlendirmek. Bunu yapmadan siteniz hem HTTP hem HTTPS üzerinden erişilebilir olmaya devam eder, bu da hem güvenlik açığı hem de SEO problemi demektir.

VirtualHost ile Yönlendirme

HTTP için olan VirtualHost konfigürasyonunu düzenleyin. Eğer mevcut bir 80 portlu VirtualHost’unuz varsa içeriğini şu şekilde değiştirin:

<VirtualHost *:80>
    ServerName siteniz.com
    ServerAlias www.siteniz.com

    # Let's Encrypt doğrulama klasörüne izin ver
    Alias /.well-known/acme-challenge/ /var/www/html/.well-known/acme-challenge/
    <Directory /var/www/html/.well-known/acme-challenge/>
        Options None
        AllowOverride None
        ForceType text/plain
        RedirectMatch 404 "^(?!/.well-known/acme-challenge/)"
    </Directory>

    # Her şeyi HTTPS'e yönlendir
    RewriteEngine On
    RewriteCond %{REQUEST_URI} !^/.well-known/acme-challenge/
    RewriteRule ^(.*)$ https://%{HTTP_HOST}$1 [R=301,L]
</VirtualHost>

R=301 kalıcı yönlendirme anlamına gelir. Bu SEO açısından önemli, 302 (geçici) kullanmayın.

.htaccess ile Yönlendirme

Bazı durumlarda sunucu konfigürasyonuna erişiminiz olmayabilir veya uygulama bazlı yönlendirme yapmanız gerekebilir. Bu durumda .htaccess dosyasını kullanabilirsiniz:

# /var/www/siteniz.com/public_html/.htaccess
RewriteEngine On
RewriteCond %{HTTPS} off
RewriteRule ^(.*)$ https://%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

# www olmayan adresleri www'ye yönlendir (opsiyonel)
RewriteCond %{HTTP_HOST} !^www.
RewriteRule ^(.*)$ https://www.%{HTTP_HOST}%{REQUEST_URI} [R=301,L]

.htaccess yönlendirmesinin çalışması için VirtualHost konfigürasyonunda AllowOverride All ayarının yapılmış olması gerekir.

Sertifika Otomatik Yenileme

Let’s Encrypt sertifikaları 90 günde bir sona erer. Manuel yenileme yapmak yerine cron job veya systemd timer kullanarak otomatik yenileme ayarlamalısınız. Certbot kurulumu genellikle bunu otomatik olarak ayarlar ama doğrulamak iyi bir alışkanlık.

Önce yenileme komutunu test edin:

sudo certbot renew --dry-run

Eğer hata çıkmazsa systemd timer durumunu kontrol edin:

sudo systemctl status certbot.timer

Timer yoksa veya çalışmıyorsa cron job ekleyebilirsiniz:

sudo crontab -e

Şu satırı ekleyin:

# Her gün gece 2:30 ve öğleden sonra 2:30'da yenileme kontrolü
30 2,14 * * * /usr/bin/certbot renew --quiet --post-hook "systemctl reload apache2"

--quiet parametresi çıktıyı bastırır, sadece hata durumunda e-posta gelir. --post-hook ise yenileme başarılı olursa Apache’yi reload eder.

SSL Konfigürasyonunu Test Etmek

Konfigürasyonu yazdıktan sonra test etmeden production’a almak doğru değil. Birkaç farklı yöntemle kontrol yapabilirsiniz.

Önce Apache konfigürasyon sözdizimini kontrol edin:

sudo apache2ctl configtest    # Ubuntu/Debian
sudo httpd -t                 # CentOS/RHEL

Syntax OK mesajı görmelisiniz. Ardından SSL bağlantısını test edin:

# openssl ile SSL el sıkışmasını test et
openssl s_client -connect siteniz.com:443 -servername siteniz.com

# Kullanılan protokol ve şifrelemeyi görüntüle
openssl s_client -connect siteniz.com:443 2>/dev/null | grep -E "Protocol|Cipher"

# Sertifika geçerlilik tarihini kontrol et
echo | openssl s_client -connect siteniz.com:443 2>/dev/null | openssl x509 -noout -dates

Curl ile HTTPS yönlendirmesini test edin:

# HTTP'nin HTTPS'e yönlendirildiğini kontrol et
curl -I http://siteniz.com

# HTTPS'in düzgün çalıştığını kontrol et
curl -I https://siteniz.com

HTTP için 301 Moved Permanently ve Location: https://siteniz.com/ görmeniz gerekiyor.

Online olarak da test yapabilirsiniz. SSL Labs (ssllabs.com/ssltest) sitenizin SSL konfigürasyonunu detaylı analiz eder ve A+ notu almanız için öneriler sunar. SecurityHeaders.com ise güvenlik başlıklarınızı değerlendirir.

Gerçek Dünya Senaryosu: Mixed Content Sorunu

HTTPS’e geçtikten sonra karşılaşılan en yaygın sorun mixed content hatasıdır. Siteniz HTTPS üzerinden gelirken, sayfa içindeki bazı kaynaklar (resimler, JavaScript, CSS) hala HTTP ile yüklenmeye çalışıyorsa tarayıcı uyarı verir ve güvenli kilit simgesi kırılır.

Bu sorunu tespit etmek için tarayıcının geliştirici araçlarını açın ve Console sekmesine bakın. “Mixed Content” içeren uyarılar görüyorsanız sorun vardır.

Apache seviyesinde bu sorunu kısmen çözebilirsiniz:

# VirtualHost (443) konfigürasyonuna ekleyin
# Sabit URL'leri HTTPS'e çevirir (sadece proxy için)
RequestHeader set X-Forwarded-Proto "https"
RequestHeader set X-Forwarded-SSL "on"

# Content Security Policy ile mixed content'i engelle
Header always set Content-Security-Policy "upgrade-insecure-requests"

upgrade-insecure-requests direktifi tarayıcıya HTTP kaynaklarını otomatik olarak HTTPS ile yüklemeyi söyler. Ancak bu tam çözüm değil, uygulamanızdaki hardcoded HTTP URL’lerini de düzeltmeniz gerekir.

Özel (Self-Signed) Sertifika Oluşturma

Production ortamı için asla önerilmez ama geliştirme ve test ortamları için self-signed sertifika kullanabilirsiniz. Kullanıcılar tarayıcıda uyarı göreceğinden production’da kullanmayın.

# Özel anahtar ve sertifika oluştur (geçerlilik: 365 gün)
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 
    -keyout /etc/ssl/private/siteniz.com.key 
    -out /etc/ssl/certs/siteniz.com.crt 
    -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi/CN=siteniz.com"

# Dosya izinlerini ayarla
sudo chmod 600 /etc/ssl/private/siteniz.com.key
sudo chmod 644 /etc/ssl/certs/siteniz.com.crt

VirtualHost konfigürasyonunda dosya yollarını buna göre güncelleyin:

SSLCertificateFile /etc/ssl/certs/siteniz.com.crt
SSLCertificateKeyFile /etc/ssl/private/siteniz.com.key

Wildcard Sertifika

Alt alan adlarınız çoksa (api.siteniz.com, mail.siteniz.com, panel.siteniz.com gibi) her biri için ayrı sertifika almak yerine wildcard sertifika kullanabilirsiniz. Let’s Encrypt ile wildcard sertifika almak için DNS doğrulaması zorunludur:

sudo certbot certonly --manual --preferred-challenges dns 
    -d siteniz.com -d "*.siteniz.com"

Bu komut size bir DNS TXT kaydı değeri verir. Bu değeri DNS sağlayıcınızda _acme-challenge.siteniz.com adında TXT kaydı olarak eklemeniz, ardından Enter’a basmanız gerekir. DNS yayılması birkaç dakika sürebilir.

Ticari SSL Sertifikası Kurulumu

Let’s Encrypt yerine ticari bir sertifika kullanıyorsanız (örneğin DigiCert, Comodo, GlobalSign) kurulum süreci biraz farklı. Önce Certificate Signing Request (CSR) oluşturmanız gerekir:

# Özel anahtar oluştur
sudo openssl genrsa -out /etc/ssl/private/siteniz.com.key 2048

# CSR oluştur
sudo openssl req -new -key /etc/ssl/private/siteniz.com.key 
    -out /etc/ssl/csr/siteniz.com.csr 
    -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi/OU=IT/CN=siteniz.com"

CSR dosyasının içeriğini sertifika sağlayıcınıza gönderirsiniz. Onlar size genellikle üç dosya gönderir: sertifika, ara sertifika (intermediate) ve kök sertifika. Bunları Apache’de şöyle yapılandırırsınız:

SSLCertificateFile /etc/ssl/certs/siteniz.com.crt
SSLCertificateKeyFile /etc/ssl/private/siteniz.com.key
# Ara sertifika zinciri (ticari sertifikalar için önemli)
SSLCACertificateFile /etc/ssl/certs/intermediate.crt

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

Sertifika bulunamadı hatası: Certbot’un sertifika kaydettiği dizini kontrol edin. sudo certbot certificates komutu mevcut sertifikaları listeler.

Port 443 bağlantı reddedildi: Güvenlik duvarı kurallarını kontrol edin. Ubuntu’da sudo ufw allow 443/tcp, CentOS’ta sudo firewall-cmd --permanent --add-service=https && sudo firewall-cmd --reload komutları gerekli olabilir.

Apache başlamıyor: sudo journalctl -xe veya /var/log/apache2/error.log dosyasına bakın. Genellikle dosya yolu yanlışlığı veya izin sorunu olur.

Yönlendirme döngüsü: Eğer bir yük dengeleyici veya reverse proxy arkasındaysanız, proxy SSL’i sonlandırıyorsa Apache’nin X-Forwarded-Proto başlığına göre yönlendirme yapması gerekir. Doğrudan %{HTTPS} kontrolü yerine %{HTTP:X-Forwarded-Proto} kullanın.

Let’s Encrypt rate limit: Let’s Encrypt haftada domain başına 5 sertifika üretim limitine sahip. Sık sık deneme yapıyorsanız --staging parametresiyle test ortamını kullanın: sudo certbot --staging --apache -d siteniz.com

Güvenlik Başlıklarını Güçlendirmek

SSL sertifikası kurulumu tek başına yeterli değil. Güvenlik başlıklarını da düzgün yapılandırmak gerekiyor. Apache global konfigürasyonuna veya VirtualHost’a şunları ekleyebilirsiniz:

# /etc/apache2/conf-available/security-headers.conf
<IfModule mod_headers.c>
    # HSTS: Tarayıcıya 1 yıl boyunca sadece HTTPS kullan
    Header always set Strict-Transport-Security "max-age=31536000; includeSubDomains; preload"

    # Clickjacking koruması
    Header always set X-Frame-Options "SAMEORIGIN"

    # MIME type sniffing koruması
    Header always set X-Content-Type-Options "nosniff"

    # XSS koruması
    Header always set X-XSS-Protection "1; mode=block"

    # Referrer politikası
    Header always set Referrer-Policy "strict-origin-when-cross-origin"

    # Eski TLS sürümlerini devre dışı bırak
    SSLProtocol all -SSLv3 -TLSv1 -TLSv1.1
</IfModule>

Bu konfigürasyonu etkinleştirmek için:

sudo a2enconf security-headers
sudo systemctl reload apache2

Sonuç

Apache üzerinde SSL/TLS kurulumu artık eskisi kadar karmaşık değil. Let’s Encrypt ve Certbot sayesinde ücretsiz, güvenilir sertifikalar birkaç dakika içinde kurulabiliyor ve otomatik yenileme ile bakım yükü minimuma indirilmiş oluyor. Önemli olan sertifikayı kurmakla kalmayıp HTTPS yönlendirmesini doğru yapılandırmak, güvenlik başlıklarını eklemek ve düzenli olarak SSL Labs gibi araçlarla konfigürasyonu test etmek.

Production sunucularında en az ayda bir kez sudo certbot certificates ile sertifika geçerlilik tarihlerini kontrol etmeyi alışkanlık haline getirin. Sertifika sona erme e-posta bildirimleri için Certbot’u kayıt ettirdiğiniz e-posta adresini aktif tutun. Bunların yanı sıra sunucunuzu düzenli olarak güncellemek, TLS 1.0 ve 1.1 gibi eski protokolleri devre dışı bırakmak ve güçlü şifreleme algoritmaları kullanmak güvenlik açısından kritik önem taşıyor. HTTPS bir varış noktası değil, sürekli bakım gerektiren bir süreçtir.

Yorum yapın