CSR (Sertifika İmzalama İsteği) Oluşturma Rehberi

SSL sertifika alırken çoğu sysadmin “CSR nedir, ne yapacağım bununla?” diye düşünür. Sonra bir CA (Certificate Authority) paneline girince form doluyor, ne yapılması gerektiği belli olmuyor. Bu yazıda CSR’ı baştan sona ele alacağız: ne olduğundan tutun, farklı senaryolarda nasıl oluşturulduğuna kadar her şeyi açıklayacağız.

CSR Nedir ve Neden Gereklidir?

CSR, yani Certificate Signing Request, bir SSL/TLS sertifikası talep etmek için oluşturduğunuz şifreli bir metin bloğudur. İçinde sunucunuzun kimlik bilgileri (domain adı, organizasyon, ülke vb.) ve en önemlisi public key bulunur. Bu dosyayı bir CA’ya gönderirsiniz, CA da bunu imzalayarak size sertifikanızı verir.

Mantığı şu şekilde düşünebilirsiniz: Pasaport başvurusu yaparken form dolduruyorsunuz ve fotoğraf ekliyorsunuz. CSR da tam olarak bu: sertifika otoritesine “ben buyum, bunu imzalar mısın?” diye sorduğunuz başvuru belgesi. Ama farkı şu, bu belgede aynı zamanda kriptografik kanıtınız da var.

CSR oluşturma sürecinde iki anahtar üretilir:

  • Private key: Sunucunuzda kalır, asla paylaşılmaz
  • Public key: CSR içine gömülür, CA’ya gönderilir

Bu iki anahtar matematiksel olarak birbirine bağlıdır. CA sizin public key’inizi imzaladığında, sertifikanız hazır olur. Private key ile sertifikayı eşleştirerek HTTPS’i aktif edersiniz.

OpenSSL ile Temel CSR Oluşturma

OpenSSL, Linux sistemlerde neredeyse her zaman kurulu gelir. Windows’ta ise Git Bash veya WSL üzerinden kullanabilirsiniz. İlk olarak en temel yöntemi görelim.

Adım 1: Private Key Oluşturma

openssl genrsa -out domain.key 2048

Bu komut 2048-bit RSA private key oluşturur. Eğer daha güçlü bir key istiyorsanız 4096 kullanabilirsiniz, ama performans etkisini göz önünde bulundurun. Özellikle yoğun trafikli sunucularda 4096-bit key, TLS handshake süresini belirgin şekilde uzatabilir.

Günümüzde ECDSA key’leri de oldukça popüler. Daha kısa key uzunluğuyla daha yüksek güvenlik sağlarlar:

openssl ecparam -genkey -name prime256v1 -out domain-ec.key

Adım 2: CSR Oluşturma

Key hazır olduktan sonra CSR oluşturuyoruz:

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

Bu komutu çalıştırdığınızda interaktif bir form açılır:

Country Name (2 letter code) [AU]: TR
State or Province Name (full name) [Some-State]: Istanbul
Locality Name (eg, city) []: Istanbul
Organization Name (eg, company) [Internet Widgits Pty Ltd]: Sirket Adi A.S.
Organizational Unit Name (eg, section) []: IT Departmani
Common Name (e.g. server FQDN or YOUR name) []: www.example.com
Email Address []: [email protected]

Burada en kritik alan Common Name (CN)‘dir. Sertifika hangi domain için alınıyorsa buraya o yazılmalı. Wildcard sertifika için *.example.com yazabilirsiniz.

Tek Komutla Private Key ve CSR Üretme

Eğer iki ayrı adımla uğraşmak istemiyorsanız, hem private key hem CSR’ı tek seferde oluşturabilirsiniz:

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

-nodes parametresi: Private key’i parola ile şifrelemez. Sunucu uygulamaları her restart’ta parola sormadan key’i okuyabilsin diye genellikle bu kullanılır.

Non-Interactive (Otomatik) CSR Oluşturma

Automation senaryolarında, örneğin Ansible playbook’u veya bir CI/CD pipeline’ı içinde CSR oluşturmanız gerektiğinde, interaktif form yerine doğrudan parametrelerle çalışmak zorundasınız.

