Ubuntu 18.04 Üzerinde Nginx İçin Kendinden İmzalı (Self-Signed) SSL Sertifikası Oluşturma
Giriş
Günümüzde internet sitelerinin güvenliği, kullanıcı verilerinin korunması ve tarayıcıların sitelere olan güveni açısından kritik bir öneme sahiptir. Bu güvenliği sağlamanın temel yolu, siteler arası iletişimi şifreleyen SSL/TLS (Secure Sockets Layer/Transport Layer Security) protokollerini kullanmaktır. Bir web sitesine HTTPS üzerinden eriştiğinizde, tarayıcınız sunucunun kimliğini doğrular ve tüm iletişimi şifreler. Bu şifreleme işlemi, sunucuya yüklenen bir SSL sertifikası aracılığıyla gerçekleştirilir.
Genellikle, üretim ortamındaki web siteleri için Let’s Encrypt gibi ücretsiz veya ticari sertifika yetkilileri (CA – Certificate Authority) tarafından imzalanmış sertifikalar kullanılır. Bu sertifikalar, tarayıcılar tarafından otomatik olarak güvenilir kabul edilir ve kullanıcılara herhangi bir uyarı göstermez. Ancak, geliştirme ortamları, dahili uygulamalar, test sunucuları veya özel, kapalı ağlardaki servisler için kendinden imzalı (self-signed) SSL sertifikaları kullanmak pratik ve maliyetsiz bir çözüm olabilir.
Kendinden imzalı sertifikalar, bir sertifika yetkilisi tarafından değil, doğrudan sizin tarafınızdan oluşturulur ve imzalanır. Bu, tarayıcıların bu sertifikalara güvenmemesi ve kullanıcıya bir güvenlik uyarısı göstermesi anlamına gelir. Bu uyarıya rağmen, şifreleme işlemi hala gerçekleşir ve verileriniz güvende kalır. Bu makalede, Ubuntu 18.04 işletim sistemi üzerinde çalışan bir Nginx web sunucusu için kendinden imzalı bir SSL sertifikasının nasıl oluşturulacağını ve yapılandırılacağını adım adım açıklayacağız.
Ön Gereksinimler
Bu rehbere başlamadan önce, aşağıdaki ön koşulların mevcut olduğundan emin olun:
* Ubuntu 18.04 Sunucusu: Bu rehber, Ubuntu 18.04 sürümü için özel olarak yazılmıştır. Diğer Ubuntu sürümleri veya Linux dağıtımları için adımlar benzer olsa da küçük farklılıklar olabilir.
* Sudo Yetkileri: Sunucu üzerinde sudo komutunu kullanarak yönetici ayrıcalıklarına sahip bir kullanıcı hesabınız olmalıdır.
* Nginx Kurulumu: Sunucunuzda Nginx web sunucusunun kurulu ve çalışır durumda olması gerekmektedir. Eğer kurulu değilse, ilk adımda kurulumunu gerçekleştireceğiz.
* Temel Linux Bilgisi: Komut satırı (terminal) kullanımı ve temel dosya sistemi navigasyonu hakkında bilgi sahibi olmanız beklenir.
* OpenSSL: SSL sertifikaları oluşturmak için gerekli olan OpenSSL aracı genellikle Ubuntu sistemlerinde varsayılan olarak yüklü gelir.
1. Nginx Kurulumu ve Güncelleme (Eğer Kurulu Değilse)
Eğer Nginx sunucunuz zaten kurulu ve güncelse, bu adımı atlayabilirsiniz. Aksi takdirde, aşağıdaki komutları kullanarak sisteminizi güncelleyip Nginx’i kurun:
Sistem Paketlerini Güncelleme
İlk olarak, sunucunuzdaki paket listesini güncelleyin ve yüklü paketleri en son sürümlerine yükseltin:
sudo apt update
sudo apt upgrade -y
Nginx Kurulumu
Şimdi Nginx’i kurun:
sudo apt install nginx -y
Güvenlik Duvarını Yapılandırma (UFW)
Ubuntu’da varsayılan güvenlik duvarı olan UFW (Uncomplicated Firewall), gelen bağlantıları yönetmek için kullanılır. Nginx’in HTTP (80) ve HTTPS (443) portlarından erişilebilir olması için UFW’yi yapılandırmanız gerekir.
Nginx, UFW’ye kendi profilini kaydeder. Mevcut profilleri görmek için:
sudo ufw app list
Çıktıda genellikle ‘Nginx HTTP’, ‘Nginx HTTPS’ ve ‘Nginx Full’ seçeneklerini görürsünüz.
* Nginx HTTP: Yalnızca 80. portu açar (HTTP).
* Nginx HTTPS: Yalnızca 443. portu açar (HTTPS).
* Nginx Full: Hem 80. hem de 443. portları açar.
Şimdilik HTTP erişimine izin verelim, daha sonra HTTPS’i de ekleyeceğiz:
sudo ufw allow 'Nginx HTTP'
Eğer UFW etkin değilse, etkinleştirin ve başlangıçta çalışmasını sağlayın. Bu işlem mevcut SSH bağlantınızı kesebileceği için dikkatli olun:
sudo ufw enable
sudo ufw status
sudo ufw status komutu ile 80. portun açık olduğunu doğrulayın.
Nginx Servisini Başlatma ve Durumunu Kontrol Etme
Nginx servisini başlatın ve sistem başlangıcında otomatik olarak başlamasını sağlayın:
sudo systemctl start nginx
sudo systemctl enable nginx
Nginx’in çalışıp çalışmadığını kontrol etmek için:
sudo systemctl status nginx
Durum active (running) olarak görünmelidir. Sunucunuzun IP adresini veya alan adını bir web tarayıcısında ziyaret ederek Nginx’in varsayılan karşılama sayfasını görmelisiniz.
2. SSL Sertifikası ve Özel Anahtar Oluşturma
Kendinden imzalı SSL sertifikası ve özel anahtar dosyalarını oluşturmak için OpenSSL aracını kullanacağız.
Sertifika ve Anahtar Dosyaları İçin Dizin Oluşturma
Güvenlik nedenleriyle, SSL sertifikalarını ve özel anahtarları standart Nginx yapılandırma dizininden ayrı bir yerde saklamak iyi bir uygulamadır. Nginx için özel bir SSL dizini oluşturalım:
sudo mkdir -p /etc/nginx/ssl
Bu komut, /etc/nginx/ssl dizinini oluşturacaktır. Eğer nginx veya ssl dizinlerinden biri yoksa, -p bayrağı onları da otomatik olarak oluşturur.
OpenSSL Kullanarak Sertifika Oluşturma
Şimdi OpenSSL komutunu kullanarak kendinden imzalı sertifikayı ve özel anahtarı oluşturabiliriz:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/nginx/ssl/nginx.key -out /etc/nginx/ssl/nginx.crt
Bu komutu adım adım açıklayalım:
* sudo openssl req: OpenSSL’in sertifika imzalama isteği (CSR) yönetim komutunu kullanacağımızı belirtir. -x509 bayrağı ile bir CSR yerine doğrudan kendinden imzalı bir sertifika oluşturacağımızı belirtiriz.
* -x509: Bu bayrak, sertifika imzalama isteği yerine kendinden imzalı bir sertifika oluşturulacağını gösterir.
* -nodes: Özel anahtarın şifrelenmemesini (no DES encryption) sağlar. Bu, Nginx’in her yeniden başlatıldığında bir parola sormasını engeller. Üretim ortamında anahtarın şifrelenmesi daha güvenli kabul edilse de, kendinden imzalı sertifikalar için genelde bu bayrak kullanılır.
* -days 365: Sertifikanın geçerlilik süresini gün cinsinden ayarlar. Burada 365 gün (1 yıl) olarak belirlenmiştir. Geliştirme veya test ortamları için bu süre genellikle yeterlidir.
* -newkey rsa:2048: Yeni bir özel anahtar oluşturulacağını belirtir. rsa:2048, 2048 bitlik bir RSA anahtarı oluşturulacağını gösterir. Daha güçlü güvenlik için rsa:4096 da kullanılabilir, ancak işlem süresi daha uzun olabilir.
* -keyout /etc/nginx/ssl/nginx.key: Oluşturulan özel anahtarın kaydedileceği dosyanın yolunu belirtir.
* -out /etc/nginx/ssl/nginx.crt: Oluşturulan sertifikanın kaydedileceği dosyanın yolunu belirtir.
Bu komutu çalıştırdığınızda, OpenSSL size bazı sorular soracaktır. Bu bilgiler sertifikanın içeriğini oluşturur:
Country Name (2 letter code) [AU]:TR
State or Province Name (full name) [Some-State]:Istanbul
Locality Name (eg, city) []:Istanbul
Organization Name (eg, company) [Internet Widgits Pty Ltd]:MyCompany
Organizational Unit Name (eg, section) []:IT
Common Name (e.g. server FQDN or YOUR name) []:your_server_ip_or_domain.com
Email Address []:admin@your_domain.com
Önemli: Common Name (e.g. server FQDN or YOUR name) kısmına, sunucunuza erişmek için kullanacağınız alan adını (örneğin, example.com veya www.example.com) veya doğrudan sunucunuzun IP adresini girmelisiniz. Eğer bu isim tarayıcıda girdiğiniz adresle eşleşmezse, tarayıcı daha fazla uyarı gösterecektir.
Dosya İzinlerini Ayarlama
Özel anahtar dosyası (nginx.key) çok hassas bilgiler içerir ve yalnızca Nginx tarafından okunabilir olmalıdır. Sertifika dosyası (nginx.crt) ise daha az hassastır ve herkes tarafından okunabilir. Doğru izinleri ayarlamak için:
sudo chmod 600 /etc/nginx/ssl/nginx.key
sudo chmod 644 /etc/nginx/ssl/nginx.crt
* chmod 600: Yalnızca dosya sahibinin okuma ve yazma iznine sahip olmasını sağlar. Diğer kullanıcılar veya gruplar için hiçbir izin yoktur.
* chmod 644: Dosya sahibinin okuma ve yazma, diğerlerinin ise sadece okuma iznine sahip olmasını sağlar.
Bu izinler, özel anahtarınızın güvenliğini artırır.
3. Nginx’i SSL Kullanacak Şekilde Yapılandırma
Şimdi Nginx’i oluşturduğumuz SSL sertifikasını kullanacak şekilde yapılandırmamız gerekiyor.
Nginx Yapılandırma Dosyasını Düzenleme
Varsayılan Nginx yapılandırma dosyasını düzenleyeceğiz. Bu genellikle /etc/nginx/sites-available/default konumunda bulunur:
sudo nano /etc/nginx/sites-available/default
Dosyayı açtıktan sonra, HTTP (port 80) bloğunu yorum satırı haline getirebilir veya HTTPS’e yönlendirme yapacak şekilde düzenleyebilirsiniz. Ardından, HTTPS (port 443) için yeni bir server bloğu ekleyin veya mevcut bloğu düzenleyin.
Aşağıdaki yapılandırma örneğini server bloğunun içine ekleyin veya mevcut server bloğunuzu buna benzer şekilde güncelleyin:
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name your_domain.com www.your_domain.com your_server_ip; # Kendi alan adınızı veya IP adresinizi girin
ssl_certificate /etc/nginx/ssl/nginx.crt;
ssl_certificate_key /etc/nginx/ssl/nginx.key;
ssl_protocols TLSv1.2 TLSv1.3; # Yalnızca güvenli TLS protokollerini kullanın
ssl_ciphers 'ECDHE-RSA-AES256-GCM-SHA512:DHE-RSA-AES256-GCM-SHA512:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384'; # Güçlü şifreleme algoritmaları
ssl_prefer_server_ciphers on;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 10m;
root /var/www/html; # Web sitenizin kök dizini
index index.html index.htm index.nginx-debian.html;
location / {
try_files $uri $uri/ =404;
}
# Diğer Nginx yapılandırmalarınız buraya gelebilir (örneğin, loglar, hata sayfaları vb.)
}
Açıklamalar:
* listen 443 ssl;: Nginx’in 443. portu (HTTPS) dinlemesini ve SSL kullanmasını sağlar.
* server_name: Sunucunuzun alan adını veya IP adresini belirtin. Sertifika oluştururken kullandığınız Common Name ile eşleşmelidir.
* ssl_certificate: Sertifika dosyasının yolunu belirtir.
* ssl_certificate_key: Özel anahtar dosyasının yolunu belirtir.
* ssl_protocols: Kullanılacak TLS protokollerini belirler. TLSv1.2 ve TLSv1.3 şu anda en güvenli seçeneklerdir.
* ssl_ciphers: Nginx’in kullanacağı şifreleme algoritmalarını belirler. Güçlü ve modern algoritmalar seçmek önemlidir.
* ssl_prefer_server_ciphers on;: Sunucunun kendi şifreleme tercihini kullanmasını sağlar.
* ssl_session_cache ve ssl_session_timeout: SSL oturum önbelleğini ve zaman aşımını yapılandırır. Bu, yeniden bağlantılarda el sıkışma süresini kısaltarak performansı artırır.
* root ve index: Web sitenizin ana dizinini ve varsayılan dizin dosyalarını belirtir.
HTTP’den HTTPS’e Yönlendirme (İsteğe Bağlı ama Önerilir)
Kullanıcıların sitenize her zaman güvenli bağlantı üzerinden erişmesini sağlamak için, HTTP (port 80) üzerinden gelen tüm istekleri HTTPS’e (port 443) yönlendirmek iyi bir uygulamadır. Bunu, yapılandırma dosyanıza aşağıdaki gibi ayrı bir server bloğu ekleyerek yapabilirsiniz:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com your_server_ip; # Kendi alan adınızı veya IP adresinizi girin
return 301 https://$host$request_uri;
}
Bu blok, 80. porttan gelen tüm istekleri kalıcı olarak (301 kodu ile) HTTPS sürümüne yönlendirir.
Yapılandırma dosyasını kaydetmek ve kapatmak için CTRL+X, ardından Y ve Enter tuşlarına basın.
Yapılandırma Sözdizimini Kontrol Etme
Nginx yapılandırmanızda herhangi bir sözdizimi hatası olup olmadığını kontrol etmek için aşağıdaki komutu çalıştırın:
sudo nginx -t
Eğer her şey yolundaysa, şöyle bir çıktı görmelisiniz:
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Herhangi bir hata varsa, nano ile dosyayı tekrar açıp hataları düzeltin.
Nginx’i Yeniden Başlatma
Yapılandırma değişikliklerinin etkili olması için Nginx servisini yeniden başlatın:
sudo systemctl restart nginx
4. Güvenlik Duvarını Yapılandırma (UFW)
Daha önce sadece HTTP trafiğine izin vermiştik. Şimdi HTTPS trafiğine de izin vermek için UFW’yi güncellememiz gerekiyor:
sudo ufw allow 'Nginx HTTPS'
Eğer HTTP’den HTTPS’e yönlendirme yaptıysanız ve sadece HTTPS üzerinden erişim sağlamak istiyorsanız, Nginx HTTP kuralını kaldırabilirsiniz:
sudo ufw delete allow 'Nginx HTTP'
Güncel güvenlik duvarı kurallarınızı kontrol edin:
sudo ufw status
443. portun açık olduğunu ve (isteğe bağlı olarak) 80. portun kapalı olduğunu görmelisiniz.
5. Test Etme
Şimdi web tarayıcınızı açın ve sunucunuzun IP adresini veya alan adını HTTPS protokolü ile ziyaret edin:
https://your_server_ip_or_domain.com
Kendinden imzalı bir sertifika kullandığınız için tarayıcınız büyük olasılıkla bir güvenlik uyarısı gösterecektir. Bu normaldir ve beklenen bir durumdur. Tarayıcınızın uyarı mesajına bağlı olarak “Gelişmiş” veya “Devam et” gibi bir seçeneği tıklayarak siteye erişebilirsiniz.
Tarayıcınızın adres çubuğundaki kilit simgesine tıklayarak veya “Sertifika Bilgileri” (Certificate Information) bölümüne giderek sertifikanızın detaylarını kontrol edebilirsiniz. Sertifikayı oluştururken girdiğiniz bilgilerin (Common Name, Organization vb.) burada göründüğünden emin olun.
Gelişmiş Ayarlar ve En İyi Uygulamalar
Nginx SSL yapılandırmanızı daha da güçlendirmek için bazı ek adımlar uygulayabilirsiniz:
Diffie-Hellman Parametreleri Oluşturma
Diffie-Hellman (DH) parametreleri, “ileri gizlilik” (Forward Secrecy) sağlamak için kullanılır. Bu, bir oturum anahtarının gelecekte tehlikeye atılması durumunda bile geçmiş oturumların şifresinin çözülemeyeceği anlamına gelir. Güçlü bir DH grubu oluşturmak biraz zaman alabilir:
sudo openssl dhparam -out /etc/nginx/ssl/dhparam.pem 2048
Bu komut 2048 bitlik bir DH parametre dosyası oluşturur. Daha güçlü güvenlik için 4096 bit de kullanabilirsiniz (rsa:4096 gibi), ancak bu işlem çok daha uzun sürebilir.
Oluşturduktan sonra, bu dosyayı Nginx yapılandırmanıza ekleyin:
# ... diğer ssl ayarları ...
ssl_dhparam /etc/nginx/ssl/dhparam.pem;
...
HSTS (HTTP Strict Transport Security) Ekleme
HSTS, tarayıcılara sitenize her zaman HTTPS üzerinden bağlanmalarını söyleyen bir güvenlik politikasıdır. Bu, kullanıcıların yanlışlıkla HTTP üzerinden erişmesini veya SSL şeritleme saldırılarına maruz kalmasını önler.
HTTPS server bloğunuza aşağıdaki satırı ekleyin:
# ... diğer ayarlar ...
add_header Strict-Transport-Security "max-age=31536000; includeSubDomains" always;
...
* max-age=31536000: Tarayıcıya bu kuralı 1 yıl (31,536,000 saniye) boyunca hatırlamasını söyler.
* includeSubDomains: Bu kuralın tüm alt alan adları için de geçerli olmasını sağlar.
* always: Yanıtlara her zaman bu başlığı ekler.
Bu başlığı ekledikten sonra Nginx’i yeniden başlatmayı unutmayın.
Sorun Giderme
Eğer bir sorunla karşılaşırsanız, aşağıdaki adımları izleyerek sorunu gidermeye çalışabilirsiniz:
* Nginx Yapılandırma Kontrolü: sudo nginx -t komutuyla yapılandırma dosyanızda sözdizimi hatası olup olmadığını kontrol edin.
* Nginx Durumu: sudo systemctl status nginx komutuyla Nginx servisinin çalışıp çalışmadığını kontrol edin. Hata mesajları için sudo journalctl -xe komutunu kullanabilirsiniz.
* Nginx Hata Kayıtları: Nginx’in hata kayıtlarını kontrol edin: /var/log/nginx/error.log. Bu dosya, yapılandırma hataları veya erişim sorunları hakkında ipuçları verebilir.
* Güvenlik Duvarı: sudo ufw status komutuyla 443. portun açık olduğundan emin olun.
* Dosya Yolları ve İzinler: Sertifika ve anahtar dosyalarının yollarının Nginx yapılandırmasında doğru olduğundan ve dosya izinlerinin (özellikle özel anahtar için 600) doğru ayarlandığından emin olun.
* Common Name Uyuşmazlığı: Sertifikayı oluştururken girdiğiniz “Common Name” ile tarayıcıda girdiğiniz adresin tam olarak eşleştiğinden emin olun.
Sonuç
Bu makalede, Ubuntu 18.04 üzerinde Nginx için kendinden imzalı bir SSL sertifikasının nasıl oluşturulacağını ve yapılandırılacağını ayrıntılı bir şekilde ele aldık. Kendinden imzalı sertifikalar, geliştirme ve test ortamları için hızlı ve etkili bir çözüm sunar, ancak tarayıcıların uyarı vermesi nedeniyle üretim ortamları için uygun değildir.
Geliştirme sürecinizde güvenli bağlantıların önemini anlamak ve uygulamak, daha güvenli uygulamalar geliştirmenize yardımcı olacaktır. Üretim ortamına geçtiğinizde ise, Let’s Encrypt gibi ücretsiz ve güvenilir bir sertifika yetkilisinden (Certbot aracı ile) sertifika almayı veya ticari bir CA’dan sertifika edinmeyi kesinlikle düşünmelisiniz. Bu sayede kullanıcılarınız herhangi bir güvenlik uyarısı almadan sitenize güvenli bir şekilde erişebilirler. Bu rehber, Nginx ve SSL sertifikalarıyla çalışma konusunda size sağlam bir temel sağlamıştır.