Ana içeriğe geç

OpenSSL ile sertifika format dönüştürme#

SSL/TLS sertifikaları tek bir formatta gelmiyor - hangi sistemin ürettiğine göre .pfx, .p7b, .pem, .crt, .key, .der karışımıyla karşılaşırsınız. Nginx .pem/.crt+.key bekler, IIS genelde .pfx üretir, bazı Windows CA'ları .p7b verir. Bu sayfa üçü arasında dönüşümü anlatıyor.

Önce formatları tanıyın#

Uzantı İçeriği Private key içerir mi
.pem / .crt / .cer Base64 metin, tek sertifika ya da zincir Hayır (genelde)
.key Base64 metin, private key Evet - bu dosyayı kimseyle paylaşmayın
.pfx / .p12 İkili (binary), sertifika + private key + zincir bir arada, parola korumalı Evet
.p7b / .p7c İkili ya da Base64, yalnızca sertifika(lar) - zincir taşır ama private key taşımaz Hayır
.der İkili, tek bir sertifika ya da anahtar (PEM'in ikili hali) İçeriğine göre

.pfx ve .p7b görüntüde birbirine benziyor ama temel fark bu: .pfx private key'i de içeride taşır ve bir parolayla korunur, .p7b yalnızca genel (public) sertifika zincirini taşır.

PFX'ten private key ve sertifikayı çıkarın#

Nginx/Apache gibi PEM bekleyen bir sunucuya bir IIS/Windows sertifikasını taşırken en sık ihtiyaç budur.

# Private key'i çıkar
openssl pkcs12 -in sertifika.pfx -nocerts -out private.key -nodes

# Sertifikayı çıkar
openssl pkcs12 -in sertifika.pfx -clcerts -nokeys -out certificate.crt

# Ara sertifika zincirini çıkar (varsa)
openssl pkcs12 -in sertifika.pfx -cacerts -nokeys -chain -out ca-chain.crt

-nodes (no DES) private key'i şifrelemeden çıkarır - nginx'in şifreli bir key dosyasını her başlangıçta parola sormadan okuyabilmesi için gereklidir. Anahtar dosyasını şifreli tutmak isterseniz -nodes'u kaldırın, ama o zaman her nginx -s reload'da parola girmeniz gerekir.

İzinleri unutmayın

private.key dosyasını çıkardıktan sonra hemen izinlerini kısıtlayın:

chmod 600 private.key
chown root:root private.key

Bir private key'in okunabilir kalması, o sertifikayla korunan her şeyin güvenliğini bitirir.

P7B'yi PEM/PFX'e çevirin#

P7B private key taşımaz - dönüştürürken elinizde ayrıca private key dosyanız olmalı (sertifikayı ilk isterken oluşturduğunuz CSR'ın eşleniği).

# P7B Base64/PEM formatındaysa (metin olarak açılabiliyorsa)
openssl pkcs7 -print_certs -in sertifika.p7b -out sertifika.pem

# P7B ikili/DER formatındaysa - openssl pkcs7 varsayılan olarak PEM bekler,
# ikili dosyada -inform DER olmadan "no start line" hatası alırsınız
openssl pkcs7 -inform DER -print_certs -in sertifika.p7b -out sertifika.pem

# PEM sertifika + ayrı private key'i PFX'e paketle
openssl pkcs12 -export -in sertifika.pem -inkey private.key -out sertifika.pfx -name "sunucu"

Hangi formatta olduğunu bilmiyorsanız

file sertifika.p7b çoğunlukla söyler: "PEM certificate" ya da düz metin/-----BEGIN ile başlıyorsa Base64, "data" ya da ikili karakterler görüyorsanız DER'dir.

PEM'i PFX'e paketleyin#

Elinizde sertifika + zincir + private key ayrı ayrı varsa, hepsini tek bir .pfx'te (IIS/Windows için) birleştirin:

openssl pkcs12 -export \
  -out sertifika.pfx \
  -inkey private.key \
  -in certificate.crt \
  -certfile ca-chain.crt

Komut sizden bir "Export Password" isteyecek - bu parolayı .pfx'i içe aktaran tarafa güvenli bir kanaldan (e-posta değil) iletin.

Sertifika ile private key eşleşiyor mu#

Bir sertifikanın hangi key'e ait olduğunu kaybettiğinizde, ikisinin genel (public) anahtarını karşılaştırarak doğrulayın:

openssl x509 -pubkey -noout -in certificate.crt | openssl md5
openssl pkey -pubout -in private.key | openssl md5

İki komutun çıktısı (md5 hash) birebir aynıysa, sertifika ile key eşleşiyor demektir.

Neden openssl rsa değil

openssl rsa -noout -modulus yalnızca RSA anahtarlarında çalışır - bir EC (ECDSA) private key'de "Not an RSA key" hatasıyla durur, ve modern Let's Encrypt/ACME kurulumlarının çoğu artık ECDSA üretiyor. openssl pkey -pubout her iki anahtar türünde de çalışır, o yüzden genel kontrol için o tercih edilir. RSA'da kaldığınızı biliyorsanız openssl rsa -noout -modulus de aynı sonucu verir.

Morpheus ile

"bu .pfx dosyasından private key ve sertifikayı çıkar, nginx'in beklediği formata getir"

Morpheus üç dosyayı da çıkarır ve doğru izinlerle yerine koyar - ama .pfx parolasını sizden ister, sohbette saklı bir parolayı tahmin etmez.

Kontrol listesi#

  • [ ] Çıkarılan private.key dosyası chmod 600 ile kısıtlandı
  • [ ] Sertifika ile private key'in modulus'u eşleşiyor
  • [ ] Ara sertifika zinciri (varsa) dahil edildi - eksik zincir bazı istemcilerde "güvenilmeyen sertifika" hatası verir
  • [ ] .pfx parolası güvenli bir kanaldan iletildi