NGINX SSL Sertifikası Kurulumu | 301 Yönlendirme ve Ayarlar

8 dakika
Paylaş:

Bu rehberde Nginx SSL sertifikası nasıl kurulur resimli olarak anlatımını bulabilir, sorun yaşadığınız herhangi bir noktada iletişime geçebilir veya yorum alanından destek alabilirsiniz. Bu kurulum örneğinde PHP 7 ve Nginx web server kullandığımız CentOS 7 sunucumuza ücretsiz Comodo SSL kuracağız. Birçok sertifikanın kurulumu benzer şekilde yapılmaktadır.

Bilindiği üzere, SSL sertifikası web siteniz ve ziyaretçiler arasındaki iletişimi şifrelemeye yarar ve yüksek düzeyde güvenlik sağlar. Kısa bir süredir, etkisi az olsa dahi Google SSL sertifikasını olumlu bir SEO sinyali olarak algılıyor ve sıralamaya etki ettiğini kabul ediyor. Özellikle, e-Ticaret siteleri için SSL sertifikası neredeyse zorunlu hale geldi. Sertifika sahibi olmayan e-ticaret siteleri bankalardan ve ödemelere aracılık yapan firmalardan sanal pos alamayabilir.

Sorunsuz bir Nginx SSL Sertifikası kurulumu için rehber arıyorsanız, doğru yerdesiniz.

Bölümler

a) SSL bundle oluşturma

b) 301 https yönlendirme

Nginx SSL Kurulumu


Nginx SSL Sertifikası Kurulum Rehberi

Bu rehberde kullandığımız unsurlar:

  • SSH erişimi
  • Ücretli veya ücretsiz SSL sertifikası
  • Bilgisayarımıza WinSCP ve Notepad++ (Opsiyonel)
  • Admin veya webmaster@alanadi.com şeklinde mail (Opsiyonel)

Adım 1 – Private Key, CSR Oluşturma

Web sitemiz bir sertifika oluşturmadan önce ilk yapmamız gereken şey bir key vs CSR oluşturmaktır. Öncelikle, kullanacağımız SSL sertifika dosyaları elimizin altında olsun diye html klasörünün yanına bir ssl klasörü oluşturalım. Örneğimizde html klasörü /var/www dizininde kurulu.

Sertifika için klasör oluşturma:

mkdir /var/www/ssl

Cd komutuyla klasöre gidelim.

cd /var/www/ssl

Private Key ve CSR oluşturma kodu.

openssl req -new -newkey rsa:2048 -nodes -keyout alanadiniz_com.key -out alanadiniz_com.csr

Diğer örneklerde olduğu gibi, bu örnekte de herhangi.net domainimizi kullanıyoruz. Karşımıza gelecek satırları kendi bilgilerimize uygun olarak aşağıdaki gibi dolduralım. Türkçe karakter kullanmamaya dikkat etmenizi öneririm.

openssl req -new -newkey rsa:2048 -nodes -keyout herhangi_net.key -out herhangi_net.csr

Nginx SSL CRS oluşturma

[root@server ssl]# openssl req -new -newkey rsa:2048 -nodes -keyout herhangi_net.key -out herhangi_net.csr

Generating a 2048 bit RSA private key ……………………………………….+++. …………………………………………………………………………………………+++ writing new private key to ‘herhangi_net.key’

—–

You are about to be asked to enter information that will be incorporated

into your certificate request.

What you are about to enter is what is called a Distinguished Name or a DN.

There are quite a few fields but you can leave some blank

For some fields there will be a default value,

If you enter ‘.’, the field will be left blank.

—–

  • Country Name (2 letter code) [XX]:TR #Ülke kodu iki hane olarak yazılmalı. Türkiye icin TR
  • State or Province Name (full name) []:Istanbul #Şehir bilgisi
  • Locality Name (eg, city) [Default City]:Atasehir #İlçe bilgisi
  • Organization Name (eg, company) [Default Company Ltd]:Herhangi NET #Site adı veya organizasyon ismi
  • Organizational Unit Name (eg, section) []:IT #İlgili birim ismi. IT, bilgi teknolojisi anlamına geliyor. Siz dilediğinizi yazabilirsiniz.
  • Common Name (eg, your name or your server’s hostname) []:herhangi.net #Alan adınız
  • Email Address []:admin@herhangi.net #Yönetici e-posta adresiniz

