Openssl

Bu yazımızda SSL/TLS için en çok  kullanılan kütüphanelerden Openssl ‘de en sık kullanım alanlarına bakacağız.

# Private key oluşturma

openssl genrsa -out gizli.key 2048

Yukarıdaki komut 2048 bitinde bir RSA private anahtar oluşturacaktır. Bu yazıyı yazdığımız tarih itibariyle RSA için güvenli kabul edilen ve best-practice anahtar uzunluğu 2048’dir. Unutmayınız private key adı üstünde gizli bir anahtardır ve kimseyle paylaşmamanız beklenir.

# Private key şifreleme

Private key çok kritik olduğundan dilerseniz private key’inizi simetrik bir şifreleme algoritmasıyla (aes) encrypt edebilirsiniz. Örneğin aşağıdaki -aes128 parametresiyle 128 bitlik aes ile encrpyted edildi.

openssl genrsa -aes128 -out sifreli_gizli.key 2048

# Public Key (RSA) oluşturma

openssl rsa -in gizli.key -pubout -out acik.key

Public anahtarın private anahtarına bağlı olduğunu düşünebilirsiniz. Bu yüzden bir üstteki komutla oluşturduğumuz private key’e bağlı bir public key oluşturduk. Tekrar tekrar aynı aynı komutu girerseniz aynı public key’in oluştuğunu göreceksiniz. Private key’in aksine public key açık bir anahtar olması sebebiyle paylaşılmasında herhangi bir sakınca bulunmamaktadır.

# CSR Oluşturma

openssl req -new -key gizli.key -out talep.csr -sha256

Bir sertifika oluşturmak için  CSR kodu oluşturup CA’ye gönderirsiniz. CA, bu CSR içindeki ilgili alanlara göre public anahtarınızı imzalayıp sertifikanızı sizlere gönderir. CA ‘in gerçekte baktığı şey budur. Yoksa CA public key’i alıp diğer tüm alanları kendine göre düzenleyebilir. Lakin CSR ‘sız da sertifika oluşturulabilir.

Oluşturulan CA içerisinde private key’iniz olmadığından herhangi bir CSR decoder ile internet üzerinde de görüntülenebilir. Bu yazıyı yazdığımız tarih itibariyle SHA1 olarak imzalanan sertifikalar istemciler tarafından güvensiz sayılması sebebiyle SHA256 kullanılması önerilir.

# SAN destekli CSR Oluşturma

Bir sertifika için bir hostname tanımlanır. Diyelim ki birden fazla hostanme için bir sertifika talebi yapmak istiyorsunuz. Sanırım bu gibi durumlarda aklınıza wildcard gelmiştir.Ancak diyelimki hem abc.com, hemde xyz.com için tek bir sertifika oluşturmak istiyorsunuz. Bu durumda wildcard’da çözüm olmayacaktır. Bunun için x509 standartına göre Subject Alternative Name (SAN) eklentisini kullanmalısınız. Bu tür CSR oluşturma örneği vermemin sebebi, SAN’ın ne demek olduğunu bilmenizdir. Çünkü gerçek hayatta SAN’a rastlarsınız. Mantığını bilmekte fayda var diye düşünüyorum. Ayrıca x509 standartına göre SAN altında hostname limiti yoktur. Ancak public CA’ler kendileri şu kadar destekliyorum diye yazar.

SAN kullandığınız an, istemciler CN alanına bakmaz, SAN alanına bakar. Yani CN alanının SAN eklentisi olması durumunda bir önemi yoktur. Bu önemlidir. Çünkü farklı uygulamalarla bunu yapmak belki daha kolay olsa da openssl ile direkt SAN tipi CSR oluşturamıyorsunuz. Bunun için bir konfigürasyon ile belirtmeniz gerekir.

Varsayılan konfigürasyon dosyanızı bir dizine kopyalayınız ve daha sonra bu dosyayı açıp bir kaç düzenleme yaparız.

cnf - Openssl

Kopyaladığımız bu dosya da req_extensions alaını # ile disable edilmişti. Aktif ettim.

req - Openssl

v3_req alanına gidip ayarlarımı yapmaya başladım.

san - Openssl

Bu yapılandırmaya göre CSR oluşturulur.

openssl req -new -key gizli.key -out sanTalep.csr -sha256 -config myconf.cnf

sant - Openssl

# CSR ‘ı doğrulama ve görüntüleme

openssl req -in talep.csr -text -noout -verify

Elinize bir CSR geldi ve içeriğini decode etmek istersiniz bunu yapmanın en kolay yolu csr decoder olarak google’layıp daha şık parse edilmiş bir şekilde görüntülemeniz. Ancak openssl ile de yukarıdaki komutu kullanabilirsiniz. Verify işlemi ise x509 standartına uygun olup olmadığını kontrol eder.

# CSR’dan public key’i çıkarma

openssl req -in talep.csr -noout -pubkey

Bazı durumlarda CSR içerisindeki public key’i görmek isteyebilirsiniz. Bu durumda yukarıdaki komutu kullanabilirsiniz.

# CSR ile Sertifika imzalamak

openssl x509 -req -days 365 -in talep.csr -signkey gizli.key -out sertifika.crt -sha256
openssl x509 -req -days 365 -in talep.csr -signkey gizli.key -out sertifika.crt -sha256 -outform DER

