java - जावा कुंजी स्टोर में पीईएम आयात करें




ssl keystore (5)

मुझे इसे इंटरनेट से मिला। यह पेम फ़ाइलों के लिए बहुत अच्छा काम करता है जिसमें एकाधिक प्रविष्टियां होती हैं।

#!/bin/bash
pemToJks()
{
        # number of certs in the PEM file
        pemCerts=$1
        certPass=$2
        newCert=$(basename "$pemCerts")
        newCert="${newCert%%.*}"
        newCert="${newCert}"".JKS"
        ##echo $newCert $pemCerts $certPass
        CERTS=$(grep 'END CERTIFICATE' $pemCerts| wc -l)
        echo $CERTS
        # For every cert in the PEM file, extract it and import into the JKS keystore
        # awk command: step 1, if line is in the desired cert, print the line
        #              step 2, increment counter when last line of cert is found
        for N in $(seq 0 $(($CERTS - 1))); do
          ALIAS="${pemCerts%.*}-$N"
          cat $pemCerts |
                awk "n==$N { print }; /END CERTIFICATE/ { n++ }" |
                $KEYTOOLCMD -noprompt -import -trustcacerts \
                                -alias $ALIAS -keystore $newCert -storepass $certPass
        done
}
pemToJks <pem to import> <pass for new jks>

मैं एक एसएसएल सर्वर से कनेक्ट करने की कोशिश कर रहा हूं जिसके लिए मुझे खुद को प्रमाणीकृत करने की आवश्यकता है। अपाचे MINA पर SSL का उपयोग करने के लिए मुझे एक उपयुक्त जेकेएस फ़ाइल चाहिए। हालांकि, मुझे केवल एक पीईएम फ़ाइल दी गई है।

मैं एक पीईएम फ़ाइल से जेकेएस फ़ाइल बनाने के बारे में कैसे जाउंगा?


मेरे मामले में मेरे पास एक पेम फ़ाइल थी जिसमें पारस्परिक SSL प्रमाणीकरण में दो प्रमाण पत्र और एक एन्क्रिप्टेड निजी कुंजी शामिल थी। तो मेरी पेम फ़ाइल इस तरह दिखती है:

-----BEGIN CERTIFICATE-----

...

-----END CERTIFICATE-----

-----BEGIN RSA PRIVATE KEY-----

Proc-Type: 4,ENCRYPTED

DEK-Info: DES-EDE3-CBC,C8BF220FC76AA5F9

...

-----END RSA PRIVATE KEY-----

-----BEGIN CERTIFICATE-----

...

-----END CERTIFICATE-----

मैंने जो किया था यह रहा

फ़ाइल को तीन अलग-अलग फाइलों में विभाजित करें, ताकि प्रत्येक में केवल एक प्रविष्टि हो, ---BEGIN.. और ---END.. लाइनों के साथ समाप्त हो। आइए मान लें कि अब हमारे पास तीन फाइलें हैं: cert1.pem , cert2.pem , और pkey.pem

pkey.pem और निम्न वाक्यविन्यास का उपयोग कर pkey.pem को डीईआर प्रारूप में कनवर्ट करें:

openssl pkcs8 -topk8 -nocrypt -in pkey.pem -inform pEM -out pkey.der -outform DER

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

यदि रूपांतरण सफल होता है, तो आपको pkey.der नामक एक नई फ़ाइल मिल pkey.der

एक नया जावा कीस्टोर बनाएं और निजी कुंजी और प्रमाणपत्र आयात करें:

String keypass = "password";  // this is a new password, you need to come up with to protect your java key store file
String defaultalias = "importkey";
KeyStore ks = KeyStore.getInstance("JKS", "SUN");

// this section does not make much sense to me, 
// but I will leave it intact as this is how it was in the original example I found on internet:   
ks.load( null, keypass.toCharArray());
ks.store( new FileOutputStream ( "mykeystore"  ), keypass.toCharArray());
ks.load( new FileInputStream ( "mykeystore" ),    keypass.toCharArray());
// end of section..


// read the key file from disk and create a PrivateKey

FileInputStream fis = new FileInputStream("pkey.der");
DataInputStream dis = new DataInputStream(fis);
byte[] bytes = new byte[dis.available()];
dis.readFully(bytes);
ByteArrayInputStream bais = new ByteArrayInputStream(bytes);

byte[] key = new byte[bais.available()];
KeyFactory kf = KeyFactory.getInstance("RSA");
bais.read(key, 0, bais.available());
bais.close();

PKCS8EncodedKeySpec keysp = new PKCS8EncodedKeySpec ( key );
PrivateKey ff = kf.generatePrivate (keysp);


// read the certificates from the files and load them into the key store:

Collection  col_crt1 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert1.pem"));
Collection  col_crt2 = CertificateFactory.getInstance("X509").generateCertificates(new FileInputStream("cert2.pem"));

Certificate crt1 = (Certificate) col_crt1.iterator().next();
Certificate crt2 = (Certificate) col_crt2.iterator().next();
Certificate[] chain = new Certificate[] { crt1, crt2 };

String alias1 = ((X509Certificate) crt1).getSubjectX500Principal().getName();
String alias2 = ((X509Certificate) crt2).getSubjectX500Principal().getName();

ks.setCertificateEntry(alias1, crt1);
ks.setCertificateEntry(alias2, crt2);

// store the private key
ks.setKeyEntry(defaultalias, ff, keypass.toCharArray(), chain );

// save the key store to a file         
ks.store(new FileOutputStream ( "mykeystore" ),keypass.toCharArray());

(वैकल्पिक) अपने नए कुंजी स्टोर की सामग्री सत्यापित करें:

$ keytool -list -keystore mykeystore -storepass password

कीस्टोर प्रकार: जेकेएस कीस्टोर प्रदाता: सूर्य

आपके कीस्टोर में 3 प्रविष्टियां हैं:

  • सीएन = ..., कहां = ..., ओ = .., 2 सितंबर, 2014, विश्वसनीय कर्टेंट्री, प्रमाणपत्र फिंगरप्रिंट (SHA1): 2 सी: बी 8: ...

  • आयातकी, 2 सितंबर, 2014, प्राइवेटकेन्ट्री, सर्टिफिकेट फिंगरप्रिंट (एसएचए 1): 9 सी: बी 0: ...

  • सीएन = ..., ओ = ...., 2 सितंबर, 2014, विश्वसनीय कर्टेंट्री, प्रमाणपत्र फिंगरप्रिंट (SHA1): 83:63: ...

(वैकल्पिक) अपने एसएसएल सर्वर के खिलाफ अपने नए कुंजी स्टोर से अपने प्रमाणपत्र और निजी कुंजी का परीक्षण करें: (आप डीवीगिंग को वीएम विकल्प के रूप में सक्षम करना चाहते हैं: -Djavax.net.debug = all)

        char[] passw = "password".toCharArray();
        KeyStore ks = KeyStore.getInstance("JKS", "SUN");
        ks.load(new FileInputStream ( "mykeystore" ), passw );

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, passw);

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        TrustManager[] tm = tmf.getTrustManagers();

        SSLContext sclx = SSLContext.getInstance("TLS");
        sclx.init( kmf.getKeyManagers(), tm, null);

        SSLSocketFactory factory = sclx.getSocketFactory();
        SSLSocket socket = (SSLSocket) factory.createSocket( "192.168.1.111", 443 );
        socket.startHandshake();

        //if no exceptions are thrown in the startHandshake method, then everything is fine..

अंत में अपने प्रमाणपत्रों को HttpsURLConnection के साथ पंजीकृत करें यदि इसका उपयोग करने की योजना है:

        char[] passw = "password".toCharArray();
        KeyStore ks = KeyStore.getInstance("JKS", "SUN");
        ks.load(new FileInputStream ( "mykeystore" ), passw );

        KeyManagerFactory kmf = KeyManagerFactory.getInstance("SunX509");
        kmf.init(ks, passw);

        TrustManagerFactory tmf = TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
        tmf.init(ks);
        TrustManager[] tm = tmf.getTrustManagers();

        SSLContext sclx = SSLContext.getInstance("TLS");
        sclx.init( kmf.getKeyManagers(), tm, null);

        HostnameVerifier hv = new HostnameVerifier()
        {
            public boolean verify(String urlHostName, SSLSession session)
            {
                if (!urlHostName.equalsIgnoreCase(session.getPeerHost()))
                {
                    System.out.println("Warning: URL host '" + urlHostName + "' is different to SSLSession host '" + session.getPeerHost() + "'.");
                }
                return true;
            }
        };

        HttpsURLConnection.setDefaultSSLSocketFactory( sclx.getSocketFactory() );
        HttpsURLConnection.setDefaultHostnameVerifier(hv);

मैंने http://code.google.com/p/java-keyutil/ विकसित किया है जो सीधे जावा कीस्टोर में पीईएम प्रमाण पत्र आयात करता है। इसका प्राथमिक उद्देश्य सीए-बंडल.crt जैसे बहु-भाग पीईएम ऑपरेटिंग सिस्टम सर्टिफिकेट बंडल आयात करना है। इनमें अक्सर हेडर शामिल होते हैं जो किटूओल संभाल नहीं सकता है

</self promotion>

यदि आप केवल एक केमस्टोर में पीईएम प्रारूप में प्रमाणपत्र आयात करना चाहते हैं, तो कीटोल नौकरी करेगा:

keytool -import -alias *alias* -keystore cacerts -file *cert.pem*

सबसे पहले, अपने प्रमाणपत्र को एक डीईआर प्रारूप में रूपांतरित करें:

openssl x509 -outform der -in certificate.pem -out certificate.der

और उसके बाद, इसे कीस्टोर में आयात करें:

keytool -import -alias your-alias -keystore cacerts -file certificate.der






apache-mina