PEM प्रारूप में एक जावा कीस्टोर को परिवर्तित करना


132

मैं कीमूल और ओप्सनल एप्लिकेशन्स का उपयोग करके जावा कीस्टोर फाइल को PEM फाइल में बदलने की कोशिश कर रहा हूं। लेकिन मुझे रूपांतरण करने का अच्छा तरीका नहीं मिला। कोई विचार?

केईस्टोर को सीधे पीईएम में परिवर्तित करने के बजाय मैंने पहले पीकेसीएस 12 फाइल बनाने की कोशिश की और फिर प्रासंगिक पीईएम फाइल और कीस्टोर में परिवर्तित कर दी। लेकिन मैं उनका उपयोग करके कनेक्शन स्थापित नहीं कर सका। (ध्यान दें कि मुझे एक सुरक्षित कनेक्शन को लागू करने के लिए बस एक पीईएम फ़ाइल और एक कीस्टोर फाइल की आवश्यकता है। "कोई जावा कीस्टॉर फ़ाइल से प्रारंभ करें" जैसा कोई प्रतिबंध नहीं है। :) इसलिए अन्य प्रारूपों से शुरू करना मेरे मामले के साथ स्वीकार्य है।

लेकिन jks से pem के लिए एक सीधा रूपांतरण विधि बेहतर है।

जवाबों:


214

यह बहुत सीधा है, कम से कम jdk6 का उपयोग कर ...

बाश $ कीटूल -स्टीस्टोर foo.jks -genkeypair -alias foo \
        -dname 'CN = foo.example.com, L = मेलबोर्न, ST = विक्टोरिया, C = AU'
पासवर्ड दर्ज करें:  
नया पासवर्ड पुनः दर्ज करें: 
के लिए कुंजी पासवर्ड दर्ज करें 
        (RETURN यदि कीस्टोर पासवर्ड के समान है):  
बैश $ कीटूल -स्टीस्टोर foo.jks -exportcert -alias foo | \
       Opensl x509 -inform der -text
कीस्टर पासवर्ड दर्ज करें: asdasd
प्रमाणपत्र:
    डेटा:
        संस्करण: 3 (0x2)
        क्रमांक: 1237334757 (0x49c03ae5)
        हस्ताक्षर एल्गोरिथ्म: dsaWithSHA1
        जारीकर्ता: C = AU, ST = विक्टोरिया, L = मेलबोर्न, CN = foo.example.com
        वैधता
            इससे पहले नहीं: मार्च 18 00:05:57 2009 GMT
            नहीं के बाद: जून 16 00:05:57 2009 GMT
        विषय: सी = एयू, एसटी = विक्टोरिया, एल = मेलबोर्न, सीएन = foo.example.com
        विषय सार्वजनिक कुंजी जानकारी:
            सार्वजनिक कुंजी एल्गोरिथम: dsaEnc एन्क्रिप्शन
            डीएसए सार्वजनिक कुंजी:
                पब: 
                    00: e2: 66: 5c: E0: 2 ई: दा: E0: 6b: A6: आ: 97: 64: 59: 14:
                    7e: ए 6: 2 ई: 5a: 45: F9: 2f: B5: 2 डी: F4: 34: 27: E6: 53: C7:
 

बैश $ कीटूल -मिमपोर्टेकेस्टोर -सर्किटिस्टोर फू.जक्स \
       -Destkeystore foo.p12 \
       -sststoretype jks \
       -deststoretype pkcs12
गंतव्य कीस्टोर पासवर्ड दर्ज करें:  
नया पासवर्ड पुनः दर्ज करें: 
स्रोत कीस्टॉर पासवर्ड दर्ज करें:  
उर्फ फू के लिए प्रवेश सफलतापूर्वक आयात किया गया।
आयात आदेश पूरा हुआ: 1 प्रविष्टि सफलतापूर्वक आयात की गई, 0 प्रविष्टियाँ विफल या रद्द की गईं

बाश $ खुलता है pkcs12 -in foo.p12 -out foo.pem
आयात पासवर्ड दर्ज करें:
मैक ने ठीक सत्यापित किया
PEM पास वाक्यांश दर्ज करें:
सत्यापन - PEM पास वाक्यांश दर्ज करें:

