SSL में उपयोग करने के लिए एक मौजूदा X.509 प्रमाणपत्र और जावा कीस्टोर में निजी कुंजी का आयात कैसे करें?


228

मैं एक ActiveMQ कॉन्फ़िगरेशन में यह है:

<sslContext>
        <sslContext keyStore="file:/home/alex/work/amq/broker.ks"  
 keyStorePassword="password" trustStore="file:${activemq.base}/conf/broker.ts" 
 trustStorePassword="password"/>
</sslContext>

मेरे पास X.509 सर्टिफिकेट और एक मुख्य फाइल है।

एसएसएल और एसएसएल + स्टॉम्प कनेक्टर में उनका उपयोग करने के लिए मैं उन दोनों को कैसे आयात करूं? सभी उदाहरण मैं हमेशा कुंजी स्वयं उत्पन्न कर सकता हूँ, लेकिन मेरे पास पहले से ही एक कुंजी है।

मैंने कोशिश की है

keytool -import  -keystore ./broker.ks -file mycert.crt

लेकिन यह केवल प्रमाण पत्र को आयात करता है न कि कुंजी फ़ाइल को और परिणाम में

2009-05-25 13:16:24,270 [localhost:61612] ERROR TransportConnector - Could not accept connection : No available certificate or key corresponds to the SSL cipher suites which are enabled.

मैंने सर्टिफिकेट और की को समेटने की कोशिश की है, लेकिन उसी का परिणाम मिला है।

मैं कुंजी कैसे आयात करूं?


1
आपको वास्तव में ऐसा करने के लिए थोड़ा कोड लिखना होगा, और विवरण उस निजी कुंजी के प्रारूप पर निर्भर करता है जिसे आप आयात करने का प्रयास कर रहे हैं। आपकी कुंजी किस प्रारूप में है? क्या आप बता सकते हैं कि आपके पास कुंजी और प्रमाणपत्र बनाने के लिए आपके पास कौन से उपकरण थे?
'15:

स्प्रिंग बूट के साथ टू-वे एसएसएल (क्लाइंट और सर्वर सर्टिफिकेट) के लिए देखें stackoverflow.com/a/59317888/548473
ग्रिगोरी किसलिन

जवाबों:


73

मानो या न मानो, कीलेट ऐसी बुनियादी कार्यक्षमता प्रदान नहीं करता है जैसे कि कीस्टोर को निजी कुंजी आयात करना। आप इस कोशिश कर सकते हैं वैकल्पिक हल एक कीस्ट्रोक को निजी कुंजी के साथ PKSC12 फ़ाइल को मर्ज करने में।

या बस keytool.exe के बजाय keystore हैंडलिंग के लिए IBM से अधिक उपयोगकर्ता के अनुकूल KeyMan का उपयोग करें।


11
कवरोसजेन के जवाब के अनुसार, कीटलूल जावा 6 के बाद से इसका समर्थन करता है। यह वह लिंक है जो उसने प्रदान की है
हटनमैन

इस विषय पर सभी
शोरों के

2
मैंने CoverosGene द्वारा दिए गए उत्तर का पालन किया और इसने काम किया।
रॉबर्ट3452

1
कीमैन को वह सब नहीं लगता जो मेरे लिए उपयोगकर्ता के अनुकूल है।
Miscreant