CA gitmeden mevcut bir CSR’ı imzalamak ve sertifika oluşturmak istiyorsunuz. Bu durumda yukarıdaki komutu kullanabilirsiniz. Buradaki imza anahtarı sertifikayı imzalayanın anahtarı. Varsayılan format PEM olduğundan -outform uzantısıyla encoding formatınızı belirleyebilirsiniz de.

# CSR olmaksızın sertifika imzalamak

openssl req -new -x509 -days 365 -key gizli.key -out sertifikam.crt -sha256

Hiç CSR’a ihtiyaç olmadan direkt bir sertifikayı private anahtarınızla imzalayıp oluşturmak istiyorsunuz. Bu durumda yukarıdaki komutu kullanabilirsiniz.

# CSR’lı SAN Sertifika İmzalama

Diyelim ki bir CSR dosyası elinize ulaştı. Buradaki SAN değerlerini bir dosyaya malesef bir parser yazmadıysanız manuel olarak aşağıdaki gibi yazmalısınız.

subjectAltName = DNS:deneme.com, DNS:www.test.com, DNS:*.test.com

Sonrasında aşağıdaki komut ile sertifika oluşturulup imzalanır.

openssl req -new -x509 -days 365 -key gizli.key -out sertifikam.crt -sha256 -extfile myhosts

# Sunucudaki sertifikayı indirmek

echo | openssl s_client -connect gokhankesici.com:443 2>&1 | sed --quiet '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > sertifika.crt

Openssl istemci olarak davranarak sunucudaki secure portuna bağlanarak sertifika bilgisini elde edebilirsiniz. Bazı durumlarda sertifikayı indirmek gerekebilir.

# Sertifika detayını görüntüleme

openssl x509 -in sertifika.crt -text -noout
openssl x509 -in dersertifika.crt -text -inform DER

Elinize var olan bir sertifikayı openssl ile decode edebilirsiniz. Varsayılan gösterim PEM formatı olduğundan DER formatını görüntülemek isterseniz -inform parametresiyle görüntüleyebilrsiniz. Sertifikaya ait tüm alanları burada görebilirsiniz. Özellikle extension alanları ilginç olabiliyor.

ext - Openssl

Örneğin CA:False sertifikanın CA sertifikası olmadığını belirtiyor. Extended Key Usage alanı sertifikanın hangi amaçla kullanıldığını gösterir. Belirtilmemişse herhangi bir kullanım kısıtlaması yok demektir. Authority Information Access bölümünde sertifika otoritesine ait bilgileri görebilirsiniz.  Örneğin CA Issuer ‘da sertifikamızı imzalayan otoritenin sertifikasını görebilirsiniz. O sertifikanın içinde de daha farklı detaylar yer alabilir. İnceledikçe çok farklı detayları görebilirsiniz.

# Sertifikadan public anahtarı çıkarma

Sertifika dosyası içerisinden public anahtarını aşağıdaki gibi çıkartabilirsiniz.

openssl x509 -inform pem -in sertifika.crt -pubkey -noout
openssl x509 -inform der -in dersertifika.crt -pubkey -noout

# PEM ve DER formatları arasında sertifika dönüşümü

PEM ve DER sertifika formatları içerisinde private key olmayan encoding formatlarıdır. PEM (ASCII) formatındaki bir sertifikayı DER (binary) formatına dönüştürmek için aşağıdaki komutu kullanabilirsiniz.

openssl x509 -inform PEM -in sertifika.crt -outform DER -out dersertifika.crt

DER formatındaki bir sertifikayı ASCII formatına dönüştürmek için aşağıdaki komutu kullanabilirsiniz.

openssl x509 -inform DER -in dersertifika.crt -outform PEM -out pemsertifika.crt

# PEM ve DER formatları arasında anahtar (rsa) dönüşümü

PEM formatınındaki anahtarı DER formatındaki bir anahtara dönüştürme

openssl rsa -inform PEM -in gizli.key -outform DER -out gizli_der.key

DER formatınındaki anahtarı PEM formatındaki bir anahtara dönüştürme

openssl rsa -inform DER -in gizli_der.key -outform PEM -out gizli_pem.key

# PFX (pkcs12) ‘e dönüştürmek

PKCS12 ‘i zip gibi bir arşiv formatı düşünebilirsiniz. İçerisinde private key, sertifika, ara sertifikalar vs. yer aldığı bir binary zip gibi düşünebilirsiniz. Bu yüzden saklamak, taşıma gibi iş yükleri için pfx işimizi kolaylaştırmaktadır.

Microsoft tarafında pkcs12 ‘in karşılığı PFX’dir. PFX’in dosyasında private key’in yer alması sebebiyle bir parola girerek korumanız beklenir.

openssl pkcs12 -export -inkey gizli.key -in sertifikam.crt -out mypfx.pfx

# PFX’den private anahtarın çıkartılması

Private anahtarın çıkartılması için öncelikle private key ve passphrase(yani parola) birlikte çıkartılır.

openssl pkcs12 -in mypfx.p12 -nocerts -nodes -out anahtarim.pem

Daha sonra çıkartılan dosyadan sadece private key aşağıdaki gibi çıkartılır.

openssl rsa -in anahtarim.pem -out anahtarim.key

# PFX’den sertifikanın çıkartılması

Sertifikanın çıkartılması için öncelikle sertifika ve passphrase(yani parola) birlikte çıkartılır.

openssl pkcs12 -in mypfx.p12 -nokeys -out sertifikam.pem

Daha sonra çıkartılan dosyadan sadece sertifika aşağıdaki gibi çıkartılır.

openssl x509 -in sertifikam.pem -out sertifikam.crt