बाद में SSH-PK-Authentication में उपयोग के लिए PKCS12 फ़ाइल से सार्वजनिक / निजी कुंजी निकालें


194

मैं PKCS#12एसएसएच-पब्लिक-की-ऑथेंटिकेशन में बाद में उपयोग के लिए अपनी फ़ाइल से सार्वजनिक और निजी कुंजी निकालना चाहता हूं ।

अभी, मैं ssh-keygen के माध्यम से कुंजी उत्पन्न कर रहा हूं, जिसे मैंने .ssh/authorized_keyक्लाइंट-साइड पर कहीं संबंधित किया है।

भविष्य में, मैं एक PKCS#12कंटेनर से कुंजियों का उपयोग करना चाहता हूं , इसलिए मुझे पहले से सार्वजनिक कुंजी को निकालना होगा PKCS#12और फिर उन्हें .ssh/authorized_keysफ़ाइल में डालना होगा । क्या इसके माध्यम से काम करने का कोई मौका है openssl? क्या PKCS#12ssh-public-key प्रमाणीकरण के लिए कुंजियाँ संगत हैं?

जवाबों:


283

आप PKCS # 12 कंटेनर से सार्वजनिक / निजी कुंजी निकालने के लिए निम्न आदेशों का उपयोग कर सकते हैं:

  • PKCS # 1 निजी कुंजी

    openssl pkcs12 -in yourP12File.pfx -nocerts -out privateKey.pem
    
  • प्रमाण पत्र:

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

7
कमांड काम करते हैं, लेकिन निजी कुंजी को PKCS1 प्रारूप के रूप में निर्यात किया जाता है और मुझे PKCS8 की आवश्यकता है ... क्या मुझे इसे प्राप्त करने के लिए कोई विकल्प याद नहीं है? उदाहरण के लिए, यह '----- BEGIN RSA निजी कुंजी -----' निर्यात करता है, लेकिन मुझे '----- BEGIN निजी कुंजी -----' की आवश्यकता है
edthethird

4
ऐसा करने के लिए आप कोशिश कर सकते हैंopenssl rsa -in privateKey.pem -out private.pem
फ्रैंकोइस

28
@edthethird: PKCS8 पाने के लिए -nodes ध्वज जोड़ें
क्रिस्टोफर के।

7
पासवर्ड के बिना निर्यात करने के लिए, जोड़ें -passout pass:। यह उम्मीद करता है कि पैरामीटर फॉर्म पास में होना चाहिए: mypassword। stackoverflow.com/a/27497899/206277
nidheeshdas

2
@ChristopherK। धन्यवाद! वह मेरे लिए अच्छा था। -nodesकुंजी को सही ढंग से निर्यात जोड़ना
TecHunter

85

यह थोड़ा प्रारूप रूपांतरण के साथ संभव है।

एक स्वरूप में निजी कुंजी निकालने के लिए ओपनश का उपयोग कर सकते हैं:

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

निजी कुंजी को सार्वजनिक कुंजी में बदलने के लिए:

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

एक प्रारूप में सार्वजनिक कुंजी निकालने के लिए Opensh उपयोग कर सकते हैं:

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

2
धन्यवाद! पहली पंक्ति वह थी जिसकी मुझे आवश्यकता थी। बस कुंजी, अनएन्क्रिप्टेड, इसलिए इसे अधिकांश सीडीएन स्वचालित प्रणालियों के माध्यम से स्थापित किया जा सकता है।
बीटीसी

1
@PhilipRego मुझे लगता है कि आपके पास सार्वजनिक और निजी कुंजियाँ हैं। RSA सार्वजनिक कुंजी दो मान है, 'e' सार्वजनिक प्रतिपादक, और 'n' मापांक - दोनों को कुंजी के निजी भागों के साथ संग्रहीत किया जाता है।
रयान

17

OpenSSH बॉक्स से बाहर PKCS # 12 फ़ाइलों का उपयोग नहीं कर सकता। जैसा कि दूसरों ने सुझाव दिया है, आपको पीईएम प्रारूप में निजी कुंजी को निकालना होगा जो आपको ओपनएसएसएल की ओपनएसएसएच की भूमि से मिलती है। यहां वर्णित अन्य समाधान मेरे लिए काम नहीं करते हैं। मैं "प्रीपेड" उपयोगिताओं (OpenSSL 0.9.8y, OpenSSH 6.2p2) के साथ OS X 10.9 Mavericks (10.9.3 इस समय) का उपयोग करता हूं।

सबसे पहले, PEM प्रारूप में एक निजी कुंजी निकालें जो सीधे OpenSSH द्वारा उपयोग की जाएगी:

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

मैं पासवर्ड के साथ निजी कुंजी को एन्क्रिप्ट करने का दृढ़ता से सुझाव देता हूं:

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

