OpenSSL Temelleri: SSL Sertifikaları, Özel Anahtarlar ve CSR’lerle Çalışma

OpenSSL, Ortak Anahtar Altyapısı (PKI) ve HTTPS (TLS üzerinden HTTP) ile ilgili çok çeşitli görevler için kullanılabilen çok yönlü bir komut satırı aracıdır. Bu makale, günlük senaryolarda yararlı olan OpenSSL komutlarına hızlı bir başvuru sağlar. Bu yazı, özel anahtarlar, sertifika imzalama istekleri ve sertifika biçimi dönüştürme için OpenSSL örneklerini içerir. OpenSSL’nin tüm kullanımlarını kapsamaz.

Sertifika İmzalama İstekleri (CSR’ler) hakkında

Ticari bir sertifika yetkilisinden (CA) bir SSL sertifikası almak istiyorsanız, bir sertifika imzalama isteği (CSR) oluşturmanız gerekir. Bir CSR, temel olarak bir anahtar çiftinin ortak anahtarından ve bazı ek bilgilerden oluşur. Bu bileşenlerin her ikisi de imzalandığında sertifikaya eklenir.

Bir CSR oluşturduğunuzda, sertifikayla ilgili bilgi vermeniz istenecektir. Bu bilgi Ayırt Edici Ad (DN) olarak bilinir. DN’deki önemli bir alan, sertifikayı birlikte kullanmayı düşündüğünüz ana bilgisayarın tam Tam Nitelikli Etki Alanı Adı (FQDN) olması gereken Ortak Ad’dır (CN). Bilgiyi komut satırı veya bir dosyadan ileterek bir CSR oluştururken etkileşimli istemleri atlamak da mümkündür.

Bir DN’deki diğer öğeler, işletmeniz veya kuruluşunuz hakkında ek bilgiler sağlar. Bir sertifika yetkilisinden bir SSL sertifikası satın alıyorsanız, genellikle “Kuruluş” gibi bu ek alanların kuruluşunuzun ayrıntılarını doğru bir şekilde yansıtması gerekir.

İşte CSR bilgi isteminin nasıl görüneceğine dair bir örnek:

---
Country Name (2 letter code) [AU]:US
State or Province Name (full name) [Some-State]:New York
Locality Name (eg, city) []:Brooklyn
Organization Name (eg, company) [Internet Widgits Pty Ltd]:Example Brooklyn Company
Organizational Unit Name (eg, section) []:Technology Division
Common Name (e.g. server FQDN or YOUR name) []:examplebrooklyn.com
Email Address []:

CSR bilgi istemine etkileşimli olmayan bir şekilde yanıt vermek istiyorsanız, CSR bilgisi isteyen herhangi bir OpenSSL komutuna -subj parametresini ekleyerek bunu yapabilirsiniz. Yukarıdaki kod bloğunda görüntülenen aynı bilgileri kullanan seçeneğe bir örnek:

-subj "/C=US/ST=New York/L=Brooklyn/O=Example Brooklyn Company/CN=examplebrooklyn.com"

Artık CSR’leri anladığınıza göre, bu kılavuzun OpenSSL ilei ilgilendiğiniz herhangi bir bölümüne geçmekten çekinmeyin.

CSR oluşturma

Bu bölüm, CSR’lerin (ve zaten mevcut değilse özel anahtarların) oluşturulmasıyla ilgili OpenSSL komutlarını kapsar. CSR’ler, bir sertifika yetkilisinden SSL sertifikaları istemek için kullanılabilir.

Önceki bölümde bahsedilen -subj parametresi ile CSR bilgilerini etkileşimli olmayan bir şekilde ekleyebileceğinizi unutmayın.

Özel Anahtar ve CSR Oluşturun

