SSH-PK-Authentication uygulamasında daha sonra kullanmak üzere PKCS12 dosyasından ortak / özel anahtarı ayıklayın


194

PKCS#12SSH-Public-Key-Authentication'da daha sonra kullanmak üzere dosyamdan genel ve özel anahtarı ayıklamak istiyorum .

Şu anda, ssh-keygen ile .ssh/authorized_keymüşteri tarafında bir yere koyduğum anahtarlar üretiyorum .

Gelecekte, bir PKCS#12kapsayıcıdaki anahtarları kullanmak istiyorum , bu yüzden önce ortak anahtarı ayıklayıp PKCS#12sonra .ssh/authorized_keysdosyaya koymalıyım . Bunun üstesinden gelme şansı var mı openssl? İçindeki anahtarlar PKCS#12ssh-public-key kimlik doğrulaması ile uyumlu mu?

Yanıtlar:


284

Bir PKCS # 12 kapsayıcısından genel / özel anahtarı ayıklamak için aşağıdaki komutları kullanabilirsiniz:

  • PKCS # 1 Özel anahtar

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • Sertifikalar:

    openssl pkcs12 -in yourP12File.pfx -clcerts -nokeys -out publicCert.pem
    

7
komutlar çalışır, ancak Özel anahtar PKCS1 biçimi olarak verilir ve PKCS8 gerekir ... Bunu almak için eksik herhangi bir seçenek var mı? Örneğin, '----- BAŞLAT RSA ÖZEL ANAHTAR -----' ama ihtiyacım var '----- ÖZEL ANAHTAR
BAŞLAT

4
Bunu yapmak için deneyebilirsinizopenssl rsa -in privateKey.pem -out private.pem
Francois

28
@edthethird: PKCS8'i almak için -nodes bayrağını ekleyin
Christopher K.

7
Şifre olmadan dışa aktarmak için ekleyin -passout pass:. Parametrenin pass: mypassword biçiminde olmasını bekler. stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK. Teşekkürler! benim için iyi olan buydu. -nodesanahtarı doğru bir şekilde ekleyerek
TecHunter

85

Bu, biraz biçim dönüştürme ile mümkündür.

Özel anahtarı openssh ayıklamak için kullanabilirsiniz:

openssl pkcs12 -in pkcs12.pfx -nocerts -nodes | openssl rsa > id_rsa

Özel anahtarı ortak bir anahtara dönüştürmek için:

openssl rsa -in id_rsa -pubout | ssh-keygen -f /dev/stdin -i -m PKCS8

Açık anahtarı bir formatta ayıklamak için şunu kullanabilirsiniz:

openssl pkcs12 -in pkcs12.pfx -clcerts -nokeys | openssl x509 -pubkey -noout | ssh-keygen -f /dev/stdin -i -m PKCS8

2
Teşekkür ederim! İlk satır ihtiyacım olan şeydi. Sadece anahtar, şifrelenmemiş, böylece çoğu CDN otomatik sistem üzerinden kurulabilir.
BTC

1
@PhilipRego Genel ve özel anahtarların karıştığını düşünüyorum. Bir RSA ortak anahtarı iki değerdir, genel üs ve 'n' modülü - her ikisi de anahtarın özel bölümleri boyunca depolanır.
ryanc

17

OpenSSH, PKCS # 12 dosyalarını kutudan çıkaramaz. Diğerlerinin önerdiği gibi, özel anahtarı sizi OpenSSL diyarından OpenSSH'ye götüren PEM formatında çıkarmalısınız. Burada bahsedilen diğer çözümler benim için işe yaramıyor. OS X 10.9 Mavericks'i (şu anda 10.9.3) “hazır ambalajlı” yardımcı programlarla (OpenSSL 0.9.8y, OpenSSH 6.2p2) kullanıyorum.

İlk olarak, doğrudan OpenSSH tarafından kullanılacak PEM formatında özel bir anahtar alın:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa > ~/.ssh/id_rsa

Özel anahtarı şifre ile şifrelemenizi şiddetle tavsiye ederim:

openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts | openssl rsa -passout 'pass:Passw0rd!' > ~/.ssh/id_rsa

Açıkçası, komut satırına düz metin bir parola yazmak da güvenli değildir, bu nedenle son komutu geçmişten silmeniz veya oraya ulaşmadığından emin olmanız gerekir. Farklı mermilerin farklı yolları vardır. Bash ve diğer birçok mermide tarihe kaydedilmesini önlemek için komutunuza boşluk önek ekleyebilirsiniz. Bash'teki geçmişten komutu nasıl sileceğiniz aşağıda açıklanmıştır:

history -d $(history | tail -n 2 | awk 'NR == 1 { print $1 }')

Alternatif olarak, özel anahtar parolasını OpenSSL'ye geçirmek için farklı bir yol kullanabilirsiniz - geçiş deyimi bağımsız değişkenleri için OpenSSL belgelerine bakın .

Ardından, yetkili_anahtarlar dosyasına eklenebilecek bir OpenSSH genel anahtarı oluşturun:

ssh-keygen -y -f ~/.ssh/id_rsa > ~/.ssh/id_rsa.pub

Ne | openssl rsaişe yarar?
Snekse

1
@Snekse, çıktıda yalnızca özel anahtar bulunduğundan emin olur. Benim durumumda, ~/.ssh/id_rsa"| openssl rsa`. Sanırım OpenSSH ve kimlik dosyasını kullanan diğer yardımcı programlar bu işi halledebilir (denemedim), ama sadece gerekli verileri sağlamak için alışkınım, özellikle de güvenlikle ilgili bir şey varsa.
frzng

1
Bu cevap, kopyalayabildiğim / yapıştırabildiğim terminaldeki PEM biçimindeki özel anahtara openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
erişmem için çalıştı

7

Çözüm 1:

P12'yi jks'ten çıkarın

keytool -importkeystore -srckeystore MyRootCA.jks -destkeystore MyRootCA.p12 -deststoretype PKCS12

P12'den PEM ayıklayın ve crt dosyasından dosyayı ve pem'i düzenleyin

openssl pkcs12 -in MyRootCA.p12 -clcerts -nokeys -out MyRootCA.crt

Anahtarı jks'ten çıkart

openssl pkcs12 -in MyRootCA.p12 -nocerts -out encryptedPrivateKey.pem
openssl rsa -in encryptedPrivateKey.pem -out decryptedPrivateKey.key

Çözüm 2:

PEM'i ve şifreliÖzelKey'i txt dosyasına çıkarın```

openssl pkcs12 -in MyRootCA.p12 -out keys_out.txt

PrivateKey şifresini çöz

openssl rsa -in encryptedPrivateKey.key [-outform PEM] -out decryptedPrivateKey.key

1
Soruları cevaplarken komutların ne olduğunu vurgulamanıza yardımcı olur. Komuttan önce ve sonra üç geri tırnak ekleyerek bunu yapabilirsiniz, böylece `` yankı merhaba '' olur echo hello.
PatS

2

Güncelleme: Ben cevap kuyunun sadece zavallı tekrarı olan üzerinde soruyu açıkladı fark //unix.stackexchange.com / ... https: tarafından BryKKan

İşte ondan bir alıntı:

openssl pkcs12 -in <filename.pfx> -nocerts -nodes | sed -ne '/-BEGIN PRIVATE KEY-/,/-END PRIVATE KEY-/p' > <clientcert.key>

openssl pkcs12 -in <filename.pfx> -clcerts -nokeys | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <clientcert.cer>

openssl pkcs12 -in <filename.pfx> -cacerts -nokeys -chain | sed -ne '/-BEGIN CERTIFICATE-/,/-END CERTIFICATE-/p' > <cacerts.cer>

3
Biraz açıklama eklemek bu cevabı daha kullanışlı hale getirecektir.
mx0

0

Bildiğim kadarıyla PKCS # 12 sadece bir sertifika / genel / özel anahtar deposu. PKCS # 12 dosyasından bir ortak anahtar çıkardıysanız, OpenSSH, PEM formatında çıkarıldığı sürece onu kullanabilmelidir . Muhtemelen , ssh-public-key kimlik doğrulaması için kullanmak üzere karşılık gelen bir özel anahtara ( PEM'de de) ihtiyacınız olduğunu zaten biliyorsunuzdur .


0

Kabul edilen cevap doğru komuttur, sadece bir şey daha eklemek istiyorum, PEM şifresini ( "Enter PEM pass phrase:") boş bırakırsanız anahtarı çıkarırken tam anahtar çıkarılmaz, ancak sadece localKeyIDçıkarılır. Tam anahtarı almak için aşağıdaki komutu çalıştırırken bir PEM şifresi belirtmeniz gerekir.

Parola içe aktarma söz konusu olduğunda, bu parolanın gerçek parolasını belirtebileceğinizi "Enter Import Password:"veya bu parolayı boş bırakabileceğinizi lütfen unutmayın :

openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem

1
Bu cevap değil, kabul edilen cevap için bir yorum olmalıdır.
Styx
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.