जाहिर है, कमांड-लाइन पर एक सादा-पाठ पासवर्ड लिखना सुरक्षित नहीं है, इसलिए आपको इतिहास से अंतिम कमांड हटाना चाहिए या बस यह सुनिश्चित करना चाहिए कि यह वहां नहीं मिलता है। अलग-अलग गोले के अलग-अलग तरीके होते हैं। आप इसे बैश और कई अन्य गोले में इतिहास को सहेजने से रोकने के लिए अपने कमांड को अंतरिक्ष के साथ उपसर्ग कर सकते हैं। यहाँ यह भी बताया गया है कि Bash में इतिहास से कमांड कैसे हटाएं:

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

वैकल्पिक रूप से, आप ओपनएसएसएल के लिए एक निजी कुंजी पासवर्ड पास करने के लिए अलग-अलग तरीके का उपयोग कर सकते हैं - पास वाक्यांश तर्क के लिए ओपनएसएसएल प्रलेखन से परामर्श करें ।

फिर, एक OpenSSH सार्वजनिक कुंजी बनाएं जिसे अधिकृत_की फ़ाइल में जोड़ा जा सकता है:

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

क्या | openssl rsaसामान है?
स्नेक

1
@ पता करें कि यह सुनिश्चित करता है कि आउटपुट में केवल निजी कुंजी है। मेरे मामले में, यह पहचान फ़ाइल बनाता है ( ~/.ssh/id_rsaकुछ बग के रूप में "गुण" के साथ "बिना" | खुलता है rsa`। मुझे लगता है कि OpenSSH और अन्य उपयोगिताओं जो पहचान फ़ाइल का उपयोग करती हैं, उस cruft (मैंने कोशिश नहीं की है) को संभाल सकती हैं, लेकिन मैं बस केवल आवश्यक डेटा प्रदान करने के लिए उपयोग किया जाता हूं और अधिक कुछ नहीं, खासकर अगर यह सुरक्षा के आसपास कुछ है।
frzng

1
इस उत्तर ने मुझे टर्मिनल में पीईएम-प्रारूप निजी कुंजी तक पहुंचने के लिए काम किया, जिसे मैं कॉपी / पेस्ट करने में सक्षम था: openssl pkcs12 -in filename.p12 -clcerts -nodes -nocerts
BillyRayCyrus

7

समाधान 1:

P12 को jks से निकालें

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

P12 से PEM निकालें और फ़ाइल और crt फ़ाइल से pem संपादित करें

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

Jks से कुंजी निकालें

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

समाधान 2:

फ़ाइल P``` को txt करने के लिए PEM और एन्क्रिप्टेडPाइप करें निकालें

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

निजीकरण को डिक्रिप्ट करें

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

1
प्रश्नों का उत्तर देते समय यह उजागर करने में मदद करता है कि कमांड क्या हैं। आप ऐसा कर सकते हैं कि कमांड के पहले और बाद में तीन बैकक्वॉट जोड़कर `` इको हेल्लो`` `बन जाता है echo hello
पेट

2

अपडेट: मैंने देखा है कि मेरा उत्तर सिर्फ एक अच्छी तरह से की एक गरीब डुप्लिकेट था पर सवाल समझाया https: //unix.stackexchange.com / ... द्वारा BryKKan

यहाँ से एक उद्धरण है:

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
कुछ स्पष्टीकरण जोड़ने से यह उत्तर अधिक उपयोगी होगा।
mx0

0

जहां तक ​​मुझे पता है कि PKCS # 12 सिर्फ एक प्रमाण पत्र / सार्वजनिक / निजी कुंजी स्टोर है। यदि आपने PKCS # 12 फ़ाइल से कोई सार्वजनिक कुंजी निकाली है, तो OpenSSH को PEM प्रारूप में निकाले जाने तक इसका उपयोग करने में सक्षम होना चाहिए । आप शायद पहले से ही जानते हैं कि ssh-public-key प्रमाणीकरण के लिए इसका उपयोग करने के लिए आपको एक संबंधित निजी कुंजी ( PEM में भी ) की आवश्यकता होती है ।


0

स्वीकृत उत्तर सही कमांड है, मैं सिर्फ एक अतिरिक्त चीज जोड़ना चाहता हूं, जब कुंजी को निकालते हैं यदि आप पीईएम पासवर्ड ( "Enter PEM pass phrase:") खाली छोड़ते हैं तो पूरी कुंजी नहीं निकाली जाएगी लेकिन केवल localKeyIDइसे निकाला जाएगा। पूर्ण कुंजी प्राप्त करने के लिए आपको निम्नलिखित कमांड चलाने वाले एक पीईएम पासवर्ड को निर्दिष्ट करना होगा।

कृपया ध्यान दें कि जब आयात पासवर्ड की बात आती है, तो आप वास्तविक पासवर्ड को निर्दिष्ट कर सकते हैं "Enter Import Password:"या इस पासवर्ड को खाली छोड़ सकते हैं:

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

1
यह स्वीकृत उत्तर के लिए एक टिप्पणी होनी चाहिए, उत्तर नहीं।
स्टाइलक्स
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.