बैश $ खुलता है x509 -टेक्स्ट -इन foo.pem
प्रमाणपत्र:
    डेटा:
        संस्करण: 3 (0x2)
        क्रमांक: 1237334757 (0x49c03ae5)
        हस्ताक्षर एल्गोरिथ्म: dsaWithSHA1
        जारीकर्ता: C = AU, ST = विक्टोरिया, L = मेलबोर्न, CN = foo.example.com
        वैधता
            इससे पहले नहीं: मार्च 18 00:05:57 2009 GMT
            नहीं के बाद: जून 16 00:05:57 2009 GMT
        विषय: सी = एयू, एसटी = विक्टोरिया, एल = मेलबोर्न, सीएन = foo.example.com
        विषय सार्वजनिक कुंजी जानकारी:
            सार्वजनिक कुंजी एल्गोरिथम: dsaEnc एन्क्रिप्शन
            डीएसए सार्वजनिक कुंजी:
                पब: 
                    00: e2: 66: 5c: E0: 2 ई: दा: E0: 6b: A6: आ: 97: 64: 59: 14:
                    7e: ए 6: 2 ई: 5a: 45: F9: 2f: B5: 2 डी: F4: 34: 27: E6: 53: C7:
 

बाश $ खुलता है dsa -text -in foo.pem
DSA कुंजी पढ़ें
PEM पास वाक्यांश दर्ज करें:
निजी कुंजी: (1024 बिट)
priv:
    00: 8F: B1: वायुसेना: 55: 63: 92: 7c: d2: 0f: E6: f3: A2: एफ 5: एफएफ:
    1 क: 7a: फ़े: 8C: 39: dd
पब: 
    00: e2: 66: 5c: E0: 2 ई: दा: E0: 6b: A6: आ: 97: 64: 59: 14:
    7e: ए 6: 2 ई: 5a: 45: F9: 2f: B5: 2 डी: F4: 34: 27: E6: 53: C7:



आप के साथ अंत:

  • foo.jks - जावा प्रारूप में कीस्टोर।
  • foo.p12 - PKCS # 12 प्रारूप में कीस्टोर।
  • foo.pem - कीमोर से सभी कुंजी और सेर्ट्स, PEM प्रारूप में।

(यदि आप चाहें तो इस अंतिम फ़ाइल को कुंजी और प्रमाणपत्र में विभाजित किया जा सकता है।)


कमांड सारांश - जेकेएस कीस्टोर को बनाने के लिए:

keytool -keystore foo.jks -genkeypair -alias foo \
    -dname 'CN=foo.example.com,L=Melbourne,ST=Victoria,C=AU'

कमांड सारांश - जेकेएस कीस्टोर को पीकेसीएस # 12 कीस्टोर में बदलने के लिए, फिर पीईएम फाइल में:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

यदि आपके पास अपने जेकेएस कीस्टोर में एक से अधिक प्रमाण पत्र हैं, और आप केवल किसी एक उपनाम से जुड़े प्रमाण पत्र और कुंजी को निर्यात करना चाहते हैं, तो आप निम्न भिन्नता का उपयोग कर सकते हैं:

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcalias foo \
   -srcstoretype jks \
   -deststoretype pkcs12

openssl pkcs12 -in foo.p12 -out foo.pem

कमांड सारांश - जेकेएस कीस्टोर की पीईएम फाइल से तुलना करने के लिए:

keytool -keystore foo.jks -exportcert -alias foo | \
   openssl x509 -inform der -text

openssl x509 -text -in foo.pem

openssl dsa -text -in foo.pem

12
इस पद्धति में विश्वसनीय प्रमाण पत्र समर्थित नहीं हैं: यह PKS12 प्रारूप का प्रतिबंध है जो मुझे लगता है कि देखें: java.sun.com/javase/6/docs/technotes/guides/security/jsse// (java.security.KeyStoreException पर अनुभाग) : TrustedCertEntry समर्थित नहीं)
andygavin

2
मेरे पास एक पुरानी JKS फाइल है। मैं ऊपर की विधि का उपयोग करके निर्यात नहीं कर सका। मैं अंत में एक डमी मूल्य के लिए keytool arg '-destkeypass' सेट करके इसे करने में सक्षम था। 'कुंजीटूल' एक चेतावनी को भी संकेत देता है, जिसमें कहा गया है कि यह डेस्टीपास मूल्य को अनदेखा कर रहा है? कोई अन्य तकनीक काम नहीं करेगी। संकेतों का उपयोग करने से काम नहीं चला, केवल कमांड लाइन तर्क से काम करता है। PKCS12 निर्यात में एक बग होना चाहिए, क्या कोई टिप्पणी कर सकता है?
सेमीकजेन्टी