Please enter the following ‘extra’ attributes to be sent with your certificate request

  • A challenge password []: #Bir şey yazmadan Enter tuşuna basın
  • An optional company name []: #Bir şey yazmadan Enter tuşuna basın

Herhangi bir sorun yoksa Private Key ve CSR dosyamız hazır. ls komutu ile dosyalarımızı kontrol edebiliriz.


Adım 2 – Ücretsiz SSL Sertifikası Alma

Şimdi CSR dosyamızdaki kodları kopyalayıp SSL sertifikası satın aldığımız siteye giderek Paste your CSR yazan alana yapıştırıyoruz. Siz de ücretsiz SSL kullanarak başlamak istiyorsanız ziyaret etmeniz gereken site: https://gogetssl.com/

SSL sertifikası oluşturma

Kodu yapıştırdıktan sonra Validate CSR butonuyla ilerliyoruz ve doğrulama türünü seçiyoruz. Örneğimizde doğrulama işlemini e-posta adresi ile yapıyoruz.

Dilerseniz DNS kaydı ekleyerek ve doğrulama için sunucunuza dosya yükleyerek yapabilirsiniz. Bu doğrulama türünde “.well-known” gibi bir dizine ilgili dosyaları yüklememiz gerekiyor, bunun için Nginx konfigürasyonunda biraz değişiklik yapmanız gerekiyor. İhtiyaç duyarsanız birlikte çözebiliriz.

SSL doğrulama

Next Step dedikten sonra bilgilerimizi girelim ve Complete Generation butonuna basarak devam edelim.

Buradan sonraki iş admin e-postamıza gelen doğrulama kodunu verilen linke giderek yapıştırma. Aşağıdaki iki resimde olduğu gibi.

 

“Thank you”

You have entered the correct Domain Control Validation code. Your certificate will now be issued and emailed to you shortly. Please close this window now.”

Bu mesajı gördüyseniz kapatabilirsiniz. Ortalama 5 dakika içerisinde SSL sertifikası dosyalarınız hazır olacaktır, bizim örneğimizde yaklaşık 30 saniye sürdü.

Sertifika dosyaları geldiyse bilgisayarımıza indirelim, zipten çıkarıp sunucumuzun /var/www/ssl klasörüne yükleyelim. Yükleme için WinSCP kullanıyorum.

Mail yoluyla gelenleri yükledikten sonra sunucumun SSL klasöründe toplam 4 dosya oldu.

  • herhangi_net.csr
  • herhangi_net.key
  • herhangi_net.crt
  • herhangi_net.ca-bundle

Adım 3 – Nginx SSL Kurulumu

Bu aşamada bir öncekinden daha dikkatli olmalısınız zira en çok problem yaşanan adım burasıdır.


3 (a) – SSL Bundle Oluşturma

Öncelikle SSL sertifikası ve CA dosyalarımızı aşağıdaki komut ile kombine ediyoruz. Birden fazla siteniz varsa sonraki ssl-bundle yerine başka bir şey yazabilirsiniz. Türkçe karakter içermediği sürece sorun yok.

cat <span style="color: #ff0000;">alanadi_com</span>.crt <span style="color: #ff0000;">alanadi_com</span>.ca-bundle &gt; ssl-bundle.crt

SSL Bundle dosyası bulunmayan arkadaşlar bu şekilde yapabilir.

cat alanadi_com.crt COMODO_RSA_Certification_Authority.crt AddTrust_External_CA_Root.crt > alanadi-ssl-bundle.crt

Bizim örneğimizde şu şekilde:

cat herhangi_net.crt herhangi_net.ca-bundle > ssl-bundle.crt

ls komutu ile kontrol edebilirsiniz.


3 (b) – Nginx 301 Https – SSL Yönlendirme

Bu aşamada site konfigürasyonumuzda yönlendirme yapıyor ve sertifika dosyalarımızın bulunduğu dizini belirtiyoruz.

WordPress performans sunucusu kurulum rehberi ile oluşturduğumuz Nginx sanal host dosyamızın bulunduğu dizine gidiyoruz. Dilerseniz nano komutuyla dosyayı açabilirsiniz. Biz WinSCP ile ilişkilendirdiğimiz Notepad++ ile düzenleme yapıyoruz.

nano /etc/nginx/conf.d/default.conf

Örnek sitemizin konfigürasyonu aşağıdaki gibi:

server {
listen 80 default_server;

listen [::]:80 default ipv6only=on;

server_name herhangi.net;

return 301 https://herhangi.net$request_uri;

}

 