Apache HTTP veya Nginx web sunucunuzun güvenliğini sağlamak için HTTPS (TLS üzerinden HTTP) kullanmak istiyorsanız ve SSL sertifikasını vermek için bir Sertifika Yetkilisi (CA) kullanmak istiyorsanız bu yöntemi kullanın. Oluşturulan CSR, CA imzalı bir SSL sertifikası verilmesini istemek için bir CA’ya gönderilebilir. CA’nız SHA-2’yi destekliyorsa, CSR’yi SHA-2 ile imzalamak için -sha256 seçeneğini ekleyin.

Bu komut, sıfırdan 2048 bitlik bir özel anahtar (domain.key) ve bir CSR (domain.csr) oluşturur:

openssl req \
       -newkey rsa:2048 -nodes -keyout domain.key \
       -out domain.csr

İşlemi tamamlamak için CSR bilgi istemini yanıtlayın.

-newkey rsa:2048 parametresi, anahtarın RSA algoritması kullanılarak oluşturulan 2048 bit olması gerektiğini belirtir. -nodes parametresi, özel anahtarın bir parola ile şifrelenmemesi gerektiğini belirtir. Burada yer almayan ancak ima edilen -new parametresi, bir CSR’nin oluşturulmakta olduğunu gösterir.

Mevcut Bir Özel Anahtardan CSR Oluşturun

CA’dan sertifika istemek için kullanmak istediğiniz özel anahtarınız zaten varsa bu yöntemi kullanın.

Bu komut, mevcut bir özel anahtara (domain.key) dayalı yeni bir CSR (domain.csr) oluşturur:

openssl req \
       -key domain.key \
       -new -out domain.csr

İşlemi tamamlamak için CSR bilgi istemini yanıtlayın.

-key seçeneği, yeni bir CSR oluşturmak için kullanılacak mevcut bir özel anahtarı (domain.key) belirtir. -new seçeneği, bir CSR’nin oluşturulmakta olduğunu gösterir.

Mevcut Bir Sertifikadan ve Özel Anahtardan CSR Oluşturun

Mevcut bir sertifikayı yenilemek istiyorsanız ancak siz veya CA’nız herhangi bir nedenle orijinal CSR’ye sahip değilseniz bu yöntemi kullanın. Temel olarak, bu bilgileri mevcut sertifikadan çıkardığı için sizi CSR bilgilerini yeniden girme zahmetinden kurtarır.

Bu komut, mevcut bir sertifikaya (domain.crt) ve özel anahtara (domain.key) dayalı yeni bir CSR (domain.csr) oluşturur:

openssl x509 \
       -in domain.crt \
       -signkey domain.key \
       -x509toreq -out domain.csr

-x509toreq seçeneği, CSR yapmak için bir X509 sertifikası kullandığınızı belirtir.

SSL Sertifikaları Oluşturma

Bir hizmeti güvence altına almak için bir SSL sertifikası kullanmak istiyorsanız ancak CA imzalı bir sertifikaya ihtiyacınız yoksa, geçerli (ve ücretsiz) bir çözüm kendi sertifikalarınızı imzalamaktır.

Kendi kendinize düzenleyebileceğiniz yaygın bir sertifika türü, kendinden imzalı bir sertifikadır. Kendinden imzalı sertifika, kendi özel anahtarıyla imzalanmış bir sertifikadır. Kendinden imzalı sertifikalar, CA imzalı sertifikaların yanı sıra verileri şifrelemek için kullanılabilir, ancak kullanıcılarınız, bilgisayarları veya tarayıcıları tarafından sertifikaya güvenilmediğini belirten bir uyarı görüntülenecektir. Bu nedenle, kendinden imzalı sertifikalar yalnızca hizmetinizin kimliğini kullanıcılarına kanıtlamanız gerekmiyorsa kullanılmalıdır (örneğin, üretim dışı veya genel olmayan sunucular).

Bu bölüm, kendinden imzalı sertifikaların oluşturulmasıyla ilgili OpenSSL komutlarını kapsar.

