giriiş
TLS (Transport Layer Security) ve onun öncülü olan SSL (Secure Sockets Layer), bilgisayar ağları üzerindeki trafiği korumak ve şifrelemek için kullanılan web protokolleridir.
TLS/SSL sayesinde sunucular, dış tarafların mesajları engellemesine gerek kalmadan, sunucu ile istemciler arasında güvenli bir şekilde trafik gönderebilir. Sertifika sistemi ayrıca kullanıcıların etkileşimde bulundukları sitelerin kimliğini doğrulamalarına da yardımcı olur.
Bu kılavuzda, bir Ubuntu sunucusunda Nginx web sunucusuyla kullanılmak üzere kendi kendine imzalı bir SSL sertifikası ayarlayacaksınız.
Ön koşullar
- Başlamadan önce, sudo ayrıcalıklarına sahip, kök olmayan bir kullanıcı ve etkin bir güvenlik duvarınız olmalıdır.
- Ayrıca Nginx web sunucusunu da kurmanız gerekiyor.
- Sunucunuza tam bir LEMP yığını (Linux, Nginx, MySQL, PHP) kurmak istiyorsanız.
Adım 1 – TLS sertifikası oluşturun
TLS/SSL, genel bir sertifika ve özel bir anahtarın birleşimiyle çalışır. SSL anahtarı sunucuda gizli tutulur ve istemcilere gönderilen içeriği şifreler. SSL sertifikası, içeriği talep eden herkesle herkese açık olarak paylaşılır. İlişkili SSL anahtarıyla imzalanan içeriğin şifresini çözmek için kullanılabilir.
OpenSSL ile tek bir komutla kendi kendine imzalanmış bir anahtar çifti ve sertifika oluşturabilirsiniz:
sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/nginx-selfsigned.key -out /etc/ssl/certs/nginx-selfsigned.crtBu komutun her bir parçasının ne işe yaradığının özeti şöyledir:
sudo: Sudo komutu, sudo grubu üyelerinin ayrıcalıklarını geçici olarak başka bir kullanıcıya (varsayılan olarak süper kullanıcı veya kök kullanıcı) yükseltmelerine olanak tanır. Bu, /etc/ dizininde yalnızca kök kullanıcı veya diğer ayrıcalıklı hesaplar tarafından erişilebilen bir sertifika ve anahtar çifti oluşturduğumuz için bu durumda gereklidir.openssl: Bu, OpenSSL sertifikalarını, anahtarlarını ve diğer dosyaları oluşturmak ve yönetmek için kullanılan ana komut satırı aracıdır.rica etmek: Bu alt komut, X.509 Sertifika İmzalama İsteği (CSR) yönetimini kullanmak istediğimizi belirtir. "X.509", SSL ve TLS'nin anahtar ve sertifika yönetimi için uyduğu bir genel anahtar altyapı standardıdır. Yeni bir X.509 sertifikası oluşturmak istediğimiz için bu alt komutu kullanıyoruz.- –
x509: Bu, genellikle olduğu gibi bir sertifika imzalama isteği oluşturmak yerine kendi kendine imzalanmış bir sertifika oluşturmak istediğimizi söyleyerek önceki alt komutu değiştirir. - –
düğümler: Bu, OpenSSL'e sertifikamızı bir parola ile güvence altına alma seçeneğini atlamasını söyler. Sunucu başlatıldığında Nginx'in kullanıcı müdahalesi olmadan dosyayı okuyabilmesi gerekir. Parola, her yeniden başlatmadan sonra girmemiz gerektiğinden bunun olmasını engeller. -gün 365: Bu seçenek, sertifikanın geçerli sayılacağı süreyi belirler. Biz burada bir yıl olarak ayarladık.-newkey rsa:2048: Aynı anda yeni bir sertifika ve yeni bir anahtar oluşturmak istediğimizi belirtir. Önceki adımda sertifikayı imzalamak için gereken anahtarı oluşturmadık, bu yüzden sertifikayla birlikte oluşturmamız gerekiyor. RSA:2048 kısmı, 2048 bit uzunluğunda bir RSA anahtarı oluşturmasını söyler.-anahtar çıkışı: Bu satır OpenSSL'e oluşturduğumuz özel anahtar dosyasının nereye yerleştirileceğini söyler.-dışarı: Bu, OpenSSL'e oluşturduğumuz sertifikanın nereye yerleştirileceğini söyler.
Daha önce de belirtildiği gibi, bu seçenekler hem bir anahtar dosyası hem de bir sertifika oluşturur. Bu komutu çalıştırdıktan sonra, bilgileri sertifikaya düzgün bir şekilde yerleştirmek için sunucunuz hakkında birkaç soru sorulacaktır.
Komutları doğru bir şekilde doldurun. En önemli satır, paylaşılan adı (yani sunucunun tam alan adını veya adınızı) soran satırdır. Sunucunuzla ilişkili alan adını veya büyük olasılıkla sunucunuzun genel IP adresini girmeniz gerekecektir.
Komutun tamamı şu şekilde olacak:
Output
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:New York City
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Bouncy Castles, Inc.
Organizational Unit Name (eg, section) []:Ministry of Water Slides
Common Name (e.g. server FQDN or YOUR name) []:server_IP_address
Email Address []:admin@your_domain.comOluşturduğunuz her iki dosya da /etc/ssl dizininin uygun alt dizinlerine yerleştirilecektir.
OpenSSL kullanırken, istemcilerle pazarlık yaparken tam ileri gizlilik kullanan güçlü bir Diffie-Hellman (DH) grubu da oluşturmalısınız.
Bunu şunu yazarak yapabilirsiniz:
sudo openssl dhparam -out /etc/nginx/dhparam.pem 4096Bu biraz zaman alacaktır, ancak tamamlandığında /etc/nginx/dhparam.pem dizininde yapılandırma sırasında kullanılacak güçlü bir DH grubunuz olacak.
Adım 2 – Nginx'i SSL kullanacak şekilde yapılandırın
Artık anahtar ve sertifika dosyalarınız /etc/ssl dizininde oluşturulduğuna göre, bunları kullanmak için Nginx yapılandırmanızı değiştirmeniz gerekiyor.
İlk olarak, SSL anahtarı ve sertifika dosyasının konumları hakkında bilgi içeren bir yapılandırma parçası oluşturacaksınız. Ardından, gelecekteki tüm sertifikalarla kullanılabilecek güçlü SSL ayarlarına sahip bir yapılandırma parçası oluşturacaksınız. Son olarak, SSL isteklerinin uygun şekilde işlenebilmesi için oluşturduğunuz iki yapılandırma parçasını kullanarak Nginx sunucu bloklarınızı yapılandıracaksınız.
Nginx'i yapılandırmanın bu yöntemi, sunucu bloklarını temiz tutmanıza ve ortak yapılandırma bölümlerini yeniden kullanılabilir modüllere koymanıza olanak tanır.
SSL anahtarına ve sertifikasına işaret eden bir yapılandırma parçası oluşturun
Öncelikle, favori metin düzenleyicinizi kullanarak /etc/nginx/snippets klasöründe yeni bir Nginx yapılandırma kodu oluşturun. Aşağıdaki örnekte nano kullanılmıştır.
Bu dosyanın amacını doğru bir şekilde belirlemek için dosyaya self-signed.conf adını verin:
sudo nano /etc/nginx/snippets/self-signed.confBu dosyada, sertifika dosyasına ssl_certificate yönergesini ve ilişkili anahtara ssl_certificate_key yönergesini ayarlamanız gerekir. Aşağıdaki gibi görünecektir:
ssl_certificate /etc/ssl/certs/nginx-selfsigned.crt;
ssl_certificate_key /etc/ssl/private/nginx-selfsigned.key;Bu satırları ekledikten sonra dosyayı kaydedin ve düzenleyiciden çıkın. Dosyayı düzenlemek için nano kullandıysanız, bunu CTRL + X, Y ve ardından ENTER tuşlarına basarak yapabilirsiniz.
Güçlü şifreleme ayarlarına sahip bir yapılandırma parçası oluşturun
Ardından, bazı SSL ayarlarını tanımlayan başka bir parça oluşturun. Bu, Nginx'i güçlü bir SSL şifreleme paketiyle donatır ve sunucunuzun güvenliğini sağlamaya yardımcı olan bazı gelişmiş özellikleri etkinleştirir.
Ayarladığınız parametreler gelecekteki Nginx yapılandırmalarında yeniden kullanılabilir, bu nedenle dosyaya genel bir ad verebilirsiniz:
sudo nano /etc/nginx/snippets/ssl-params.confNginx SSL'i güvenli bir şekilde kurmak için Cipherlist.eu'daki önerileri uyarlıyoruz. Cipherlist.eu, popüler yazılımlarda kullanılan şifreleme ayarlarını anlamak için yararlı ve anlaşılır bir kaynaktır.
Kendi amaçlarınız için verilen ayarları aynen kopyalayın, ancak önce birkaç küçük değişiklik yapmanız gerekecektir.
Öncelikle, yukarı akış istekleri için tercih ettiğiniz DNS çözümleyicisini ekleyin. Bu kılavuzda Google'ı (8.8.8.8 ve 8.8.4.4) kullanacağız.
İkinci olarak, Strict Transport Security başlığını belirten satırı yorum satırına ekleyin. Bu satırı yorum satırından çıkarmadan önce, HTTP Strict Transport Security veya HSTS ve özellikle "ön yükleme" işlevi hakkında bilgi edinmelisiniz. HSTS ön yüklemesi ek güvenlik sağlar, ancak yanlışlıkla veya hatalı şekilde etkinleştirildiğinde yaygın olumsuz sonuçlar doğurabilir.
Aşağıdakini ssl-params.conf parça dosyanıza ekleyin:
ssl_protocols TLSv1.3;
ssl_prefer_server_ciphers on;
ssl_dhparam /etc/nginx/dhparam.pem;
ssl_ciphers EECDH+AESGCM:EDH+AESGCM;
ssl_ecdh_curve secp384r1;
ssl_session_timeout 10m;
ssl_session_cache shared:SSL:10m;
ssl_session_tickets off;
ssl_stapling on;
ssl_stapling_verify on;
resolver 8.8.8.8 8.8.4.4 valid=300s;
resolver_timeout 5s;
# Disable strict transport security for now. You can uncomment the following
# line if you understand the implications.
#add_header Strict-Transport-Security "max-age=63072000; includeSubDomains; preload";
add_header X-Frame-Options DENY;
add_header X-Content-Type-Options nosniff;
add_header X-XSS-Protection "1; mode=block";Kendinden imzalı bir sertifika kullandığınız için SSL zımbalama kullanılmayacaktır. Nginx bir uyarı verecek ve imzalı sertifikamız için zımbalamayı devre dışı bırakacaktır, ancak daha sonra düzgün çalışmaya devam edecektir.
İşiniz bittiğinde CTRL + X ve ardından Y ve ENTER tuşlarına basarak dosyayı kaydedip kapatın.
Nginx'i SSL kullanacak şekilde yapılandırma
Artık parçalarınız hazır olduğuna göre, SSL'i etkinleştirmek için Nginx yapılandırmasını ayarlayabilirsiniz.
Bu kılavuz, /etc/nginx/sites-available dizininde özel bir sunucu bloğu yapılandırma dosyası kullandığınızı varsayar. Bu kılavuz ayrıca Nginx ön koşul eğitiminin kurallarını izler ve bu örnek için /etc/nginx/sites-available/your_domain dizinini kullanır. Gerekirse yapılandırma dosyanızın adını değiştirin.
İlerlemeden önce mevcut yapılandırma dosyanızı yedekleyin:
sudo cp /etc/nginx/sites-available/your_domain /etc/nginx/sites-available/your_domain.bakŞimdi ayarları yapmak için yapılandırma dosyasını açalım:
sudo nano /etc/nginx/sites-available/your_domainDahili olarak sunucu bloğunuz muhtemelen aşağıdakine benzer şekilde başlayacaktır:
server {
listen 80;
listen [::]:80;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain www.your_domain;
location / {
try_files $uri $uri/ =404;
}
}
Dosyanız farklı bir sırada olabilir ve kök ve dizin yönergeleri yerine konum, proxy_pass veya diğer özel yapılandırma yönergeleriniz olabilir. Bu sorun değil, çünkü yalnızca dinleme yönergelerini güncellemeniz ve SSL parçalarını eklemeniz yeterli. Ardından, mevcut sunucu bloğunu 443 numaralı portta SSL trafiği sunacak şekilde değiştirin ve 80 numaralı portta dinleyip trafiği otomatik olarak 443 numaralı porta yönlendirecek yeni bir sunucu bloğu oluşturun.
Mevcut yapılandırma dosyasında, iki listen ifadesini 443 portunu ve ssl'yi kullanacak şekilde güncelleyin, ardından önceki adımlarda oluşturduğunuz iki parça dosyasını ekleyin:
server {
listen 443 ssl;
listen [::]:443 ssl;
include snippets/self-signed.conf;
include snippets/ssl-params.conf;
root /var/www/your_domain/html;
index index.html index.htm index.nginx-debian.html;
server_name your_domain.com www.your_domain.com;
location / {
try_files $uri $uri/ =404;
}
}Daha sonra, ilk bloğun kapanış ayracı (}) sonrasında yapılandırma dosyasına ikinci bir sunucu bloğu ekleyin:
server {
listen 80;
listen [::]:80;
server_name your_domain.com www.your_domain.com;
return 302 https://$server_name$request_uri;
}Bu, 80 numaralı portu dinleyen ve HTTPS'ye yönlendiren basit bir yapılandırmadır. Düzenlemeyi bitirdiğinizde, CTRL + X, ardından Y ve ENTER tuşlarına basarak dosyayı kaydedip kapatın.
Adım 3 – Güvenlik Duvarını Yapılandırın
Ön koşul kılavuzunda önerildiği gibi UFW güvenlik duvarını etkinleştirdiyseniz, SSL trafiğine izin vermek için ayarları değiştirmeniz gerekecektir. Neyse ki Nginx, kurulum sırasında UFW ile birkaç profil kaydeder.
Kullanılabilir profillere şu şekilde göz atabilirsiniz:
sudo ufw app listAşağıdaki gibi bir liste karşınıza çıkacaktır:
Output
Available applications:
Nginx Full
Nginx HTTP
Nginx HTTPS
OpenSSHMevcut ayarları kontrol etmek için sudo ufw status komutunu yazabilirsiniz:
sudo ufw statusMuhtemelen aşağıdaki yanıtı üretecektir; bu da web sunucusuna yalnızca HTTP trafiğinin izin verildiği anlamına gelir:
Output
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx HTTP ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx HTTP (v6) ALLOW Anywhere (v6)HTTPS trafiğine izin vermek için "Nginx Full" profilinin izinlerini güncelleyebilir ve ardından ek "Nginx HTTP" iznini kaldırabilirsiniz:
sudo ufw allow 'Nginx Full'
sudo ufw delete allow 'Nginx HTTP'sudo ufw status komutunu çalıştırdıktan sonra aşağıdaki çıktıyı almalısınız:
sudo ufw statusOutput
Status: active
To Action From
-- ------ ----
OpenSSH ALLOW Anywhere
Nginx Full ALLOW Anywhere
OpenSSH (v6) ALLOW Anywhere (v6)
Nginx Full (v6) ALLOW Anywhere (v6)Bu çıktı, güvenlik duvarı yapılandırmanızın başarıyla tamamlandığını ve Nginx'teki değişiklikleri etkinleştirmeye hazır olduğunuzu onaylar.
Adım 4 – Nginx'teki değişiklikleri etkinleştirin
Güvenlik duvarı değişikliklerinizi ve yapılandırmalarınızı tamamladıktan sonra, yeni değişiklikleri uygulamak için Nginx'i yeniden başlatabilirsiniz.
Öncelikle dosyalarda herhangi bir sözdizimi hatası olmadığından emin olun. Bunu sudo nginx -t yazarak yapabilirsiniz:
sudo nginx -tEğer her şey yolunda giderse aşağıdaki gibi bir sonuç elde edeceksiniz:
Output
nginx: [warn] "ssl_stapling" ignored, issuer certificate not found for certificate "/etc/ssl/certs/nginx-selfsigned.crt"
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successfulBaşlangıçtaki uyarıya dikkat edin. Daha önce de belirtildiği gibi, imzalı sertifikanız SSL şifrelemesini kullanamadığı için bu ayar bir uyarı verecektir. Bu beklenen bir durumdur ve sunucunuz bağlantıları düzgün bir şekilde şifrelemeye devam edecektir.
Çıktınız örneğimizle eşleşiyorsa, yapılandırma dosyanızda herhangi bir sözdizimi hatası yoktur. Öyleyse, değişiklikleri uygulamak için Nginx'i güvenle yeniden başlatabilirsiniz:
sudo systemctl restart nginxSistem yeni değişikliklerle yeniden başlatıldığına göre artık test etmeye devam edebilirsiniz.
Adım 5 – Şifrelemeyi test etme
Artık SSL sunucunuzu test etmeye hazırsınız.
Web tarayıcınızı açın ve adres çubuğuna https:// yazın ve ardından sunucunuzun alan adını veya IP adresini yazın:
Tarayıcınıza bağlı olarak, oluşturulan sertifikanın tarayıcınızın güvenilir sertifika yetkililerinden biri tarafından imzalanmaması nedeniyle bir uyarı alabilirsiniz:
Bu uyarı beklenen ve normal bir durumdur. Sertifikamızın yalnızca şifreleme yönüyle ilgileniyoruz, sunucunuzun kimlik bilgilerinin üçüncü taraflarca doğrulanmasıyla değil. "Gelişmiş"e ve ardından sunucunuza gitmek için verilen bağlantıya tıklayın:
Bu noktada sitenize yönlendirileceksiniz. Örneğimizde, tarayıcı adres çubuğunda "x" işareti bulunan bir kilit simgesi göreceksiniz; bu, sertifikanın doğrulanamadığı anlamına gelir. Bağlantınız yine de şifrelenecektir. Bu simgenin tarayıcınıza bağlı olarak farklı görünebileceğini unutmayın.
Nginx'i iki sunucu bloğuyla yapılandırdıysanız ve HTTP içeriğini otomatik olarak HTTPS'ye yönlendiriyorsanız, yönlendirmenin düzgün çalışıp çalışmadığını da kontrol edebilirsiniz:
Eğer aynı ikonu görüyorsanız yönlendirmeniz doğru bir şekilde gerçekleşmiş demektir.
Adım 6 – Kalıcı bir yönlendirmeye geçin
Yönlendirmeniz düzgün çalıştıysa ve yalnızca şifrelenmiş trafiğe izin vermek istediğinizden eminseniz, yönlendirmeyi kalıcı hale getirmek için Nginx yapılandırmasını değiştirmeniz gerekecektir.
Sunucu blok yapılandırma dosyanızı yeniden açın:
sudo nano /etc/nginx/sites-available/your_domain302 yönlendirmesini bulun ve 301 yönlendirmesine değiştirin:
return 301 https://$server_name$request_uri;
CTRL + X, Y ve ENTER tuşlarına basarak dosyayı kaydedip kapatın.
Sözdizimi hataları için ayarlarınızı kontrol edin:
sudo nginx -tHazır olduğunuzda, yönlendirmeyi kalıcı hale getirmek için Nginx'i yeniden başlatın:
sudo systemctl restart nginxYeniden başlatmanın ardından değişiklikler geçerli olacak ve yönlendirmeniz artık kalıcı olacak.
Sonuç
Nginx sunucunuzu istemci bağlantıları için güçlü şifreleme kullanacak şekilde yapılandırdınız. Bu, istekleri güvenli bir şekilde karşılamanıza ve dış tarafların trafiğinizi okumasını engellemenize olanak tanır. Alternatif olarak, ücretsiz TLS/SSL sertifikaları yükleyen ve web sunucularında şifreli HTTPS'yi etkinleştiren bir sertifika yetkilisi olan Let's Encrypt'tan edinebileceğiniz, kendi kendine imzalı bir SSL sertifikası kullanabilirsiniz.