server {

listen 443 ssl http2;

listen [::]:443 ssl http2;

server_name herhangi.net;

 

ssl_certificate      /var/www/ssl/ssl-bundle.crt;

ssl_certificate_key  /var/www/ssl/herhangi_net.key;

 

root  /var/www/html;

index index.php index.html index.htm;

location / {

try_files $uri $uri/ /index.php?$args;

}

location ~* /\. {

deny all;

}

location ~ [^/]\.php(/|$) {

fastcgi_split_path_info ^(.+?\.php)(/.*)$;

if (!-f $document_root$fastcgi_script_name) {

return 404;

}

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

set $do_not_cache 0;

if ($request_method = POST) {

set $do_not_cache 1;

}

if ($query_string != "") {

set $do_not_cache 1;

}

if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {

set $do_not_cache 1;

}

if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {

set $do_not_cache 1;

}

fastcgi_cache        wpcache;

fastcgi_cache_key    "$request_method:$scheme://$host$request_uri";

fastcgi_cache_valid  200 60m;

fastcgi_no_cache     $do_not_cache;

fastcgi_cache_bypass $do_not_cache;

add_header X-F-Cache $upstream_cache_status;

}

}

Son kontrolleri yaptıktan sonra Nginx’i yeniden başlatalım.

service nginx restart

Herhangi bir noktada hata yoksa Nginx SSL kurulumu tamamlanmıştır. Tüm aşamaları test ederek gitmekte fayda var.


SSL Testi Yapma

SSL testi için bu siteleri kullanabilirsiniz.

https://www.ssllabs.com/ssltest/

https://www.sslshopper.com/ssl-checker.html

sslshopper ssl testi

sslshopper

 

ssllabs SSL Testi

ssllabs


Bonus

Gelişmiş güvenlik (ve performans) için en iyi nginx yapılandırması isteyenler aşağıdaki kodları kendine göre düzenleyip kullanabilir. Değişiklik yapmanız gereken yerler kırmızı ile işaretlenmiştir. Dosyayı txt olarak indirmek için tıklayınız.

# en iyi nginx ssl yonlendirme konfigurasyonu siteadi.org
# don't send the nginx version number in error pages and Server header

server_tokens off;

# config to don't allow the browser to render the page inside an frame or iframe

# and avoid clickjacking http://en.wikipedia.org/wiki/Clickjacking

# if you need to allow [i]frames, you can use SAMEORIGIN or even set an uri with ALLOW-FROM uri

# https://developer.mozilla.org/en-US/docs/HTTP/X-Frame-Options

add_header X-Frame-Options SAMEORIGIN;

# when serving user-supplied content, include a X-Content-Type-Options: nosniff header along with the Content-Type: header,

# to disable content-type sniffing on some browsers.

# https://www.owasp.org/index.php/List_of_useful_HTTP_headers

# currently suppoorted in IE &gt; 8 http://blogs.msdn.com/b/ie/archive/2008/09/02/ie8-security-part-vi-beta-2-update.aspx

# http://msdn.microsoft.com/en-us/library/ie/gg622941(v=vs.85).aspx

# 'soon' on Firefox https://bugzilla.mozilla.org/show_bug.cgi?id=471020

add_header X-Content-Type-Options nosniff;

# This header enables the Cross-site scripting (XSS) filter built into most recent web browsers.

# It's usually enabled by default anyway, so the role of this header is to re-enable the filter for

# this particular website if it was disabled by the user.

# https://www.owasp.org/index.php/List_of_useful_HTTP_headers

add_header X-XSS-Protection "1; mode=block";

# with Content Security Policy (CSP) enabled(and a browser that supports it(http://caniuse.com/#feat=contentsecuritypolicy),

# you can tell the browser that it can only download content from the domains you explicitly allow

# http://www.html5rocks.com/en/tutorials/security/content-security-policy/

# https://www.owasp.org/index.php/Content_Security_Policy

# I need to change our application code so we can increase security by disabling 'unsafe-inline' 'unsafe-eval'

# directives for css and js(if you have inline css or js, you will need to keep it too).

# more: http://www.html5rocks.com/en/tutorials/security/content-security-policy/#inline-code-considered-harmful