Kendinden İmzalı Bir Sertifika Oluşturun

Apache HTTP veya Nginx web sunucunuzun güvenliğini sağlamak için HTTPS (TLS üzerinden HTTP) kullanmak istiyorsanız ve sertifikanızın bir CA tarafından imzalanmış olması gerekmiyorsa bu yöntemi kullanın.

Bu komut, sıfırdan 2048 bitlik bir özel anahtar (domain.key) ve kendinden imzalı bir sertifika (domain.crt) oluşturur:

openssl req \
       -newkey rsa:2048 -nodes -keyout domain.key \
       -x509 -days 365 -out domain.crt

İşlemi tamamlamak için CSR bilgi istemini yanıtlayın.

-x509 parametresi, req’e kendinden imzalı bir sertifika oluşturmasını söyler. -days 365 parametresi, sertifikanın 365 gün boyunca geçerli olacağını belirtir. Sertifikayla ilişkilendirilecek bilgileri toplamak için geçici bir CSR oluşturulur.

Mevcut Bir Özel Anahtardan Kendinden İmzalı Sertifika Oluşturun

Kendinden imzalı bir sertifika oluşturmak istediğiniz özel bir anahtarınız zaten varsa bu yöntemi kullanın.

Bu komut, mevcut bir özel anahtardan (domain.key) kendinden imzalı bir sertifika (domain.crt) oluşturur:

openssl req \
       -key domain.key \
       -new \
       -x509 -days 365 -out domain.crt

İşlemi tamamlamak için CSR bilgi istemini yanıtlayın.

-x509 parametresi, req’e kendinden imzalı bir sertifika oluşturmasını söyler. -days 365 parametresi, sertifikanın 365 gün boyunca geçerli olacağını belirtir. -new parametresi, CSR bilgi istemini etkinleştirir.

Mevcut Bir Özel Anahtardan ve CSR’den Kendinden İmzalı Sertifika Oluşturun

Zaten bir özel anahtarınız ve CSR’niz varsa ve bunlarla kendinden imzalı bir sertifika oluşturmak istiyorsanız bu yöntemi kullanın.

Bu komut, mevcut bir özel anahtardan (domain.key) ve (domain.csr) kendinden imzalı bir sertifika (domain.crt) oluşturur:

openssl x509 \
       -signkey domain.key \
       -in domain.csr \
       -req -days 365 -out domain.crt

-days 365 parametresi, sertifikanın 365 gün boyunca geçerli olacağını belirtir.

Sertifikaları Görüntüle

Sertifika ve CSR dosyaları, kolayca okunamayan PEM biçiminde kodlanmıştır.

Bu bölüm, PEM kodlu dosyaların gerçek girişlerini çıkaracak OpenSSL komutlarını kapsar.

CSR Girişlerini Görüntüle

Bu komut, bir CSR’nin (domain.csr) içeriğini düz metin olarak görüntülemenizi ve doğrulamanızı sağlar:

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

Sertifika Girişlerini Görüntüle

Bu komut, bir sertifikanın (domain.crt) içeriğini düz metin olarak görüntülemenizi sağlar:

openssl x509 -text -noout -in domain.crt

Sertifikanın CA Tarafından İmzalandığını Doğrulayın

Use this command to verify that a certificate (domain.crt) was signed by a specific CA certificate (ca.crt):

openssl verify -verbose -CAfile ca.crt domain.crt

Özel Anahtarlar

Bu bölüm, özel anahtarlar oluşturmaya ve doğrulamaya özgü OpenSSL komutlarını kapsar.

Özel Anahtar Oluşturun

Parola korumalı, 2048 bit özel anahtar (domain.key) oluşturmak için bu komutu kullanın:

openssl genrsa -des3 -out domain.key 2048

İşlemi tamamlamanız istendiğinde bir parola girin.

Özel Anahtarı Doğrulayın

