Merhaba dostlar,

Bugün SSL üzerine kafa yormaya devam edip normalde statik 2048 veya 4096 bit RSA ile kullandığımız SSL sertifikalarımızı Eliptik Eğri Kriptolaması ile nasıl güçlendireceğimizi anlatacağım.

Peki ECDSA ile RSA'nın temel olarak ne farkı var?

Ortak anahtarın eliptik eğri kriptolojisi kullandığı Eliptik Eğri (EC) Sertifikaları, havalı bir isminin yanı sıra Mozilla Observatory tarafından "Modern Uyumluluk" için de gerekiyor.

Ek olarak RSA ile çok uzun anahtarlarla sağladığımız güvenliği EC ile çok daha kısa anahtarlarla sağlayabiliyoruz.

ECDSA yani (Elliptic Curve Digital Signature Algorithm), Let's Encrypt tarafından henüz son kullanıcı seviyesinde dağıtılmıyor ama kendi oluşturacağımız bir CSR (Certificate Signing Request) ile bunu kullanabiliyoruz.

Yani bunun anlamı da bu sefer biz Let's Encrypt'ten hazır sertifika istemeyeceğiz. Sertifikamızı kendimiz oluşturup "Dayı, sen bizim şu oğlanın nikahını bi kıy." diyeceğiz. :)

Bugün ECDSA anahtarını geriye dönük uyumluluğu da yüksek olan P-384 (secp384r1) eğrisini kullanarak oluşturacağız.

Sunucumuzu hali hazırda HTTPS ile yayın yaptığını ve OpenSSL ve NGINX ile çalıştığını varsayarak devam ediyorum. DigitalOcean kullananlar için LEMP kurulumu önerebilirim. Kendi kurmak isteyenler için de şuraya kurulum bağlantısını bırakıyorum.

Bu kadar goygoydan sonra çok uzatmadan başlayalım. :)


1) Özel Anahtar Oluşturma

Sunucumuzda kurulu olan OpenSSL programı ile özel anahtarımızı oluşturuyoruz.

openssl ecparam -genkey -name secp384r1 -out privkey.pem

Şimdi de OpenSSH için bir konfigürasyon dosyası oluşturalım. openssl.conf diye bir dosya oluşturup içine alttaki parametreleri ekliyorum.

[ req ]
prompt = no
encrypt_key = no
default_md = sha512
distinguished_name = dname
req_extensions = reqext

[ dname ]
CN = teneke.com
emailAddress = temelreis@teneke.com

[ reqext ]
subjectAltName = DNS:teneke.com, DNS:*.teneke.com

2) CSR Oluşturma

Şimdi de sertifika isteğimiz için CSR dosyamızı oluşturalım.

openssl req -new -config openssl.cnf -key privkey.pem -out csr.pem

3) Let's Encrypt'den Rica Aşaması

Dayıcım bi el at da şu sertifikayı imzalayıver aşamasına geldik. :)

  • Eğer tek veya birkaç alan adıyla sertifika oluşturacaksak aşağıdaki komut size yetecektir.
certbot certonly --dry-run --domain "teneke.com" --domain "blog.teneke.com --csr csr.pem
  • Yok eğer ben Wildcard istiyorum diyorsanız şuradaki konuya bir göz atıp orda sertifika oluşturduğumuz komuta kadar gelin. Sonra bu ikisinin birleştirilmiş hali olan aşağıdaki komutu kullanacağız.
./certbot-auto certonly --manual --preferred-challenges=dns --server https://acme-v02.api.letsencrypt.org/directory --agree-tos --domain “teneke.com” --domain “*.teneke.com” --csr ###CSR Dosyamızın Dizini###/csr.pem

Yine yukarda bağlantı verdiğim konudaki gibi devam ediyoruz ve sertifikamızı alıyoruz.


4) Sertifikaları Doğru Şekilde Kullanma

Bu aşamada elimizde imzalanmış sertifikalarımız olmuş oluyor. Artık oluşturduğumuz CSR dosyamızı silebiliriz. Bulunduğumuz dizinde 3 adet sertifika var şu an.

  1. İmzalanmış Sertifikamız: 0000_cert.pem
  2. Kök ve İmzacının Sertifikası: 0000_chain.pem
  3. İmzalanmış Sertifikamız ve İmzacının Sertifikası: 0001_chain.pem

Bunlardan iki tanesini sunucu konfigürasyonlarımızda kullanacağız. Ve unutmadan ilk başta oluşturduğumuz "privkey.pem" dosyasını unutmayın. :)

Dosyaları istediğimiz bir dizine atıyoruz. (Önerilen /etc/ssl/)

NGINX için konfigürasyonumuz şu şekilde olmalı.

...
ssl_certificate_key /etc/ssl/private/teneke.com/privkey.pem;
ssl_certificate /etc/ssl/certs/teneke.com/0001_chain.pem;
ssl_trusted_certificate /etc/ssl/certs/teneke.com/0000_chain.pem;
...

Sonrasında da ek güvenlik istersek eğer şu parametreleri ekleyebiliriz.

...
ssl_session_cache shared:SSL:50m;
ssl_session_tickets off;

# TLS 1.3
ssl_protocols TLSv1.2 TLSv1.3;

# Güçlü Şifreleme Teknikleri
ssl_ciphers 'ECDHE-ECDSA-AES256-GCM-SHA384:ECDHE-RSA-AES256-GCM-SHA384:ECDHE-ECDSA-CHACHA20-POLY1305:ECDHE-RSA-CHACHA20-POLY1305:ECDHE-ECDSA-AES128-GCM-SHA256:ECDHE-RSA-AES128-GCM-SHA256:ECDHE-ECDSA-AES256-SHA384:ECDHE-RSA-AES256-SHA384:ECDHE-ECDSA-AES128-SHA256:ECDHE-RSA-AES128-SHA256';
ssl_prefer_server_ciphers on;

# Güvenli EC Türleri
ssl_ecdh_curve secp521r1:secp384r1:prime256v1;
...

Eğer her şeyi doğru yaptıysak sonuç şu şekilde olmalı.

TLS 1.3 ile birlikte

Evet dostlar, bugün sizlere sunucumuzda EC kriptolojisi ile ECDSA ortak anahtarını nasıl kullanacağımızı anlattım. Makaleyi aşağıdaki emojilerle oylamayı ve aklınıza tak yorum kısmında yazmayı unutmayın. Herkese iyi çalışmalar dilerim. :)