Cloudflare ve Nginx ile SSL Aktifleştirme

Caner Canbaz
4 min readMay 19, 2020

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.

Cloudflare portala eklenmiş bir domain ve Express.js çalışan bir sunucu

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.

Origin Certificate Installation sayfası

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.

nano ile sertifika dosyasının oluşturulması

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";
}
}
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;
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.

HTTPS ile adresimize ulaştık

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.

HTTP ile adresimize ulaştık

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.

--

--