Özel anahtarın (domain.key) geçerli bir anahtar olup olmadığını kontrol etmek için bu komutu kullanın:

openssl rsa -check -in domain.key

Özel anahtarınız şifrelenmişse, parola ifadesi istenir. Başarıyla, şifrelenmemiş anahtar terminalde çıkacaktır.

Özel Anahtarın Sertifika ve CSR ile Eşleştiğini Doğrulayın

Özel anahtarın (domain.key) bir sertifika (domain.crt) ve CSR (domain.csr) ile eşleşip eşleşmediğini doğrulamak için bu komutları kullanın:

openssl rsa -noout -modulus -in domain.key | openssl md5
openssl x509 -noout -modulus -in domain.crt | openssl md5
openssl req -noout -modulus -in domain.csr | openssl md5

Her komutun çıktısı aynıysa, özel anahtar, sertifika ve CSR’nin ilişkili olma olasılığı son derece yüksektir.

Özel Anahtarı Şifrele

Bu, şifrelenmemiş bir özel anahtarı (unencrypted.key) alır ve bunun şifreli bir sürümünü (encrypted.key) verir:

openssl rsa -des3 \
       -in unencrypted.key \
       -out encrypted.key

Özel anahtarı şifrelemek için istediğiniz parolayı girin.

Özel Anahtarın Şifresini Çöz

Bu, şifrelenmiş bir özel anahtarı (encrypted.key) alır ve bunun şifresi çözülmüş bir versiyonunu verir (decrypted.key):

openssl rsa \
       -in encrypted.key \
       -out decrypted.key

İstendiğinde şifreli anahtarın parolasını girin.

Sertifika Biçimlerini Dönüştür

Çalışmış olduğumuz sertifikaların tamamı ASCII PEM kodlu X.509 sertifikalarıdır. Çeşitli başka sertifika kodlama ve kapsayıcı türleri vardır; bazı uygulamalar belirli biçimleri diğerlerine tercih eder. Ayrıca, bu biçimlerin çoğu, tek bir dosyada özel anahtar, sertifika ve CA sertifikası gibi birden çok öğe içerebilir.

OpenSSL, sertifikaları bu biçimlerden çok çeşitli biçimlere dönüştürmek için kullanılabilir. Bu bölüm bazı olası dönüşümleri kapsayacaktır.

PEM’i DER’ye dönüştür

PEM kodlu bir sertifikayı (domain.crt) bir ikili biçim olan DER kodlu sertifikaya (domain.der) dönüştürmek istiyorsanız bu komutu kullanın:

openssl x509 \
       -in domain.crt \
       -outform der -out domain.der

DER formatı genellikle Java ile kullanılır.

DER’yi PEM’ye dönüştür

DER kodlu bir sertifikayı (domain.der) PEM kodlu sertifikaya (domain.crt) dönüştürmek istiyorsanız bu komutu kullanın:

openssl x509 \
       -inform der -in domain.der \
       -out domain.crt

PEM’i PKCS7’ye Dönüştür

Bir PKCS7 dosyasına (domain.p7b) PEM sertifikaları (domain.crt ve ca-chain.crt) eklemek istiyorsanız bu komutu kullanın:

openssl crl2pkcs7 -nocrl \
       -certfile domain.crt \
       -certfile ca-chain.crt \
       -out domain.p7b

PKCS7 dosyasına hangi sertifikaların ekleneceğini belirtmek için bir veya daha fazla -certfile seçeneği kullanabileceğinizi unutmayın.

P7B olarak da bilinen PKCS7 dosyaları, genellikle Java Anahtar Depolarında ve Microsoft IIS’de (Windows) kullanılır. Sertifikalar ve CA sertifikaları içerebilen ASCII dosyalarıdır.

PKCS7’yi PEM’e Dönüştür

Bir PKCS7 dosyasını (domain.p7b) bir PEM dosyasına dönüştürmek istiyorsanız bu komutu kullanın:

openssl pkcs7 \
       -in domain.p7b \
       -print_certs -out domain.crt

PKCS7 dosyanızın içinde birden fazla öğe varsa (örneğin bir sertifika ve bir CA ara sertifikası), oluşturulan PEM dosyasının içindeki tüm öğeleri içereceğini unutmayın.

PEM’i PKCS12’ye Dönüştür

Özel bir anahtar (domain.key) ve bir sertifika (domain.crt) almak ve bunları bir PKCS12 dosyasında (domain.pfx) birleştirmek istiyorsanız bu komutu kullanın:

openssl pkcs12 \
       -inkey domain.key \
       -in domain.crt \
       -export -out domain.pfx

Boş bırakabileceğiniz dışa aktarma şifreleri istenecektir. Bu durumda, sertifikaları tek bir PEM dosyasında (domain.crt) birleştirerek PKCS12 dosyasına bir sertifika zinciri ekleyebileceğinizi unutmayın.

PFX dosyaları olarak da bilinen PKCS12 dosyaları, genellikle Microsoft IIS’de (Windows) sertifika zincirlerini içe ve dışa aktarmak için kullanılır.

PKCS12’yi PEM’e Dönüştür

Bir PKCS12 dosyasını (domain.pfx) dönüştürmek ve onu PEM formatına (domain.combined.crt) dönüştürmek istiyorsanız bu komutu kullanın:

openssl pkcs12 \
       -in domain.pfx \
       -nodes -out domain.combined.crt

PKCS12 dosyanızın içinde birden fazla öğe varsa (örneğin bir sertifika ve özel anahtar), oluşturulan PEM dosyasının içindeki tüm öğeleri içereceğini unutmayın.

OpenSSL Sürümü

Openssl version komutu, hangi sürümü çalıştırdığınızı kontrol etmek için kullanılabilir. Çalıştırdığınız OpenSSL sürümü ve derlendiği seçenekler, size sunulan yetenekleri (ve bazen komut satırı seçeneklerini) etkiler.

Aşağıdaki komut, çalıştırdığınız OpenSSL sürümünü ve derlendiği tüm seçenekleri görüntüler:

openssl version -a

Bu kılavuz, aşağıdaki ayrıntılara sahip bir OpenSSL ikili dosyası kullanılarak yazılmıştır (önceki komutun çıktısı):

OpenSSL 1.1.1  11 Sep 2018
built on: Mon Aug 23 17:02:39 2021 UTC
platform: debian-amd64
options:  bn(64,64) rc4(16x,int) des(int) blowfish(ptr)
compiler: gcc -fPIC -pthread -m64 -Wa,--noexecstack -Wall -Wa,--noexecstack -g -O2 -fdebug-prefix-map=/build/openssl-Flav1L/openssl-1.1.1=. -fstack-protector-strong -Wformat -Werror=format-security -DOPENSSL_USE_NODELETE -DL_ENDIAN -DOPENSSL_PIC -DOPENSSL_CPUID_OBJ -DOPENSSL_IA32_SSE2 -DOPENSSL_BN_ASM_MONT -DOPENSSL_BN_ASM_MONT5 -DOPENSSL_BN_ASM_GF2m -DSHA1_ASM -DSHA256_ASM -DSHA512_ASM -DKECCAK1600_ASM -DRC4_ASM -DMD5_ASM -DAES_ASM -DVPAES_ASM -DBSAES_ASM -DGHASH_ASM -DECP_NISTZ256_ASM -DX25519_ASM -DPADLOCK_ASM -DPOLY1305_ASM -DNDEBUG -Wdate-time -D_FORTIFY_SOURCE=2
OPENSSLDIR: "/usr/lib/ssl"
ENGINESDIR: "/usr/lib/x86_64-linux-gnu/engines-1.1"
Seeding source: os-specific

Yazının orijinalini buradan okuyabilirsiniz.