add_header Content-Security-Policy "default-src 'self'; script-src 'self' 'unsafe-inline' 'unsafe-eval' https://ssl.google-analytics.com https://assets.zendesk.com https://connect.facebook.net; img-src 'self' https://ssl.google-analytics.com https://s-static.ak.facebook.com https://assets.zendesk.com; style-src 'self' 'unsafe-inline' https://fonts.googleapis.com https://assets.zendesk.com; font-src 'self' https://themes.googleusercontent.com; frame-src https://assets.zendesk.com https://www.facebook.com https://s-static.ak.facebook.com https://tautt.zendesk.com; object-src 'none'";

# redirect all http traffic to https

server {

listen 80 default_server;

listen [::]:80 default ipv6only=on;

server_name herhangi.net;

return 301 https://herhangi.net$request_uri;

}

server {

listen 443 ssl http2;

listen [::]:443 ssl http2;

server_name herhangi.net;

ssl_certificate      /var/www/ssl/ssl-bundle.crt;

ssl_certificate_key  /var/www/ssl/herhangi_net.key;

# enable session resumption to improve https performance

# http://vincent.bernat.im/en/blog/2011-ssl-session-reuse-rfc5077.html

ssl_session_cache shared:SSL:50m;

ssl_session_timeout 1d;

ssl_session_tickets off;

# enables server-side protection from BEAST attacks

# http://blog.ivanristic.com/2013/09/is-beast-still-a-threat.html

ssl_prefer_server_ciphers on;

# disable SSLv3(enabled by default since nginx 0.8.19) since it's less secure then TLS http://en.wikipedia.org/wiki/Secure_Sockets_Layer#SSL_3.0

ssl_protocols TLSv1 TLSv1.1 TLSv1.2;

# ciphers chosen for forward secrecy and compatibility

# http://blog.ivanristic.com/2013/08/configuring-apache-nginx-and-openssl-for-forward-secrecy.html

ssl_ciphers 'ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES128-GCM-SHA256:DHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256:ECDHE-ECDSA-AES128-SHA:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA:ECDHE-ECDSA-AES256-SHA384:ECDHE-ECDSA-AES256-SHA:ECDHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA256:DHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES256-SHA:ECDHE-ECDSA-DES-CBC3-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES128-GCM-SHA256:AES256-GCM-SHA384:AES128-SHA256:AES256-SHA256:AES128-SHA:AES256-SHA:DES-CBC3-SHA:!DSS';

# config to enable HSTS(HTTP Strict Transport Security) https://developer.mozilla.org/en-US/docs/Security/HTTP_Strict_Transport_Security

# to avoid ssl stripping https://en.wikipedia.org/wiki/SSL_stripping#SSL_stripping

# also https://hstspreload.org/

add_header Strict-Transport-Security "max-age=31536000; includeSubdomains; preload";

root  /var/www/html;

index index.php index.html index.htm;

location / {

try_files $uri $uri/ /index.php?$args;

}

location ~* /\. {

deny all;

}

location ~ [^/]\.php(/|$) {

fastcgi_split_path_info ^(.+?\.php)(/.*)$;

if (!-f $document_root$fastcgi_script_name) {

return 404;

}

fastcgi_pass 127.0.0.1:9000;

fastcgi_index index.php;

fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;

include fastcgi_params;

set $do_not_cache 0;

if ($request_method = POST) {

set $do_not_cache 1;

}

if ($query_string != "") {

set $do_not_cache 1;

}

if ($http_cookie ~* "comment_author|wordpress_[a-f0-9]+|wp-postpass|wordpress_no_cache|wordpress_logged_in") {

set $do_not_cache 1;

}

if ($request_uri ~* "(/wp-admin/|/xmlrpc.php|/wp-(app|cron|login|register|mail).php|wp-.*.php|/feed/|index.php|wp-comments-popup.php|wp-links-opml.php|wp-locations.php|sitemap(_index)?.xml|[a-z0-9_-]+-sitemap([0-9]+)?.xml)") {

set $do_not_cache 1;

}

fastcgi_cache        wpcache;

fastcgi_cache_key    "$request_method:$scheme://$host$request_uri";

fastcgi_cache_valid  200 60m;

fastcgi_no_cache     $do_not_cache;

fastcgi_cache_bypass $do_not_cache;

add_header X-F-Cache $upstream_cache_status;

}

}

Ayarların etkinleşmesi için Nginx’i yeniden başlatmanız gerekiyor. Ssllabs üzerinden yapacağınız yeni bir sorgulamada sonuçların daha farklı olacağını göreceksiniz.

Her zamanki gibi, takıldığınız noktada iletişim sayfası ve yorum alanını kullanarak destek alabilirsiniz.

Paylaş: