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.keydosyasıchmod 600ile 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
- [ ]
.pfxparolası güvenli bir kanaldan iletildi