4
"Opensl pkcs12 -in foo.p12 -out foo.pem" निम्न त्रुटि फेंकता है: आयात पासवर्ड दर्ज करें: MAC सत्यापित ठीक त्रुटि कुंजियाँ और प्रमाण पत्र 139848775526048: त्रुटि: 06065064: डिजिटल लिफाफा दिनचर्या: EVP_DecryptFinal_ex: bad decrypt: evp_enc.c: : 139848775526048: त्रुटि: 23077074: PKCS12 दिनचर्या: PKCS12_pbe_crypt: pkcs12 cipherfinal त्रुटि: p12_decr.c: 104: 139848775606048: त्रुटि: 2306A075: PKCS12 दिनचर्या: PKCS12_item_drypt_drypt2/trypt2/trypt2/trypt2/trypt_drypt इसके लिए क्या उपाय है?
उदारा एसएस लियानाज

1
अन्य लोगों के लिए एक चेतावनी, केटूल कमांड को किसी कारण से पूरा होने में थोड़ा समय लगता है, मुझे निर्यात होने तक 30 सेकंड इंतजार करना पड़ा
निकोलस मम्मार्ट्स

1
@ UdaraS.SLiyanage: समाधान के लिए केसी के जवाब पर गौर करें
निकोलस मम्मार्ट्स

29

opensslजब मैं StoBor की कमांड का उपयोग कर रहा था, तो मुझे गलतियाँ मिलती रहीं:

MAC verified OK
Error outputting keys and certificates
139940235364168:error:06065064:digital envelope routines:EVP_DecryptFinal_ex:bad decrypt:evp_enc.c:535:
139940235364168:error:23077074:PKCS12 routines:PKCS12_pbe_crypt:pkcs12 cipherfinal error:p12_decr.c:97:
139940235364168:error:2306A075:PKCS12 routines:PKCS12_item_decrypt_d2i:pkcs12 pbe crypt error:p12_decr.c:123:

किसी कारण के लिए, केवल यह शैली मेरी JKS फ़ाइल के लिए काम करेगी

keytool -importkeystore -srckeystore foo.jks \
   -destkeystore foo.p12 \
   -srcstoretype jks \
   -srcalias mykey \
   -deststoretype pkcs12 \
   -destkeypass DUMMY123

कुंजी सेट कर रहा था destkeypass, तर्क का मूल्य मायने नहीं रखता था।


6
तर्क यहां पाया जा सकता है: herongyang.com/PKI/… डेस्टीचॉस डीओईएस बात btw
निकोलस मम्मैर्ट्स

मैंने इस टिप्पणी को बढ़ा-चढ़ाकर पेश किया, लेकिन इसके लायक यह खुद की पोस्ट है। यहां खोजना कठिन था।
रिची रिच

15

keytoolआदेश आप एक कुंजी की दुकान से निजी कुंजी निर्यात करने की अनुमति नहीं होगी। ऐसा करने के लिए आपको कुछ जावा कोड लिखना होगा। कुंजी स्टोर खोलें, आपको जो कुंजी चाहिए, उसे प्राप्त करें और इसे PKCS # 8 प्रारूप में फ़ाइल में सहेजें। संबंधित प्रमाण पत्र भी सहेजें।

KeyStore ks = KeyStore.getInstance("jks");
/* Load the key store. */
...
char[] password = ...;
/* Save the private key. */
FileOutputStream kos = new FileOutputStream("tmpkey.der");
Key pvt = ks.getKey("your_alias", password);
kos.write(pvt.getEncoded());
kos.flush();
kos.close();
/* Save the certificate. */
FileOutputStream cos = new FileOutputStream("tmpcert.der");
Certificate pub = ks.getCertificate("your_alias");
cos.write(pub.getEncoded());
cos.flush();
cos.close();

इन फ़ाइलों (जो बाइनरी प्रारूप में हैं) को PEM प्रारूप में बदलने के लिए OpenSSL उपयोगिताओं का उपयोग करें।

openssl pkcs8 -inform der -nocrypt < tmpkey.der > tmpkey.pem
openssl x509 -inform der < tmpcert.der > tmpcert.pem

धन्यवाद erickson .. निष्कर्ष यह है कि "हम JKS से PEM में सीधा रूपांतरण केवल कीटूल और ओपनसेल उपयोगिताओं का उपयोग करके नहीं कर सकते हैं"। क्या मैं सही हूँ?
चतुरंगा चंद्रशेखर

4
आप केवल जरूरत है जावा 1.4 लिखने कोड अप करने के लिए -> PKCS # 12 - -> पीईएम जावा 5 के बाद से, Keytool और openssl JKS से एक दो चरण रूपांतरण करने के लिए जोड़ा जा सकता है। हालाँकि, अपने स्वयं के प्रमुख उपकरण को लिखना JKS से प्रत्यक्ष रूपांतरण - PEM करने का एकमात्र तरीका है ।
स्टोबोर