15
टूटी हुई कड़ी। कृपया समाधान के विवरण को सीधे उत्तर में शामिल करें :-(
lilalinux

536

मैंने निम्नलिखित दो चरणों का उपयोग किया जो मुझे अन्य उत्तरों में जुड़ी टिप्पणियों / पोस्टों में मिले:

एक कदम: एक pkcs12 फ़ाइल के लिए x.509 प्रमाणपत्र और कुंजी कन्वर्ट करें

openssl pkcs12 -export -in server.crt -inkey server.key \
               -out server.p12 -name [some-alias] \
               -CAfile ca.crt -caname root

नोट: सुनिश्चित करें कि आपने pkcs12 फ़ाइल पर एक पासवर्ड डाला है - अन्यथा जब आप इसे आयात करने का प्रयास करेंगे तो आपको एक शून्य सूचक अपवाद मिलेगा। (मामले में किसी और को यह सिरदर्द था)। ( धन्यवाद जोकुल! )

नोट 2: आप -chainपूर्ण प्रमाणपत्र श्रृंखला को संरक्षित करने के लिए विकल्प जोड़ना चाह सकते हैं । ( धन्यवाद मफुबा )

चरण दो: pkcs12 फ़ाइल को जावा कीस्टोर में कनवर्ट करें

keytool -importkeystore \
        -deststorepass [changeit] -destkeypass [changeit] -destkeystore server.keystore \
        -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass some-password \
        -alias [some-alias]

ख़त्म होना

वैकल्पिक चरण शून्य: स्व-हस्ताक्षरित प्रमाणपत्र बनाएं

openssl genrsa -out server.key 2048
openssl req -new -out server.csr -key server.key
openssl x509 -req -days 365 -in server.csr -signkey server.key -out server.crt

चीयर्स!


12
सुनिश्चित करें कि आपने p12 फ़ाइल पर एक पासवर्ड डाला है - अन्यथा जब आप इसे आयात करने का प्रयास करते हैं तो आपको एक शून्य संदर्भ अपवाद मिलेगा। (मामले किसी में भी इस सिर दर्द था)
jocull

9
मेरे कदम के मामले में एक विकल्प -CAfile ca.crt -caname rootने CA प्रमाणपत्रों को सही ढंग से आउटपुट नहीं किया। इसके बजाय मैंने इस्तेमाल किया-certfile concatenedCAFiles.pem
dcernahoschi

11
-chainयदि आप अपने कुंजी स्टोर में चाहते हैं कि पूर्ण pfx / p12 फ़ाइल में पूर्ण प्रमाणपत्र श्रृंखला को शामिल करने के लिए ओपनसिएल के साथ तर्क का उपयोग करना न भूलें ।
मफुबा

3
एक विंडोज वातावरण में, pvk2pfx(वीएस cmdप्रॉम्प्ट में उपलब्ध एक मानक वीएस टूल ) एक - .pfxअसमान को थूक देगा .p12। @ जोकल की सलाह अभी भी प्रासंगिक है; इस पर एक पासवर्ड डालें। कोई opensslजरूरत नहीं ।
बेन मोशेर

9
टॉम्कट के लिए विशेष रूप से यह जरूरी है कि कीस्टर और कुंजी पासवर्ड समान हों। जब आप एक .p12कुंजी आयात करते हैं , तो कुंजी के साथ मूल .p12.टॉमकैट का पासवर्ड विफल हो जाएगा java.security.UnrecoverableKeyException: Cannot recover key। दूसरे शब्दों में: यदि आपको अलग-अलग पासवर्ड के -deststorepass changeit -srcstorepass some-passwordसाथ निष्पादित करने की आवश्यकता है , तो आपको शामिल होना चाहिए (उसी पासवर्ड के साथ )-destkeypass changeit-deststorepass
स्लैव

127

जावा 6 में Keytool में यह क्षमता है: Keytool का उपयोग करके जावा कीस्टोर में निजी कुंजी आयात करना

यहाँ उस पोस्ट से मूल विवरण दिए गए हैं।

  1. OpenSSL का उपयोग करके मौजूदा प्रमाणपत्र को PKCS12 में बदलें। पूछे जाने पर पासवर्ड की आवश्यकता होती है या दूसरा चरण शिकायत करेगा।

    openssl pkcs12 -export -in [my_certificate.crt] -inkey [my_key.key] -out [keystore.p12] -name [new_alias] -CAfile [my_ca_bundle.crt] -caname root
  2. PKCS12 को जावा कीस्टोर फाइल में बदलें।

    keytool -importkeystore -deststorepass [new_keystore_pass] -destkeypass [new_key_pass] -destkeystore [keystore.jks] -srckeystore [keystore.p12] -srcstoretype PKCS12 -srcstorepass [pass_used_in_p12_keystore] -alias [alias_used_in_p12_keystore]

4
@Reto के उत्तर में इस लिंक की सामग्री है।
मफूबा

4
जैसा कि @ मफुबा द्वारा कहा गया है, आपको अभी भी एक अलग pkcs12 कीस्टोरी को गैर-जावा उपकरण जैसे कि ओपनसेल के साथ बनाना होगा - फिर इसे कीटो द्वारा जेक्स स्टोर में आयात किया जा सकता है, जैसा कि रीटो द्वारा उत्तर में कहा गया है।
Mister_Tom

एक बात जो इसे एक अच्छा जवाब बनाती है वह यह है कि कोष्ठक में इनपुट सेर स्पष्ट रूप से निर्दिष्ट हैं।
मि। बूड्रिस 14

एफडब्ल्यूआईडब्ल्यू, चरण 1 का उत्पादन पहले से ही जावा कीस्टोर के रूप में प्रयोग करने योग्य होना चाहिए (इसलिए चरण 2 की आवश्यकता नहीं हो सकती है - जब तक कि आपको किसी मौजूदा कीस्टॉर में सर्टिफिकेट + कुंजी आयात करने की आवश्यकता न हो ) - जैसा कि पहले ही उल्लेख किया गया है - Jaco0646
जनक बंडारा

9

एक और:

#!/bin/bash

# We have:
#
# 1) $KEY : Secret key in PEM format ("-----BEGIN RSA PRIVATE KEY-----") 
# 2) $LEAFCERT : Certificate for secret key obtained from some
#    certification outfit, also in PEM format ("-----BEGIN CERTIFICATE-----")   
# 3) $CHAINCERT : Intermediate certificate linking $LEAFCERT to a trusted
#    Self-Signed Root CA Certificate 
#
# We want to create a fresh Java "keystore" $TARGET_KEYSTORE with the
# password $TARGET_STOREPW, to be used by Tomcat for HTTPS Connector.
#
# The keystore must contain: $KEY, $LEAFCERT, $CHAINCERT
# The Self-Signed Root CA Certificate is obtained by Tomcat from the
# JDK's truststore in /etc/pki/java/cacerts

# The non-APR HTTPS connector (APR uses OpenSSL-like configuration, much
# easier than this) in server.xml looks like this 
# (See: https://tomcat.apache.org/tomcat-6.0-doc/ssl-howto.html):
#
#  <Connector port="8443" protocol="org.apache.coyote.http11.Http11Protocol"
#                SSLEnabled="true"
#                maxThreads="150" scheme="https" secure="true"
#                clientAuth="false" sslProtocol="TLS"
#                keystoreFile="/etc/tomcat6/etl-web.keystore.jks"
#                keystorePass="changeit" />
#

# Let's roll:    

TARGET_KEYSTORE=/etc/tomcat6/foo-server.keystore.jks
TARGET_STOREPW=changeit

TLS=/etc/pki/tls

KEY=$TLS/private/httpd/foo-server.example.com.key
LEAFCERT=$TLS/certs/httpd/foo-server.example.com.pem
CHAINCERT=$TLS/certs/httpd/chain.cert.pem

# ----
# Create PKCS#12 file to import using keytool later
# ----

# From https://www.sslshopper.com/ssl-converter.html:
# The PKCS#12 or PFX format is a binary format for storing the server certificate,
# any intermediate certificates, and the private key in one encryptable file. PFX
# files usually have extensions such as .pfx and .p12. PFX files are typically used 
# on Windows machines to import and export certificates and private keys.

TMPPW=$$ # Some random password

PKCS12FILE=`mktemp`

if [[ $? != 0 ]]; then
  echo "Creation of temporary PKCS12 file failed -- exiting" >&2; exit 1
fi

TRANSITFILE=`mktemp`

if [[ $? != 0 ]]; then
  echo "Creation of temporary transit file failed -- exiting" >&2; exit 1
fi

cat "$KEY" "$LEAFCERT" > "$TRANSITFILE"

openssl pkcs12 -export -passout "pass:$TMPPW" -in "$TRANSITFILE" -name etl-web > "$PKCS12FILE"

/bin/rm "$TRANSITFILE"

# Print out result for fun! Bug in doc (I think): "-pass " arg does not work, need "-passin"

openssl pkcs12 -passin "pass:$TMPPW" -passout "pass:$TMPPW" -in "$PKCS12FILE" -info

# ----
# Import contents of PKCS12FILE into a Java keystore. WTF, Sun, what were you thinking?
# ----

if [[ -f "$TARGET_KEYSTORE" ]]; then
  /bin/rm "$TARGET_KEYSTORE"
fi

keytool -importkeystore \
   -deststorepass  "$TARGET_STOREPW" \
   -destkeypass    "$TARGET_STOREPW" \
   -destkeystore   "$TARGET_KEYSTORE" \
   -srckeystore    "$PKCS12FILE" \
   -srcstoretype  PKCS12 \
   -srcstorepass  "$TMPPW" \
   -alias foo-the-server

/bin/rm "$PKCS12FILE"

# ----
# Import the chain certificate. This works empirically, it is not at all clear from the doc whether this is correct
# ----

echo "Importing chain"

TT=-trustcacerts

keytool -import $TT -storepass "$TARGET_STOREPW" -file "$CHAINCERT" -keystore "$TARGET_KEYSTORE" -alias chain

# ----
# Print contents
# ----

echo "Listing result"

keytool -list -storepass "$TARGET_STOREPW" -keystore "$TARGET_KEYSTORE"

9

पहले p12 में कनवर्ट करें:

openssl pkcs12 -export -in [filename-certificate] -inkey [filename-key] -name [host] -out [filename-new-PKCS-12.p12]

P12 से नया JKS बनाएँ:

keytool -importkeystore -deststorepass [password] -destkeystore [filename-new-keystore.jks] -srckeystore [filename-new-PKCS-12.p12] -srcstoretype PKCS12

8

हां, यह वास्तव में एक दुखद तथ्य है कि कीटल के पास निजी कुंजी आयात करने की कोई कार्यक्षमता नहीं है।

रिकॉर्ड के लिए, अंत में मैं यहां वर्णित समाधान के साथ गया था


6

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

-----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

Opensl और निम्न सिंटैक्स का उपयोग करके pkey.pem को DER प्रारूप में परिवर्तित करें:

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

ध्यान दें, यदि निजी कुंजी एन्क्रिप्ट की गई है, तो आपको डीईआर प्रारूप में परिवर्तित करने के लिए एक पासवर्ड (मूल पीईएम फ़ाइल के आपूर्तिकर्ता से प्राप्त करें) की आवश्यकता है, इस तरह से पासवर्ड आपसे पासवर्ड के लिए पूछेगा: "पेक के लिए एक पास वाक्यांश दर्ज करें .pem: "यदि रूपांतरण सफल होता है, तो आपको" 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 प्रविष्टियाँ हैं

cn = ..., ou = ..., o = .., 2 सितंबर 2014, TrustCertEntry, प्रमाणपत्र फिंगरप्रिंट (SHA1): 2C: B8: ...

importkey, Sep 2, 2014, PrivateKeyEntry, प्रमाणपत्र फिंगरप्रिंट (SHA1): 9C: B0: ...

cn = ..., o = ...., Sep 2, 2014, TrustCertEntry, प्रमाणपत्र फिंगरप्रिंट (SHA1): 83,63: ...

(वैकल्पिक) अपने एसएसएल सर्वर के खिलाफ अपने नए कुंजी स्टोर से अपने प्रमाण पत्र और निजी कुंजी का परीक्षण करें: (आप VM विकल्प के रूप में डिबगिंग सक्षम करना चाहते हैं: -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);

हालांकि, ब्रूनो ने उल्लेख किया कि यह होस्टनाम सत्यापनकर्ता गलत है: "आपका होस्टनाम सत्यापनकर्ता गलत है, session.getPeerHost () प्रमाण पत्र में नाम वापस नहीं करता है, लेकिन आपके साथ जुड़ा हुआ नाम (यानी यहां urlHostName) है, इसलिए वह हमेशा जा रहा है सच कहो। तुम हमेशा वैसे भी सच लौटा रहे हो। - ब्रूनो "। हालांकि यह मेरे लिए काम करता था, लेकिन मैं सराहना करता हूं कि अगर कोई मुझे दिखाता है कि एक अच्छा होस्ट नाम वेरिफायर कैसे लिखा जाए।
इंटरकोट

1
बेशक, यह आपके लिए "काम" करेगा, क्योंकि यह कभी भी एक त्रुटि पैदा नहीं करेगा, भले ही इसे करना चाहिए। HttpsURLConnectionअपने स्वयं के लिखने के प्रयास के बजाय डिफ़ॉल्ट होस्टनाम सत्यापनकर्ता का उपयोग करें। (आपके उदाहरण के साथ एक और समस्या यह है कि आप एक ही कीस्टोर को कीस्टोर और एक ट्रस्टस्टोर के रूप में उपयोग कर रहे हैं, जो हमेशा एक अच्छा विचार नहीं है ...)
ब्रूनो

6

प्रमाणपत्रों को एन्क्रिप्ट करें का उपयोग करना

मान लें कि आप के साथ अपने प्रमाणपत्र और निजी कुंजी बनाने के बाद आइए एन्क्रिप्ट में /etc/letsencrypt/live/you.com:

1. एक PKCS # 12 फ़ाइल बनाएँ

openssl pkcs12 -export -in fullchain.pem -inkey privkey.pem -out pkcs.p12 \
        -name letsencrypt

यह मेल नहीं खाता को जोड़ती है fullchain.pemऔर अपने निजी कुंजी privkey.pemएक एकल फाइल में, pkcs.p12

आपको एक पासवर्ड के लिए संकेत दिया जाएगा pkcs.p12

exportविकल्प निर्दिष्ट करता है कि एक PKCS # 12 फ़ाइल के बजाय बनाया जाएगा पार्स (से मैनुअल )।

2. जावा कीस्टोरी बनाएं

keytool -importkeystore -destkeystore keystore.jks -srckeystore pkcs.p12 \
        -srcstoretype PKCS12 -alias letsencrypt

यदि keystore.jksमौजूद नहीं है, तो यह pkcs.12ऊपर बनाई गई फ़ाइल से बना होगा। अन्यथा, आप pkcs.12मौजूदा कीस्टोर में आयात करेंगे ।


ये निर्देश इस ब्लॉग पोस्ट से लिए गए हैं

यहाँ फ़ाइलों के विभिन्न प्रकार पर अधिक है /etc/letsencrypt/live/you.com/


5

ऊपर दिए गए उत्तरों के आधार पर, यहां बताया गया है कि आपके जावा आधारित वेब सर्वर के लिए एक नया कीस्टॉर कैसे बनाया जाए, एक स्वतंत्र रूप से बनाए गए कोमोडो का उपयोग कर कोमोडो सर्टिफिकेट और निजी कुंजी से (JDK 1.6+ की आवश्यकता है)

  1. यह आदेश जारी करें और पासवर्ड प्रॉम्प्ट में कुछ दर्ज करें - 'server.crt' आपके सर्वर का प्रमाणपत्र है और 'server.key' वह निजी कुंजी है जिसका उपयोग आपने CSR जारी करने के लिए किया था: openssl pkcs12 -export -in server.crt -inkey server.key -out server.p12 -name www.yourdomain.com -CAfile AddTrustExternalCARoot.crt -caname "AddTrust External CA Root"

  2. फिर p12 keystore को jks keystore में बदलने के लिए keytool का उपयोग करें: keytool -importkeystore -deststorepass somepass -destkeypass somepass -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass somepass

फिर कोमोडो से प्राप्त अन्य दो रूट / मध्यवर्ती सीट्स आयात करें:

  1. COMODORSAAddTrustCA.crt आयात करें: keytool -import -trustcacerts -alias cert1 -file COMODORSAAddTrustCA.crt -keystore keystore.jks

  2. COMODORSADomainValidationSecureServerCA.crt आयात करें: keytool -import -trustcacerts -alias cert2 -file COMODORSADomainValidationSecureServerCA.crt -keystore keystore.jks


4

आप मौजूदा कीस्टोर की कुंजी को आयात करने के लिए इन चरणों का उपयोग कर सकते हैं। निर्देश इस थ्रेड और अन्य साइटों में उत्तर से संयुक्त हैं। इन निर्देशों ने मेरे लिए काम किया (जावा कीस्टोर):

  1. Daud

openssl pkcs12 -export -in yourserver.crt -inkey yourkey.key -out server.p12 -name somename -certfile yourca.crt -caname root

(यदि आवश्यक विकल्प डालें -चैन विकल्प। मेरे लिए असफल रहा)। यह पासवर्ड के लिए पूछेगा - आपको सही पासवर्ड देना होगा अन्यथा आपको एक त्रुटि (हेडिंग एरर या पेडिंग त्रुटि आदि) मिलेगी।

  1. यह आपको एक नया पासवर्ड दर्ज करने के लिए कहेगा - आपको यहां एक पासवर्ड दर्ज करना होगा - कुछ भी दर्ज करें लेकिन इसे याद रखें। (हमें मान लें कि आप Aragorn में प्रवेश करते हैं)।
  2. यह pkcs प्रारूप में server.p12 फ़ाइल बनाएगा।
  3. अब इसे *.jksफाइल रन में इम्पोर्ट करना है :
    keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore yourexistingjavakeystore.jks -deststoretype JKS -deststorepass existingjavastorepassword -destkeypass existingjavastorepassword
    (बहुत महत्वपूर्ण - डिस्ट्रॉयरपास और डिस्ट्रिक्ट पैरामीटर को न छोड़ें।)
  4. यह src कुंजी स्टोर पासवर्ड के लिए आपसे पूछेगा। Aragorn और हिट दर्ज करें। प्रमाणपत्र और कुंजी अब आपके मौजूदा जावा कीस्टोर में आयात की गई है।

3

पिछले उत्तर सही ढंग से इंगित करते हैं कि आप केवल JKS फाइल को PKCS # 12 प्रारूप में परिवर्तित करके मानक JDK टूल के साथ ही कर सकते हैं। यदि आप रुचि रखते हैं, तो मैंने ओपन-एसएल-व्युत्पन्न कुंजियों को जेकेएस-स्वरूपित कीस्टोर में केकेस्टोर को पीकेसीएस में बदलने के लिए # 12 पहले: http://commandlinefanatic.com/cgi-bin-showarticle में आयात करने के लिए एक कॉम्पैक्ट उपयोगिता को एक साथ रखा । cgi? लेख = art049

आप इस तरह से जुड़े उपयोगिता का उपयोग करेंगे:

$ openssl req -x509 -newkey rsa:2048 -keyout localhost.key -out localhost.csr -subj "/CN=localhost"

(सीएसआर पर हस्ताक्षर करें, लोकलहोस्ट वापस पाएं।)

$ openssl rsa -in localhost.key -out localhost.rsa
Enter pass phrase for localhost.key:
writing RSA key
$ java -classpath . KeyImport -keyFile localhost.rsa -alias localhost -certificateFile localhost.cer -keystore localhost.jks -keystorePassword changeit -keystoreType JKS -keyPassword changeit

बस अपनी खुद की लाइब्रेरी (या उपयोगिता) से जोड़ना एक अच्छा जवाब नहीं है। इसे लिंक करना, यह बताना कि यह समस्या क्यों हल करता है, ऐसा करने के लिए इसका उपयोग करके कोड प्रदान करना और अस्वीकृति करना बेहतर उत्तर के लिए बनाता है। देखें: मैं समुदाय-हितैषी तरीके से बाहरी संसाधन से कैसे जुड़ सकता हूं?
मोगसाद

यकीन नहीं है कि आप "अस्वीकरण" से क्या मतलब है, लेकिन मैंने एक उदाहरण जोड़ा।
जोशुआ डेविस

महान! यह एक डिब्बाबंद टिप्पणी है, इसलिए भाग लागू नहीं हुआ - अस्वीकरण का अर्थ है कि आप अपने संबद्ध उत्पाद या सेवा से संबद्धता की रिपोर्ट करें, जो आपने "मैंने एक साथ रखी ..." के साथ किया था
मोगादाद

3

यदि आपके पास PEM फ़ाइल है (उदाहरण के लिए server.pem):

  • विश्वसनीय प्रमाण पत्र
  • निजी कुंजी

तब आप प्रमाण पत्र और कुंजी को जेकेएस कीस्टोर में इस तरह से आयात कर सकते हैं:

1 ) PEM फाइल से निजी कुंजी को आस्की फाइल में कॉपी करें (जैसे server.key)

2 ) PEM फ़ाइल से एससीआई फ़ाइल में प्रमाण की प्रतिलिपि बनाएँ (जैसे server.crt)

3 ) एक PKCS12 फ़ाइल में प्रमाणपत्र और कुंजी निर्यात करें:

$ openssl pkcs12 -export -in server.crt -inkey server.key \
                 -out server.p12 -name [some-alias] -CAfile server.pem -caname root
  • PEM फ़ाइल का उपयोग -CAfileविकल्प के तर्क के रूप में किया जा सकता है
  • आपको 'निर्यात' पासवर्ड के लिए संकेत दिया जाता है।
  • अगर यह git bash में कर रहा है तो winptyकमांड के शुरू में जोड़ें ताकि एक्सपोर्ट पासवर्ड डाला जा सके।

4 ) PKCS12 फ़ाइल को JKS कीस्टोर में बदलें:

$ keytool -importkeystore -deststorepass changeit -destkeypass changeit \
          -destkeystore keystore.jks  -srckeystore server.p12 -srcstoretype PKCS12 \
          -srcstorepass changeit
  • srcstorepassपासवर्ड चरण 3 से निर्यात पासवर्ड से मेल खाना चाहिए)

3

जो मैं प्राप्त करने की कोशिश कर रहा था, वह पहले से ही संदेश प्रदान करने के लिए निजी कुंजी और प्रमाण पत्र प्रदान कर रहा था, जो कहीं जा रहा था, यह सुनिश्चित करने के लिए कि संदेश मुझ से आ रहा था (सार्वजनिक कुंजी एन्क्रिप्ट करते समय निजी कुंजी चिह्न)।

तो अगर आपके पास पहले से .key फ़ाइल और .crt फ़ाइल है?

इसे इस्तेमाल करे:

Step1: कुंजी और .p12 फ़ाइल को प्रमाणित करें

openssl pkcs12 -export -in certificate.crt -inkey privateKey.key -name alias -out yourconvertedfile.p12

चरण 2: कुंजी को आयात करें और एक एकल कमांड के साथ एक .jsk फ़ाइल बनाएं

keytool -importkeystore -deststorepass changeit -destkeystore keystore.jks -srckeystore umeme.p12 -srcstoretype PKCS12

चरण 3: आपके जावा में:

char[] keyPassword = "changeit".toCharArray();

KeyStore keyStore = KeyStore.getInstance("JKS");
InputStream keyStoreData = new FileInputStream("keystore.jks");

keyStore.load(keyStoreData, keyPassword);
KeyStore.ProtectionParameter entryPassword = new KeyStore.PasswordProtection(keyPassword);
KeyStore.PrivateKeyEntry privateKeyEntry = (KeyStore.PrivateKeyEntry)keyStore.getEntry("alias", entryPassword);

System.out.println(privateKeyEntry.toString());

यदि आपको इस कुंजी का उपयोग करके कुछ स्ट्रिंग पर हस्ताक्षर करने की आवश्यकता है, तो निम्न कार्य करें:

चरण 1: उस पाठ को कनवर्ट करें जिसे आप एन्क्रिप्ट करना चाहते हैं

byte[] data = "test".getBytes("UTF8");

चरण 2: Base64 एन्कोडेड निजी कुंजी प्राप्त करें

keyStore.load(keyStoreData, keyPassword);

//get cert, pubkey and private key from the store by alias
Certificate cert = keyStore.getCertificate("localhost");
PublicKey publicKey = cert.getPublicKey();
KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);

//sign with this alg
Signature sig = Signature.getInstance("SHA1WithRSA");
sig.initSign(keyPair.getPrivate());
sig.update(data);
byte[] signatureBytes = sig.sign();
System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));

sig.initVerify(keyPair.getPublic());
sig.update(data);

System.out.println(sig.verify(signatureBytes));

संदर्भ:

  1. SSL में उपयोग करने के लिए जावा की -स्टोर में मौजूदा x509 प्रमाणपत्र और निजी कुंजी को कैसे आयात करें?
  2. http://tutorials.jenkov.com/java-cryptography/keystore.html
  3. http://www.java2s.com/Code/Java/Security/RetrievingaKeyPairfromaKeyStore.htm
  4. निजी कुंजी के साथ स्ट्रिंग पर हस्ताक्षर कैसे करें

अंतिम कार्यक्रम

public static void main(String[] args) throws Exception {

    byte[] data = "test".getBytes("UTF8");

    // load keystore
    char[] keyPassword = "changeit".toCharArray();

    KeyStore keyStore = KeyStore.getInstance("JKS");
    //System.getProperty("user.dir") + "" < for a file in particular path 
    InputStream keyStoreData = new FileInputStream("keystore.jks");
    keyStore.load(keyStoreData, keyPassword);

    Key key = keyStore.getKey("localhost", keyPassword);

    Certificate cert = keyStore.getCertificate("localhost");

    PublicKey publicKey = cert.getPublicKey();

    KeyPair keyPair = new KeyPair(publicKey, (PrivateKey) key);

    Signature sig = Signature.getInstance("SHA1WithRSA");

    sig.initSign(keyPair.getPrivate());
    sig.update(data);
    byte[] signatureBytes = sig.sign();
    System.out.println("Signature:" + Base64.getEncoder().encodeToString(signatureBytes));

    sig.initVerify(keyPair.getPublic());
    sig.update(data);

    System.out.println(sig.verify(signatureBytes));
}

1

बस एक PKCS12 कीस्टस्टोर करें, जावा इसे अब सीधे उपयोग कर सकता है। वास्तव में, यदि आप एक जावा-शैली कीस्टोर को सूचीबद्ध करते हैं, तो कीटल खुद आपको इस तथ्य से सचेत करता है कि PKCS12 अब पसंदीदा प्रारूप है।

openssl pkcs12 -export -in server.crt -inkey server.key \
               -out server.p12 -name [some-alias] \
               -CAfile ca.crt -caname root -chain

आपको अपने प्रमाण पत्र प्रदाता से सभी तीन फाइलें (server.crt, server.key, ca.crt) प्राप्त होनी चाहिए। मुझे यकीन नहीं है कि वास्तव में इसका अर्थ क्या है, लेकिन ऐसा लगता है कि इस तरह से निर्दिष्ट किया गया है।

जावा कोड में, सही कीस्टोर प्रकार निर्दिष्ट करना सुनिश्चित करें।

KeyStore.getInstance("PKCS12")

मुझे मेरा comodo.com- जारी किया गया एसएसएल प्रमाणपत्र इस तरह से नैनोहॉटटीपीडी में ठीक काम कर रहा है।


0

अण्डाकार वक्र के एक मामले में और प्रश्न का उत्तर देने के लिए मौजूदा मौजूदा x509 प्रमाण पत्र और जावा कीस्टोर में निजी कुंजी का आयात करें , आप इस थ्रेड पर भी एक नज़र रखना चाह सकते हैं कि जावा में ईसी निजी कुंजी को कैसे पढ़ना है जो .pem फ़ाइल में है।

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