openssl req -new -newkey rsa:2048 -nodes 
  -keyout domain.key 
  -out domain.csr 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi A.S./OU=IT/CN=www.example.com"

-subj parametresindeki alanlar:

  • /C: Country (2 harfli ülke kodu)
  • /ST: State/Province
  • /L: Locality (şehir)
  • /O: Organization
  • /OU: Organizational Unit
  • /CN: Common Name (domain adı)

Organizasyon adında virgül veya özel karakter varsa tırnak içine almanız gerekebilir. Türkçe karakter kullanmaktan kaçının, bazı CA’lar bunu reddetebilir.

Config Dosyası ile CSR Oluşturma

Özellikle Subject Alternative Names (SAN) eklemeniz gerektiğinde config dosyası kullanmak şart. Modern tarayıcılar artık sadece CN’e değil, SAN alanına da bakıyor. Yani tek bir sertifikayla hem www.example.com hem example.com hem de mail.example.com için sertifika istiyorsanız SAN kullanmalısınız.

Önce bir config dosyası oluşturun:

cat > csr.conf << EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

[dn]
C = TR
ST = Istanbul
L = Istanbul
O = Sirket Adi A.S.
OU = IT Departmani
CN = www.example.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = www.example.com
DNS.2 = example.com
DNS.3 = mail.example.com
IP.1 = 192.168.1.100
EOF

Sonra bu config dosyasını kullanarak CSR üretin:

openssl req -new -newkey rsa:2048 -nodes 
  -keyout domain.key 
  -out domain.csr 
  -config csr.conf

IP adresi eklemek isteğe bağlı, internal kullanım için faydalı olabilir ama public sertifikalarda pek önerilmez.

CSR İçeriğini Doğrulama

CSR oluşturduktan sonra içini kontrol etmeyi alışkanlık haline getirin. CA’ya göndermeden önce bilgilerin doğru olduğundan emin olmak için:

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

Çıktıda şunları kontrol edin:

  • Subject alanında doğru domain adı var mı
  • Public Key boyutu istediğiniz gibi mi (2048 veya 4096 bit)
  • Signature Algorithm SHA256 veya üstü mü (SHA1 artık geçersiz sayılıyor)
  • X509v3 Subject Alternative Name alanında tüm domain’ler var mı

Eğer SAN alanları görünmüyorsa config dosyanızda bir sorun var demektir, CSR’ı yeniden oluşturun.

Wildcard Sertifika için CSR

Bir domain ve tüm alt domain’leri kapsaması için wildcard sertifika kullanılır. *.example.com bir sertifikası www.example.com, api.example.com, mail.example.com gibi tüm birinci seviye subdomain’leri kapsar. Ama dikkat: sub.api.example.com gibi ikinci seviye subdomain’leri kapsamaz.

openssl req -new -newkey rsa:2048 -nodes 
  -keyout wildcard.key 
  -out wildcard.csr 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi A.S./OU=IT/CN=*.example.com"

Wildcard + ana domain kombinasyonunu kapsatmak istiyorsanız SAN kullanmanız gerekir:

cat > wildcard.conf << EOF
[req]
default_bits = 2048
prompt = no
default_md = sha256
distinguished_name = dn
req_extensions = req_ext

[dn]
C = TR
ST = Istanbul
L = Istanbul
O = Sirket Adi A.S.
OU = IT
CN = *.example.com

[req_ext]
subjectAltName = @alt_names

[alt_names]
DNS.1 = *.example.com
DNS.2 = example.com
EOF

openssl req -new -newkey rsa:2048 -nodes 
  -keyout wildcard.key 
  -out wildcard.csr 
  -config wildcard.conf

Mevcut Sertifikadan CSR Yenileme

Sertifikanız sona erdiğinde, mevcut private key’inizi kullanarak yeni bir CSR oluşturabilirsiniz. Bu sayede key çiftinizi değiştirmek zorunda kalmazsınız. Bazı güvenlik politikaları her yenileme döngüsünde yeni key oluşturulmasını zorunlu kılsa da, key’i korumak istediğiniz durumlarda:

openssl req -new -key mevcut-domain.key -out yeni-domain.csr 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi A.S./OU=IT/CN=www.example.com"