मुझे लगता है कि यह जेडीके 6 से आगे है। लेकिन हाँ, अब PKCS # 12 आयात समर्थित है।
एरकन

13

Keytool का उपयोग करके jks से pem फ़ाइल में सीधा रूपांतरण

keytool -exportcert -alias selfsigned -keypass password -keystore test-user.jks -rfc -file test-user.pem

10
हां, जो प्रमाण पत्र का निर्यात करता है। हालांकि, यह महत्वपूर्ण जानकारी का निर्यात नहीं करता है ...
स्टोबोर

यह सटीक सरल उत्तर है कि मैं सफलता के बिना दर्जनों keytoolऔर jbossडॉक्टर पृष्ठों पर क्या खोज रहा था । धन्यवाद!
क्रेटेंको

15
यह प्रमुख सूचना नहीं है
जेम्स

1
यह सार्वजनिक कुंजी प्रमाणपत्र
asami

मैंने इस कमांड को चलाने की कोशिश की। इसके लिए पासवर्ड की आवश्यकता होती है, कीस्टटोर पासवर्ड दर्ज करें: कीटल त्रुटि: java.io.IOException: कीस्टोर के साथ छेड़छाड़ की गई थी, या पासवर्ड गलत था। मैंने पासवर्ड (पासवर्ड) के रूप में उपयोग किया है, लेकिन यह उसी त्रुटि को फेंक रहा था
मोहित सिंह

9

एक जेकेएस फ़ाइल को पीईएम और कुंजी प्रारूप (.crt और .key) में कनवर्ट करने के लिए सरलीकृत निर्देश।

keytool -importkeystore -srckeystore <Source-Java-Key-Store-File> -destkeystore <Destination-Pkcs12-File> -srcstoretype jks -deststoretype pkcs12 -destkeypass <Destination-Key-Password>

openssl pkcs12 -in <Destination-Pkcs12-File> -out <Destination-Pem-File>

openssl x509 -outform der -in <Destination-Pem-File> -out <Destination-Crt-File>

openssl rsa -in <Destination-Pem-File> -out <Destination-Key-File>

2

मुझे एक बहुत ही दिलचस्प समाधान मिला:

http://www.swview.org/node/191

फिर, मैंने जोड़ी को सार्वजनिक / निजी कुंजी को दो फाइलों में विभाजित किया है private.key publi.pem और यह काम करता है!


2

JKS KeyStore को एकल PEM फ़ाइल में बदलना आसानी से निम्नलिखित कमांड का उपयोग करके पूरा किया जा सकता है:

keytool -list -rfc -keystore "myKeystore.jks" | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d" >> "myKeystore.pem"

स्पष्टीकरण:

  1. keytool -list -rfc -keystore "myKeystore.jks"PEM प्रारूप में 'myKeyStore.jks' KeyStore में सब कुछ सूचीबद्ध करता है। हालाँकि, यह अतिरिक्त जानकारी भी छापता है।
  2. | sed -e "/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d"वह सब कुछ फ़िल्टर करता है जिसकी हमें आवश्यकता नहीं है। हम KeyStore में हर चीज के केवल PEMs के साथ बचे हैं।
  3. >> "myKeystore.pem" PEMs को 'myKeyStore.pem' फ़ाइल में लिखें।

3
बैश:! d ": ईवेंट नहीं मिला
user3217883

1
@ user3217883 आप sed "s/^\-*BEGIN [A-Z]*\-*$//g;s/^\-*END [A-Z]*\-*$//g"इसके बजाय (gnu sed के साथ) कुछ आज़मा सकते हैं, लेकिन मुझे यकीन नहीं है कि आपके किस्टोर में एक से अधिक सर्टिफिकेट होने पर यह पर्याप्त नहीं है
Idriss Neumann

यदि आप कर रहे हैं bash: !d": event not found: बैश के लिए एक विस्मयादिबोधक चिह्न एक कमांड का उपयोग करने के लिए एक छोटी कुंजी है। इस उत्तर का उपयोग करने के लिए आपको उद्धरण चिह्नों के स्थान पर apostrophes का उपयोग करने की आवश्यकता है, जैसे कि sed के लिए -e का उपयोग करेंkeytool -list -rfc -keystore "myKeystore.jks" | sed -e '/-*BEGIN [A-Z]*-*/,/-*END [A-Z]-*/!d' >> "myKeystore.pem"
B. एडलर

