Merhaba arkadaşlar, bu yazımda Express.js çalışan bir sunucuda Nginx kullanarak SSL (HTTPS) aktifleştirmesini anlatmaya çalışacağım.
Gereksinimler
- Nginx
- Express.js server
- Cloudflare portala eklenmiş domain
Benim hali hazırda kurulu bir sunucum var.
SSL Sertifikası Oluşturma
Öncelikle portala giriyoruz ve SSL/TLS menüsüne gidiyoruz.
Daha sonra SSL/TLS şifreleme modunu seçiyoruz.
Off: SSL kapalıdır.
Flexible: Kullanıcı ve Cloudflare arasında SSL kullanılır. Cloudflare ve sunucu arasında herhangi bir SSL bağlantısı yoktur.
Full: Kullanıcı — Cloudflare arasında ve Cloudflare — sunucu arasında SSL sertifikası olması gerekir. Ancak SSL sertifikası doğrulaması göz ardı edilir. Self signed sertifikalar kullanılabilir.
Full (Strict): Kullanıcı — Cloudflare arasında ve Cloudflare — sunucu arasında geçerli bir SSL sertifikası olması gerekir. Harici olarak satın aldığınız ya da Cloudflare tarafından doğrulanmış bir sertifika kullanabilirsiniz.
Eğer geçerli bir SSL sertifikanız var ise, Full (Strict) modunu seçmelisiniz. Bu yazıda anlatılanlar Cloudflare üzerinden oluşturulan sertifika için geçerlidir.
Daha sonra Origin Server sekmesine tıklıyoruz.
Açılan sayfada **Origin Certificates **kısmından **Create Certificate **butonuna tıklayıp yeni bir sertifika oluşturmak için adımları başlatıyoruz.
Butona basınca açılan modal sayfasında bir değişiklik yapmanıza gerek yok, **Next **butonuna tıklıyoruz.
Next butonuna tıklayınca 1 sertifika ve 1 şifre dosyası oluşturulacak. Bu oluşturulan bu dosyaları (Origin Certificate ve Private Key) .pem uzantılı olarak kaydetmelisiniz. Bu dosyaları nginx üzerinde tanımlayıp SSL için kullanacağız.
SSL Sertifikasını Sunucuya Yükleme
SSH ile sunucumuza bağlanıyoruz ve nginx klasörünün içerisinde sertifika ve key dosyamızı saklayacağımız ssl klasörünü oluşturuyoruz.
root@ubuntu:~# mkdir /etc/nginx/ssl
Sertifika ve key dosyamızı oluşturmak için ssl klasörünün içerisine giriyoruz.
root@ubuntu:~# cd /etc/nginx/ssl/
root@ubuntu:/etc/nginx/ssl#
nano ile sertifika dosyasını oluşturmak için ssl klasörünün içinde **nano cert.pem **komutunu çalıştırıyoruz ve kopyaladığımız sertifika içeriğini yapıştırıp kaydediyoruz. nano editöründen **CTRL + X **bastıktan sonra Y tuşuna basarak kaydedip çıkabilirsiniz.
Aynı işlemi key dosyası için de yapıyoruz. Bu sefer nano **key.pem **komutunu çalıştırıyoruz ve yine private key kısmında kopyaladığımız içeriği yapıştırıp kaydediyoruz.
Sonuç olarak ssl klasörümüzde 2 dosya olmalı, birisi cert.pem diğer ise key.pem. ls komutu ile klasör içeriğini görebilirsiniz.
root@ubuntu:/etc/nginx/ssl# ls
cert.pem key.pem
SSL Sertifikasını Nginx’e Tanıtma
Nginx ayarlarını yapabilmek için nginx klasörü içerisinde bulunan **sites-available **klasörüne gidip default dosyasını düzenleyebiliriz.
root@ubuntu:~# cd /etc/nginx/sites-available/
root@ubuntu:/etc/nginx/sites-available# ls
default
**nano default **komutu ile bu dosyayı düzenleyip içeriğini aşağıdaki gibi yapıyoruz.
# Default server configuration
#
server {
listen 80;
server_name _;
location / {
proxy_set_header X-Forwarded-For $remote_addr;
proxy_set_header Host $http_host;
proxy_pass "[http://localhost:3000](http://localhost:3000)";
}
}
server {
listen 443 ssl http2;
server_name _;
ssl on;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
location / {
proxy_pass [http://localhost:3000](http://localhost:3000);
proxy_set_header Upgrade $http_upgrade;
proxy_set_header Connection 'upgrade';
proxy_set_header Host $host;
proxy_set_header X-Real-IP $remote_addr;
proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;
}
}
Burada 2 adet server direktifimiz var. Birisi 80 (HTTP) portunu dinliyor ve gelen istekleri 3000 portunda çalışan Express.js sunucumuza yönlendiriyor.
Diğer server direktifi ise 443 (HTTPS) portunu dinliyor ve gelen istekleri 3000 portunda çalışan Express.js sunucumuza yönlendiriyor. Üsttekinden ayrı olarak da aşağıdaki satırları ekleyerek SSL sertifikasını aktifleştirmiş olduk.
ssl on;
ssl_certificate /etc/nginx/ssl/cert.pem;
ssl_certificate_key /etc/nginx/ssl/key.pem;
Tabii burada şöyle bir senaryo da izlenebilir. Express.js sunucusunu 2 port üzerinden çalıştırabilirsiniz, örnek olarak bir 3000 bir de 443. 3000 olana HTTP üzerinden gelenleri, 443 olana da yine HTTPS olanları yönlendirebilirsiniz. Ben burada tek porta yönlendirdim.
Nginx konfigürasyonunu test etmek, **default **dosyasına yazdığımız komutların doğruluğunu kontrol etmek için aşağıdaki komutu kullanabiliriz.
root@ubuntu:~# nginx -t
nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful
Eğer karşılık olarak yukarıdaki gibi **successful **mesajını aldıysanız, her şey yolunda gidiyor demektir. nginx servisini reload yapalım ve yaptığımız ayarların aktif olmasını sağlayalım.
root@ubuntu:~# nginx -s reload
Komutu çalıştırdıktan sonra, SSL sertifikasının doğru tanımlanıp tanımlanmadığını kontrol edelim.
Evet, sertifikamız doğru yüklenmiş ve bağlantımız güvenli olarak işaretlenmiş gözüküyor. Fakat şöyle bir durum var, adrese hala HTTP ile güvenli olmayan protokol ile ulaşabiliyoruz.
Peki biz sitemize sadece HTTPS üzerinden ulaşılmasını istiyorsanız ne yapmalıyız? Menüden **Edge Certificates **sayfasına girelim.
**Always Use HTTPS **ayarını aktifleştirelim, bu ayarı yaptıktan sonra artık HTTP ile gitseniz dahi otomatik olarak HTTPS’e yönlendirileceksiniz.
Umarım faydalı olmuştur, yanlış veya eksik anlattığım bir yer varsa lütfen yorum yazarak katkıda bulunun. Herkese sağlıklı günler dilerim.