Mevcut sertifikadan bilgileri okuyarak CSR oluşturmak isterseniz:

# Önce mevcut sertifikanın subject bilgisini öğrenin
openssl x509 -in mevcut.crt -noout -subject

# Sonra aynı bilgilerle CSR oluşturun
openssl req -new -key mevcut-domain.key -out yeni-domain.csr 
  -subj "$(openssl x509 -in mevcut.crt -noout -subject | sed 's/subject= //')"

Windows Sunucular İçin CSR (IIS)

Windows’ta IIS kullandığınızda, MMC veya PowerShell ile CSR oluşturabilirsiniz. PowerShell yolu daha esnek:

$params = @{
    Subject = "CN=www.example.com, O=Sirket Adi, C=TR"
    KeyLength = 2048
    KeyAlgorithm = "RSA"
    HashAlgorithm = "SHA256"
    KeyUsage = "DigitalSignature", "KeyEncipherment"
    EnhancedKeyUsage = "Server Authentication"
    CertStoreLocation = "Cert:LocalMachineMy"
    FriendlyName = "www.example.com SSL Certificate"
}

$cert = New-SelfSignedCertificate @params

Ancak production ortamı için doğrudan sertifika almak istiyorsanız certreq kullanın:

# inf dosyası oluştur
$infContent = @"
[Version]
Signature="`$Windows NT`$"

[NewRequest]
Subject = "CN=www.example.com, O=Sirket Adi, C=TR"
KeySpec = 1
KeyLength = 2048
Exportable = TRUE
MachineKeySet = TRUE
SMIME = False
PrivateKeyArchive = FALSE
UserProtected = FALSE
UseExistingKeySet = FALSE
ProviderName = "Microsoft RSA SChannel Cryptographic Provider"
ProviderType = 12
RequestType = PKCS10
KeyUsage = 0xa0
HashAlgorithm = SHA256

[EnhancedKeyUsageExtension]
OID=1.3.6.1.5.5.7.3.1
"@

$infContent | Out-File -FilePath "C:csrrequest.inf" -Encoding ASCII

# CSR oluştur
certreq -new "C:csrrequest.inf" "C:csrdomain.csr"

CSR ile İlgili Sık Yapılan Hatalar

Yanlış Common Name kullanımı: En yaygın hata, CN’e IP adresi ya da yanlış domain yazmak. www prefix’ini unutmak veya fazladan boşluk bırakmak da sertifikanın reddedilmesine yol açabilir.

Private key’i kaybetmek: CSR’ı CA’ya gönderdiniz, sertifika geldi ama private key nerede? Eğer private key’i kaybederseniz sertifikanız işe yaramaz. Mutlaka güvenli bir yerde yedekleyin.

SHA1 ile CSR oluşturmak: Eski OpenSSL sürümleri varsayılan olarak SHA1 kullanabilir. Modern CA’lar SHA1 imzalı CSR’ları reddeder. Her zaman SHA256 veya üstünü kullanın:

openssl req -new -newkey rsa:2048 -nodes 
  -keyout domain.key 
  -out domain.csr 
  -sha256 
  -subj "/C=TR/ST=Istanbul/L=Istanbul/O=Sirket Adi/CN=www.example.com"

SAN alanını unutmak: Özellikle hem example.com hem www.example.com üzerinde çalışmasını istediğiniz sertifikalarda SAN şart. Sadece CN’e yazdığınızda modern tarayıcılar uyarı verebilir.

Dosya izinlerini ihmal etmek: Private key dosyaları en kısıtlı izinlerle saklanmalı:

chmod 600 domain.key
chown root:root domain.key

Gerçek Dünya Senaryosu: Let’s Encrypt Yerine Manuel CSR

Bir müşterimizin bankacılık uygulaması, sertifika otoritesi olarak Let’s Encrypt’i kabul etmiyordu. Uyumluluk gereksinimleri nedeniyle EV (Extended Validation) sertifika zorunluydu. Bu senaryoda otomatik araçlar işe yaramaz, manuel CSR süreci gerekir.

Önce organizasyon bilgilerini topluyoruz, sonra CSR config dosyasını hazırlıyoruz:

# Production ortamı için güçlü key
openssl genrsa -aes256 -out production.key 4096

# Key'den parola kaldırma (sunucu restart'larında gerekli)
openssl rsa -in production.key -out production-nopass.key

# CSR oluşturma
openssl req -new 
  -key production-nopass.key 
  -out production.csr 
  -config ev-csr.conf 
  -sha256

EV sertifika için CSR’da organizasyon bilgilerinin eksiksiz ve resmi ünvana uygun olması kritik. CA, CSR’daki bilgileri resmi belgelerle karşılaştırarak doğrulama yapıyor.

Toplu CSR Oluşturma (Bash Script)

Birden fazla domain için sertifika almanız gerektiğinde, her birini tek tek oluşturmak zaman kaybıdır. Basit bir script ile bunu otomatikleştirebilirsiniz:

#!/bin/bash

DOMAINS=("www.example.com" "api.example.com" "mail.example.com")
COUNTRY="TR"
STATE="Istanbul"
CITY="Istanbul"
ORG="Sirket Adi A.S."
OU="IT"

for DOMAIN in "${DOMAINS[@]}"; do
    echo "CSR olusturuluyor: $DOMAIN"
    
    mkdir -p "certs/$DOMAIN"
    
    openssl req -new -newkey rsa:2048 -nodes 
        -keyout "certs/$DOMAIN/private.key" 
        -out "certs/$DOMAIN/request.csr" 
        -subj "/C=$COUNTRY/ST=$STATE/L=$CITY/O=$ORG/OU=$OU/CN=$DOMAIN" 
        -sha256
    
    chmod 600 "certs/$DOMAIN/private.key"
    
    echo "Tamamlandi: certs/$DOMAIN/"
done

echo "Tum CSR'lar olusturuldu."

Bu script çalıştırıldığında her domain için ayrı bir dizin oluşturur ve içine private key ile CSR dosyasını koyar.

CSR Oluşturduktan Sonra Ne Yapmalısınız?

CSR dosyasını CA’ya gönderme zamanı. Çoğu CA’nın web paneli var, CSR içeriğini kopyalayıp yapıştırıyorsunuz. CSR dosyasının içeriğini görüntülemek için:

cat domain.csr

Çıktı -----BEGIN CERTIFICATE REQUEST----- ile başlayıp -----END CERTIFICATE REQUEST----- ile biter. Tüm bu bloğu kopyalayıp CA paneline yapıştırırsınız.

CA sertifikanızı onayladıktan sonra size genellikle üç dosya gönderir:

  • domain.crt: Sizin sertifikanız
  • intermediate.crt: Ara sertifika (chain)
  • root.crt: Kök sertifika

Bu dosyaları sunucunuzda doğru şekilde yapılandırmanız gerekir. Apache için:

SSLCertificateFile /etc/ssl/certs/domain.crt
SSLCertificateKeyFile /etc/ssl/private/domain.key
SSLCertificateChainFile /etc/ssl/certs/intermediate.crt

Nginx için:

# Önce sertifikaları birleştirin
cat domain.crt intermediate.crt > fullchain.crt

# nginx.conf içinde
ssl_certificate /etc/ssl/certs/fullchain.crt;
ssl_certificate_key /etc/ssl/private/domain.key;

Sonuç

CSR oluşturma süreci kulağa karmaşık gelse de adım adım bakıldığında gayet anlaşılır bir süreç. Kritik noktaları özetleyelim:

  • Private key’inizi asla kaybetmeyin ve asla paylaşmayın
  • Modern sertifikalar için mutlaka SAN alanı ekleyin
  • SHA256 veya üstü algoritma kullanın
  • CSR’ı göndermeden önce openssl req -text -noout -verify -in domain.csr ile doğrulayın
  • Private key dosya izinlerini chmod 600 ile kısıtlayın
  • Automation senaryolarında config dosyası kullanmayı tercih edin

Sertifika yönetimi, zamanla refleks haline gelir. İlk birkaç denemede karışık gelen parametreler, ilerleyen dönemde neredeyse ezberden yapılır hale gelir. Önemli olan doğru alışkanlıkları baştan edinmek.

Yorum yapın