दुर्भाग्य से, यह केवल प्रमाण पत्र का निर्यात करता है, न कि निजी कुंजी का
Maddin

2

पहले JKS से PKCS12 के लिए कीस्टोर को डंप करें

1. keytool -importkeystore -srckeystore ~ ​​/ .android / debug.keystore -destkeystore मध्यवर्ती ।p12 -srcstoretype JKS -deststoretor PKCS12

नई pkcs12 फ़ाइल को पेम में डंप करें

  1. Opensl pkcs12 -in मध्यवर्ती .p12 -nodes -out मध्यवर्ती.rsa.pem

आपके पास pem प्रारूप में प्रमाणित और निजी कुंजी दोनों होनी चाहिए। उन्हें विभाजित करें। “BEGIN CERTIFICATE” और “END CERTIFICATE” के बीच के भाग को cert.x509.pem के बीच रखें। “BEGIN RSA PRIVATE KEY” और “END RSA PRIVATE KEY” के बीच के भाग को .rsa.pem के बीच में रखें। निजी कुंजी को pk8 प्रारूप में रूपांतरित करें। signapk द्वारा अपेक्षित

3. Opensl pkcs8 -topk8 -outform DER -in private.rsa.pem -inform PEM -out private.pk8 -nocrypt



1

यदि आपके पास ओपनसेल स्थापित नहीं है और आप एक त्वरित समाधान की तलाश कर रहे हैं, तो पोर्टेलेक नामक सॉफ्टवेयर है जो डाउनलोड करने के लिए बहुत उपयोगी और छोटा है।

नुकसान यह है कि जहां तक ​​मुझे पता है कोई कमांड लाइन नहीं है। लेकिन GUI से, यह PEM निजी कुंजी निर्यात करने के लिए बहुत सीधे है:

  1. आप JKS कुंजी स्टोर खोलें
  2. अपनी निजी कुंजी प्रविष्टि पर राइट क्लिक करें और निर्यात चुनें
  3. निजी कुंजी और प्रमाणपत्र और पीईएम प्रारूप का चयन करें

    पोर्टमेक के साथ JKS से PEM निजी कुंजी निर्यात करें


0

Keystore Explorer http://keystore-explorer.org/ आज़माएं

KeyStore एक्सप्लोरर जावा कमांड-लाइन यूटिलिटीज keytool और jarsigner के लिए एक खुला स्रोत GUI प्रतिस्थापन है। यह Opensl / pkcs12 भी करता है।


0

सबसे पहले कीस्टोर फाइल बनाएं

C: \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -keystore androidkey.jks -genkeypair -alias androidkey

पासवर्ड दर्ज करें:
नया पासवर्ड दर्ज करें:
आपका पहला और अंतिम नाम क्या है? अज्ञात: FirstName LastName
आपकी संगठनात्मक इकाई का नाम क्या है? अज्ञात: मोबाइल विकास
आपके संगठन का नाम क्या है? अज्ञात: आपकी कंपनी का नाम
आपके शहर या इलाके का नाम क्या है? आपके राज्य या प्रांत का नाम क्या है?
इस इकाई के लिए दो अक्षर वाला देश कोड क्या है? अज्ञात: IN // प्रेस दर्ज करें

अब यह पुष्टि करने के लिए कहेगा

क्या CN = FirstName LastName, OU = मोबाइल डेवलपमेंट, O = आपकी कंपनी का नाम, L = CityName, ST = StateName, C = IN सही है? [नहीं]: हाँ

(RETURN अगर एक ही कीस्टोर पासवर्ड के रूप में) के लिए कुंजी पासवर्ड दर्ज करें: यदि आप एक ही पासवर्ड चाहते हैं तो एंटर दबाएं

कुंजी उत्पन्न की गई है, अब आप बस निम्नलिखित कमांड का उपयोग करके पेम फ़ाइल प्राप्त कर सकते हैं

C: \ Program Files \ Android \ Android Studio \ jre \ bin> keytool -export -rfc -alias androidkey -file android_certificate.pem -keystore androidkey.jks
Enter keystore पासवर्ड:
फ़ाइल में संग्रहीत प्रमाणपत्र


0

PEM प्रारूप में एक जावा कीस्टोर को परिवर्तित करना

सभी का सबसे सटीक उत्तर यह होना चाहिए कि यह संभव नहीं है।

एक जावा कीस्टोर क्रिप्टोग्राफिक कुंजी और प्रमाण पत्र के लिए केवल एक भंडारण सुविधा है जबकि PEM केवल X.509 प्रमाणपत्रों के लिए एक फ़ाइल प्रारूप है।

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