Ücretsiz Let's Encrypt SSL Serifikası Kurulumu

Son Güncelleme: 13 Şubat 2020

Let's Encrypt herkese açık olarak Mozilla öncülüğünde birçok şirketin destekleriyle geliştirilmiş bedava SSL/TLS sağlayıcısıdır. Firefox, Chrome, Safari gibi önde gelen tüm tarayıcılar tarafından desteklenen bu sertifikayı yüklemek ise gayet basittir. Bu makalede ise nginx yüklü Ubuntu sunucuda Let's Encrypt SSL sertifikasının kurulumunu Github üzerinden kaynak kodlarını inceleyebileceğiniz acme-tiny adlı ufak bir script aracılığı ile yapacağız.

acme-tiny ve Sunucu Ayarları

Öncelikli olarak, sertifikayı yükleyebilmeniz ve acme-tiny ile doğrulama yapabilmeniz için alan adınız üzerinden .well-known/acme-challenge/ adresini sunabilmeniz gerekmektedir. Bu sebeple alttaki komutlar ile sunucu ayarlarınızı gerçeklemeniz lazımdır.

$ mkdir -p /var/www/challenges/ /etc/nginx/includes
$ nano /etc/nginx/includes/acme.conf

Let's Encrypt doğrulaması için gerekli olan bloğu alttaki gibi düzenleyin.

location /.well-known/acme-challenge/ {
  alias /var/www/challenges/;
  try_files $uri $uri/ = 404;
}

Son olarak, kullanacağınız her bir URL'e acme konfigürasyonunu ekleyin. Eğer www uzantısı için de SSL kayıt edecekseniz, www için de aynı bloğu eklemeyi unutmayın.

$ nano /etc/nginx/sites-available/alanadiniz.com

Alttaki bloğu ekleyin ve şimdilik bu dosyayı bu şekilde kaydedin.

server {
listen 80;
server_name alanadiniz.com; include /etc/nginx/includes/acme.conf;
}

Sonrasında, öncelikli olarak üstteki ayarların geçerli olabilmesi için nginx ayarlarını tekrar yükledin ve ardından sertifika dosyalarını sunacağınız klasörleri oluşturup acme-tiny scriptini indirin.

$ service nginx reload
$ mkdir -p /etc/ssl/letsencrypt/alanadiniz.com
$ cd /etc/ssl/letsencrypt
$ wget https://raw.githubusercontent.com/diafygi/acme-tiny/master/acme_tiny.py

SSL Sertifikası Oluşturma

Let's Encrypt aracılığı ile SSL sertifikasını oluşturmak için, sırasıyla, hesabınız için private key, alan adınız için CSR (Certificate Signing Request) oluşturup, acme-tiny ile imzalanmış sertifikanızı oluşturup, son olarak da nginx için domainininize özel olan sertifika ile Lets Encrypt'in sağladığı sertifikayı birleştirmeniz gerekmektedir.

$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:4096 -out /etc/ssl/letsencrypt/account.key
$ openssl genpkey -algorithm rsa -pkeyopt rsa_keygen_bits:2048 -out /etc/ssl/letsencrypt/domain.key

Eğer alan adınızı www.alanadiniz.com, hem de alanadiniz.com olarak kaydetmek istiyorsanız (yönlendirme yapacaksanız gerekli) alttaki gibi belirtmeniz lazım.

openssl req -new -sha256 -key domain.key -subj "/" -reqexts SAN -config <(cat /etc/ssl/openssl.cnf <(printf "[SAN]\nsubjectAltName=DNS:alanadiniz.com,DNS:www.alanadiniz.com")) > alanadiniz.com/domain.csr

Devamında da alttaki komutları çalıştırmanız lazım.

$ python acme_tiny.py --account-key /etc/ssl/letsencrypt/account.key --csr /etc/ssl/letsencrypt/alanadiniz.com/domain.csr --acme-dir /var/www/challenges > /etc/ssl/letsencrypt/alanadiniz.com/signed.crt
$ wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > /etc/ssl/letsencrypt/chain.pem
$ cat /etc/ssl/letsencrypt/alanadiniz.com/signed.crt /etc/ssl/letsencrypt/chain.pem > fullchain.pem

An itibarıyla sertifikanız hazır, bunu nginx'e tanıtması kaldı.

nginx SSL Blokları

Yeni oluşturduğunuz SSL sertifikasını kullanabilmek için, bu sertifikayı nginx SSL bloğunda belirtmeniz gerekir.

$ nano /etc/nginx/includes/ssl.conf

SSL konfigürasyonunu alttaki gibi yapabilirsiniz.

ssl_certificate /etc/ssl/letsencrypt/fullchain.pem;
ssl_certificate_key /etc/ssl/letsencrypt/domain.key;
ssl_protocols TLSv1 TLSv1.1 TLSv1.2;
ssl_session_cache shared:SSL:10m;
ssl_session_timeout 20m;
ssl_prefer_server_ciphers on;
ssl_ciphers 'EECDH+AESGCM:EDH+AESGCM:AES256+EECDH:AES256+EDH';
ssl_stapling on;
ssl_stapling_verify on;
ssl_trusted_certificate /etc/ssl/letsencrypt/fullchain.pem;
add_header Strict-Transport-Security max-age=31536000;

Ardından bu SSL konfigürasyon dosyasını SSL kullanacak her bir alan adı için eklemelisiniz.

$ nano /etc/nginx/sites-available/alanadiniz.com

Alttaki örnek konfigürasyon, az çok yapmanız gerekenleri özetliyor.

server {
    listen      80;
    server_name alanadiniz.com;
    include     /etc/nginx/includes/acme.conf;
    location / {
        return 301 https://alanadiniz.com$request_uri;
    }
}

server {
    listen      443;
    server_name alanadiniz.com;
    include     /etc/nginx/includes/ssl.conf;
}

Son olarak üstteki yapılandırmayı kaydedip, Nginx'i yeniden başlatmanız lazım.

$ service nginx restart

An itibariyle SSL'in kurulmuş olması lazım. Eğer adımları eksiksiz takip ettiyseniz, bir problem olma olasılığı düşük, emin olmak için de bu site üzerinde, alan adınızı yazarak kontrol edebilirsiniz. Örnek olarak da bu sitenin sonuçlarını inceleyebilirsiniz.

Opsiyonel: Ekstra SSL Güvenliği

Eğer güvenliğe önem veriyor ve herhangi bir SSL testinden A+ notunu ya da puanını almak istiyorsanız birkaç ayar yapmanız lazım. Bunların yanında eğer Internet Explorer 6 ve Windows XP'yi de desteklemek istiyorsanız, ssl_ciphers'i alttaki gibi değiştirmeniz lazım. Daha detaylı bilgi için mozilla'nın hazırladığı linki inceleyebilirsiniz. Ancak en azından aklınızda bulunması için belirtmek isterim ki AES dışındaki tüm cipherler, örneğin DES, 3DES, RC4 veya MD5 yeteri kadar güvenli bulunmuyor.

ssl_ciphers "EECDH+AESGCM:EDH+AESGCM:ECDHE-RSA-AES128-GCM-SHA256:AES256+EECDH:DHE-RSA-AES128-GCM-SHA256:AES256+EDH:ECDHE-RSA-AES256-GCM-SHA384:DHE-RSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-RSA-AES128-SHA256:ECDHE-RSA-AES256-SHA:ECDHE-RSA-AES128-SHA:DHE-RSA-AES256-SHA256:DHE-RSA-AES128-SHA256:DHE-RSA-AES256-SHA:DHE-RSA-AES128-SHA:ECDHE-RSA-DES-CBC3-SHA:EDH-RSA-DES-CBC3-SHA:AES256-GCM-SHA384:AES128-GCM-SHA256:AES256-SHA256:AES128-SHA256:AES256-SHA:AES128-SHA:DES-CBC3-SHA:HIGH:!aNULL:!eNULL:!EXPORT:!DES:!MD5:!PSK:!RC4";

Güvenlik seviyesini arttırmak için, öncelikli olarak Diffie Hellman yapılandırmasını güçlendirmemiz lazım. Bunun için alttaki komutu çalıştırın, muhtemelen 10 dakikadan fazla sürecektir, o yüzden sabretmeniz önemli.

$ openssl dhparam -out /etc/ssl/private/dhparams_4096.pem 4096

Daha sonrasında da SSL bloğuna/bloklarınıza alttaki satırı eklemeniz lazım.

ssl_dhparam /etc/ssl/private/dhparams_4096.pem;

Opsiyonel: Otomatik SSL Yenileme

Let's Encrypt ile oluşturulan SSL sertifikalarını otomatik olarak yenilemek isteyebilirsiniz. Bunun sebebi de sertifikaların ömrünün sadece 90 gün olması. Bunun için Let's encrypt'i yüklediğimiz dizine dönüp, orada renew.sh adında bir shell script dosyası oluşturalım.

$ cd /etc/ssl/letsencrypt && nano renew.sh

Dosyayı da alttaki gibi düzenleyin, dizin(sunucunun çalıştığı root dizin) ve alanadiniz.com kısımlarını düzenlemeyi unutmayın.

python /etc/ssl/letsencrypt/acme_tiny.py --account-key /etc/ssl/letsencrypt/account.key --csr /etc/ssl/letsencrypt/alanadiniz.com/domain.csr --acme-dir /var/www/challenges/ > /tmp/signed.crt || exit
wget -O - https://letsencrypt.org/certs/lets-encrypt-x3-cross-signed.pem > /etc/ssl/letsencrypt/chain.pem
cat /tmp/signed.crt /etc/ssl/letsencrypt/chain.pem > /etc/ssl/letsencrypt/fullchain.pem
service nginx reload

Ayrıca dosyayı çalıştırılabilir(executable) hale getirin.

$ chmod +x renew.sh

Son olarak da bunu crontab'a eklemesi kaldı. Onun için de,

$ crontab -e

Gelen ekranda da alttaki gibi ekleyebilirsiniz. Alttaki ayara göre, her ayın 5'inde, saat 00:01'de let's encrypt sertifikanız güncellenecek ve logları da /var/log/letsencrypt-renewal.log olarak kaydedilecek.

1 0 5 * * /bin/sh /etc/ssl/letsencrypt/renew.sh >> /var/log/letsencrypt-renewal.log

Eğer tüm adımları takip ettiyseniz A+ nota sahip, her ay kendisini otomatik olarak yenileyen SSL kurulumunu tamamlamış oldunuz.

Burak Özdemir

Burak Özdemir

Fethiye'de doğdum, Çanakkale Fen Lisesi ve İTÜ Bilgisayar Mühendisliği mezunuyum. Web geliştirme ile uğraşıyorum.