এসএসএলে ব্যবহার করতে জাভা কীস্টোরের একটি বিদ্যমান X.509 শংসাপত্র এবং ব্যক্তিগত কী কীভাবে আমদানি করবেন?


228

আমার এটি একটি অ্যাক্টিভিউকিউ কনফিগারেশনে রয়েছে:

<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
এটি করার জন্য আপনাকে আসলে কিছুটা কোড লিখতে হবে এবং বিশদটি আপনি যে ব্যক্তিগত কী আমদানির চেষ্টা করছেন তার ফর্ম্যাটের উপর নির্ভর করে। আপনার কী কী ফর্ম্যাট? আপনার কাছে কী এবং শংসাপত্র তৈরি করার জন্য আপনি কী কী সরঞ্জাম ব্যবহার করেছেন তা আপনি ব্যাখ্যা করতে পারেন?
ইরিকসন

স্প্রিং বুট সঙ্গে দ্বি-মুখী অবশ্যই SSL (ক্লায়েন্ট এবং সার্ভার শংসাপত্র) দেখুন stackoverflow.com/a/59317888/548473
গ্রেগরি Kislin

উত্তর:


73

বিশ্বাস করুন বা না করুন, কীটল কীস্টোরে ব্যক্তিগত কী আমদানির মতো প্রাথমিক কার্যকারিতা সরবরাহ করে না। আপনি কী স্টোরে প্রাইভেট কী দিয়ে পিকেএসসি 12 ফাইলটি মার্জ করে এই কাজের চেষ্টা করতে পারেন ।

অথবা কীটোল.এক্সির পরিবর্তে কীস্টোর হ্যান্ডলিংয়ের জন্য আইবিএম থেকে আরও ব্যবহারকারী-বান্ধব কীম্যান ব্যবহার করুন।


11
CoverosGene এর উত্তর keytool এটা জাভা 6. এই যেহেতু সমর্থন অনুযায়ী লিংক তিনি প্রদান করা
Houtman

এই বিষয়টির সমস্ত শব্দটির জন্য এটি মূল্যবান, এর জন্য সেরা লিঙ্কটি হ'ল ২০০ M
মেঘসুরফিন

2
আমি CoverosGene দ্বারা প্রদত্ত উত্তর অনুসরণ করেছি এবং এটি কার্যকর হয়েছে।
রবার্ট 3452

1
কীমান আমার কাছে সমস্ত ব্যবহারকারী-বান্ধব বলে মনে হয় না।
দুর্বৃত্ত

15
ছিন্ন সুত্র. দয়া করে সরাসরি উত্তরের মধ্যে সমাধানের বিশদটি অন্তর্ভুক্ত করুন :-(
লিল্লিনাক্স

536

অন্যান্য উত্তরগুলিতে লিঙ্কিত মন্তব্য / পোস্টগুলিতে আমি নিম্নলিখিত দুটি পদক্ষেপ ব্যবহার করেছি:

প্রথম ধাপ: x.509 সার্ট এবং কীটিকে একটি পিকেসিএস 12 ফাইলে রূপান্তর করুন

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
আপনি পি 12 ফাইলে একটি পাসওয়ার্ড রেখেছেন তা নিশ্চিত করুন - অন্যথায় আপনি এটি আমদানির চেষ্টা করার সময় একটি নাল রেফারেন্স ব্যতিক্রম পাবেন। (অন্য কারও ক্ষেত্রেও এই মাথা ব্যাথা থাকলে)
জোকুল

9
আমার ক্ষেত্রে এক পর্যায়ে বিকল্পটি -CAfile ca.crt -caname rootসিএ শংসাপত্রগুলি সঠিকভাবে আউটপুট দেয় না। পরিবর্তে আমি ব্যবহার করেছি-certfile concatenedCAFiles.pem
dcernahoschi

11
আপনি -chainযদি আপনার কী স্টোরে চান তবে আপনার পিএফএক্স / পি 12 ফাইলে সম্পূর্ণ শংসাপত্র শৃঙ্খলা অন্তর্ভুক্ত করতে ওপেনসেল দিয়ে যুক্তিটি ব্যবহার করতে ভুলবেন না ।
মাফুবা

3
উইন্ডোজ পরিবেশ, ইন pvk2pfx(একটি প্রমিত বনাম টুল বনাম পাওয়া cmdপ্রম্পট) একটি থুতু হবে .pfxএকটি থেকে --equivalent .p12। @ জোকলের পরামর্শ এখনও প্রাসঙ্গিক; এটি একটি পাসওয়ার্ড রাখুন। opensslদরকার নেই ।
বেন মোশার

9
টমকাটের জন্য বিশেষত এটি প্রয়োজনীয় যে কীস্টোর এবং কী পাসওয়ার্ড একই রকম। আপনি যখন .p12কোনও কীটি আমদানি করবেন তখন মূল .p12.টমকেটের পাসওয়ার্ডটি ব্যর্থ হবে java.security.UnrecoverableKeyException: Cannot recover key। অন্য কথায়: আপনি চালানো প্রয়োজন -deststorepass changeit -srcstorepass some-passwordসঙ্গে বিভিন্ন পাসওয়ার্ড, তারপর আপনি আবশ্যক অন্তর্ভুক্ত -destkeypass changeit(হিসাবে একই পাসওয়ার্ড দিয়ে -deststorepass)
Slav

127

জাভা 6-তে কীটোলের এই ক্ষমতা রয়েছে: কীটোল ব্যবহার করে একটি জাভা কীস্টোরের ব্যক্তিগত কীগুলি আমদানি করা

এখানে সেই পোস্ট থেকে প্রাথমিক বিবরণ দেওয়া হল।

  1. ওপেনএসএসএল ব্যবহার করে বিদ্যমান সার্টটিকে একটি পিকেসিএস 12 এ রূপান্তর করুন। জিজ্ঞাসা করা হলে একটি পাসওয়ার্ড প্রয়োজন বা দ্বিতীয় পদক্ষেপটি অভিযোগ করবে।

    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. পিকেসিএস 12 কে একটি জাভা কীস্টোর ফাইলে রূপান্তর করুন।

    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
@ মাফুবা দ্বারা বর্ণিত হিসাবে, আপনাকে এখনও ওপেনসেলের মতো জাভা-বিহীন সরঞ্জাম সহ একটি পৃথক পিকেসিএস 12 কীস্টোর তৈরি করতে হবে - তবে এটি রাইটো দ্বারা উত্তরে বর্ণিত হিসাবে কীটল দ্বারা একটি জ্যাক্স স্টোরে আমদানি করা যেতে পারে।
মিস্টার_তম

একটি জিনিস যা এটির ভাল উত্তর দেয় তা হ'ল ইনপুট সার্টিটি স্পষ্টভাবে বন্ধনীগুলিতে নির্দিষ্ট করা আছে।
মিঃ বুদ্রিস

FWIW, প্রথম ধাপের আউটপুটটি ইতিমধ্যে একটি জাভা কীস্টোর হিসাবে ব্যবহারযোগ্য হওয়া উচিত (সুতরাং আপনার বিদ্যমান কীস্টোরের মধ্যে সার্টি + কীটি আমদানির প্রয়োজন না হলে ) - দ্বিতীয় ধাপে জ্যাকো064646 এর পূর্ববর্তী উত্তরে আগেই উল্লেখ করা হয়েছে
জনক বান্দারা

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

প্রথমে পি 12 তে রূপান্তর করুন:

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

পি 12 থেকে নতুন জে কেএস তৈরি করুন:

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

8

হ্যাঁ, এটি সত্যই দুঃখজনক সত্য যে কীটোলের কোনও ব্যক্তিগত কী আমদানি করার কোনও কার্যকারিতা নেই।

রেকর্ডের জন্য, শেষে আমি এখানে বর্ণিত সমাধানটি দিয়েছিলাম


6

আমার ক্ষেত্রে আমার কাছে একটি পেম ফাইল ছিল যা পারস্পরিক এসএসএল প্রমাণীকরণে ব্যবহার করার জন্য দুটি শংসাপত্র এবং একটি এনক্রিপ্ট করা ব্যক্তিগত কী রয়েছে। সুতরাং আমার পেম ফাইলটি দেখতে এমন দেখাচ্ছে:

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

আমি যা করেছি তা এখানে:

তিনটি পৃথক ফাইলে ফাইলটি বিভক্ত করুন, যাতে প্রতিটি "--- শুরু করুন .." দিয়ে শুরু হয়ে "--- শেষ .." লাইন দিয়ে শেষ করে প্রতিটিকে একটি করে প্রবেশ থাকে। ধরে নেওয়া যাক আমাদের এখন তিনটি ফাইল রয়েছে: cert1.pem cert2.pem এবং pkey.pem

ওপেনসেল এবং নিম্নলিখিত সিনট্যাক্স ব্যবহার করে 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());

(alচ্ছিক) আপনার নতুন কী স্টোরের সামগ্রীটি যাচাই করুন:

keytool -list -keystore mykeystore -storepass password

কীস্টোরের ধরণ: জে কেএস কীস্টোর সরবরাহকারী: সান

আপনার কীস্টোরে 3 টি এন্ট্রি রয়েছে

সিএন = ..., আউ = ..., ও = .., ২ সেপ্টেম্বর, 2014, বিশ্বস্ত ক্যারেন্টেণ্ট্রি, শংসাপত্রের ফিঙ্গারপ্রিন্ট (এসএএএ 1): 2 সি: বি 8: ...

আমদানি, সেপ্টেম্বর 2, 2014, প্রাইভেটকিএন্ট্রি, শংসাপত্রের ফিঙ্গারপ্রিন্ট (SHA1): 9 সি: বি 0: ...

সিএন = ..., ও = ...., সেপ্টেম্বর 2, 2014, বিশ্বস্তকার্টেনট্রি, শংসাপত্রের ফিঙ্গারপ্রিন্ট (SHA1): 83:63: ...

(alচ্ছিক) আপনার এসএসএল সার্ভারের বিপরীতে আপনার নতুন কী স্টোর থেকে আপনার শংসাপত্র এবং ব্যক্তিগত কী পরীক্ষা করুন: (আপনি ভিএম বিকল্প হিসাবে ডিবাগিং সক্ষম করতে চাইতে পারেন: -জাজাক্সটনেস.দেবগ = সব)

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

অবশেষে আপনার শংসাপত্রগুলি HTTPURL সংযোগের সাথে নিবন্ধন করুন যদি এটি ব্যবহার করার পরিকল্পনা করা হয়:

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

তবে ব্রুনো উল্লেখ করেছেন যে এই হোস্টনাম যাচাইকারীটি ভুল: "আপনার হোস্টনাম ভেরিফায়ারটি ভুল, সেশন.গেটপির হস্ট () শংসাপত্রে নামটি ফিরিয়ে দেয় না, তবে যে নামটির সাথে আপনি সংযুক্ত ছিলেন (অর্থাত্ urlHostName এখানে রয়েছে), তাই সর্বদা চলতে চলেছে সত্য হতে। আপনি সর্বদা যাইহোক সত্যই ফিরে আসছেন - ব্রুনো "o যদিও এটি আমার পক্ষে কাজ করেছে, তবে আমি যদি কোনও ভাল হোস্ট নেম ভেরিফায়ার কীভাবে লিখতে হয় তা যদি কেউ আমাকে দেখায় তবে আমি প্রশংসা করব।
ইন্টারকোট

1
অবশ্যই এটি আপনার পক্ষে "কাজ" করবে, যেহেতু এটি কখনই ত্রুটি তৈরি করে না, এমনকি যখন এটি হওয়া উচিত। HttpsURLConnectionআপনার নিজের লেখার চেষ্টা না করে ব্যবহার করা ডিফল্ট হোস্টনাম যাচাইকারী ছেড়ে দিন । (আপনার উদাহরণের সাথে আর একটি সমস্যা হ'ল আপনি একই কীস্টোরটি কীস্টোর এবং ট্রস্টস্টোর হিসাবে ব্যবহার করছেন যা সর্বদা ভাল ধারণা নয় ...)
ব্রুনো

6

চলুন এনক্রিপ্ট শংসাপত্রগুলি ব্যবহার করে

ধরে নেওয়া যাক আপনি এর শংসাপত্র এবং ব্যক্তিগত কীগুলি এর চলুন এনক্রিপ্ট দিয়ে তৈরি করেছেন /etc/letsencrypt/live/you.com:

1. একটি পিকেসিএস # 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 এর ফাইল বদলে তৈরি করা হবে পার্স (থেকে ম্যানুয়াল )।

২. জাভা কীস্টোরটি তৈরি করুন

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

যদি keystore.jksবিদ্যমান না থাকে তবে এটি pkcs.12উপরে তৈরি ফাইল যুক্ত তৈরি করা হবে। অন্যথায়, আপনি pkcs.12বিদ্যমান কীস্টোরে আমদানি করবেন ।


এই নির্দেশাবলী এই ব্লগ পোস্ট থেকে প্রাপ্ত ।

এখানে বিভিন্ন ধরণের ফাইলের আরও রয়েছে /etc/letsencrypt/live/you.com/


5

উপরের উত্তরের উপর ভিত্তি করে, কীটল ব্যবহার করে একটি স্বতন্ত্রভাবে তৈরি কমোডো সার্টি এবং ব্যক্তিগত কী (আপনার জেডিকে 1.6+ প্রয়োজন) এর বাইরে আপনার জাভা ভিত্তিক ওয়েব সার্ভারের জন্য কীভাবে একটি নতুন কীস্টোর তৈরি করবেন তা এখানে রয়েছে is

  1. এই কমান্ডটি জারি করুন এবং পাসওয়ার্ড প্রম্পটে কোনও পাসওয়ার্ড প্রবেশ করুন - 'সার্ভার.সিআরটি' হ'ল আপনার সার্ভারের শংসাপত্র এবং 'সার্ভার.কি' আপনি সিএসআর জারির জন্য ব্যবহৃত ব্যক্তিগত কী: 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. তারপরে পি 12 কীস্টোরকে জিক্স কীস্টোরে রূপান্তর করতে কীটোল ব্যবহার করুন: 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. COMODORSADomainVinnationSecureServerCA.crt আমদানি করুন: keytool -import -trustcacerts -alias cert2 -file COMODORSADomainValidationSecureServerCA.crt -keystore keystore.jks


4

বিদ্যমান কীস্টোরটিতে কীটি আমদানি করতে আপনি এই পদক্ষেপগুলি ব্যবহার করতে পারেন। এই থ্রেড এবং অন্যান্য সাইটের উত্তর থেকে নির্দেশাবলী একত্রিত করা হয়েছে। এই নির্দেশাবলী আমার জন্য কাজ করেছে (জাভা কীস্টোর):

  1. চালান

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

(প্রয়োজনে -চেন বিকল্পটি রাখুন put এটি আমার পক্ষে ব্যর্থ হয়েছে)। এটি পাসওয়ার্ড জানতে চাইবে - আপনাকে অবশ্যই সঠিক পাসওয়ার্ড দিতে হবে অন্যথায় আপনি একটি ত্রুটি পাবেন (শিরোনাম ত্রুটি বা প্যাডিং ত্রুটি ইত্যাদি) etc

  1. এটি আপনাকে একটি নতুন পাসওয়ার্ড লিখতে বলবে - আপনাকে অবশ্যই এখানে একটি পাসওয়ার্ড লিখতে হবে - কিছু লিখুন তবে মনে রাখবেন। (আমাদের ধরে নেওয়া যাক আপনি আরোগর্নটিতে প্রবেশ করেছেন)।
  2. এটি pkcs ফর্ম্যাটে সার্ভার.p12 ফাইল তৈরি করবে।
  3. এখন *.jksফাইল চালাতে এটি আমদানি করতে :
    keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore yourexistingjavakeystore.jks -deststoretype JKS -deststorepass existingjavastorepassword -destkeypass existingjavastorepassword
    (খুব গুরুত্বপূর্ণ - ডেসটোরপাস এবং ড্যাটকেপাস প্যারামিটারগুলি ছেড়ে যাবেন না))
  4. এটি আপনাকে src কী স্টোরের পাসওয়ার্ডের জন্য জিজ্ঞাসা করবে। অ্যারাগর্ন লিখুন এবং এন্টার চাপুন। শংসাপত্র এবং কী এখন আপনার বিদ্যমান জাভা কীস্টোরে আমদানি করা হয়েছে।

3

পূর্ববর্তী উত্তরগুলি সঠিকভাবে নির্দেশ করে যে আপনি প্রথমে JKS ফাইলটিকে পিকেসিএস # 12 ফর্ম্যাটে রূপান্তর করে স্ট্যান্ডার্ড জেডিকে সরঞ্জামগুলির সাহায্যে এটি করতে পারেন। আপনি যদি আগ্রহী হন তবে আমি প্রথমে কীস্টোরটিকে পিকেসিএস # 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

আপনার যদি পিএম ফাইল থাকে (যেমন server.pem) এতে:

  • বিশ্বস্ত শংসাপত্র
  • ব্যক্তিগত কী

তারপরে আপনি জেকেএস কীস্টোরগুলিতে শংসাপত্র এবং কীটি আমদানি করতে পারেন:

1 ) পিইএম ফাইল থেকে প্রাইভেট কীটি একটি আসকি ফাইলটিতে অনুলিপি করুন (উদাঃ)server.key )

) পিইএম ফাইল থেকে সার্টিফিকেটটি একটি আস্কি ফাইলটিতে অনুলিপি করুন (যেমনserver.crt )

3 ) একটি সার্টিফিকেট এবং কী একটি PKCS12 ফাইলে রফতানি করুন:

$ openssl pkcs12 -export -in server.crt -inkey server.key \
                 -out server.p12 -name [some-alias] -CAfile server.pem -caname root
  • পিইএম ফাইলটি -CAfileবিকল্পের আর্গুমেন্ট হিসাবে ব্যবহার করা যেতে পারে
  • আপনাকে একটি 'এক্সপোর্ট' পাসওয়ার্ডের জন্য অনুরোধ জানানো হবে।
  • যদি এটি গিট ব্যাশে করে থাকে তবে winptyকমান্ডের শুরুতে যুক্ত করুন যাতে এক্সপোর্ট পাসওয়ার্ড প্রবেশ করা যায়।

4 ) পিকেসিএস 12 ফাইলটি জেকেএস কীস্টোরে রূপান্তর করুন:

$ keytool -importkeystore -deststorepass changeit -destkeypass changeit \
          -destkeystore keystore.jks  -srckeystore server.p12 -srcstoretype PKCS12 \
          -srcstorepass changeit
  • srcstorepassপাসওয়ার্ড ধাপ 3 থেকে রপ্তানি পাসওয়ার্ড মেলে উচিত)

3

আমি যেটি অর্জন করার চেষ্টা করছিলাম সেটি হ'ল ইতিমধ্যে প্রদত্ত ব্যক্তিগত কী এবং শংসাপত্রটি বার্তায় স্বাক্ষর করার জন্য যা কোনও জায়গায় চলেছিল যা বার্তাটি আমার কাছ থেকে আসছে তা নিশ্চিত হওয়া দরকার (পাবলিক কীগুলি এনক্রিপ্ট করার সময় ব্যক্তিগত কী সাইন)।

সুতরাং আপনার যদি ইতিমধ্যে একটি .key ফাইল এবং একটি .crt ফাইল থাকে?

এটা চেষ্টা কর:

পদক্ষেপ 1: কী রূপান্তর করুন এবং .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: বেস 64 এনকোড করা ব্যক্তিগত কী পান

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. এসএসএলে ব্যবহার করতে জাভা কীস্টোরের একটি বিদ্যমান 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

কেবল একটি পিকেসিএস 12 কীস্টোর তৈরি করুন, জাভা এখনই এটি সরাসরি ব্যবহার করতে পারে। প্রকৃতপক্ষে, আপনি যদি জাভা-স্টাইলের কীস্টোর তালিকাভুক্ত করেন তবে কীটোল নিজেই আপনাকে এই সতর্ক করে দেয় যে পিকেসিএস 12 এখন পছন্দসই ফর্ম্যাট।

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

আপনার শংসাপত্র সরবরাহকারীর কাছ থেকে আপনার তিনটি ফাইলই (সার্ভার। সিআরটি, সার্ভার.কি, সিএসিআরটি) পাওয়া উচিত ছিল। "-কেনাম মূল" বলতে আসলে কী বোঝায় তা আমি নিশ্চিত নই, তবে মনে হয় এটি সেভাবে নির্দিষ্ট করা উচিত।

জাভা কোডে সঠিক কীস্টোরের ধরণটি নির্দিষ্ট করে দেওয়ার বিষয়টি নিশ্চিত করুন।

KeyStore.getInstance("PKCS12")

আমি আমার কমোডো ডট কম-ইস্যু করা এসএসএল শংসাপত্রটি NanoHTTPD এ এইভাবে কাজ করে।


0

উপবৃত্তাকার কার্ভের ক্ষেত্রে এবং জাভা কীস্টোরের একটি বিদ্যমান x509 শংসাপত্র এবং প্রাইভেট কী আমদানির প্রশ্নের উত্তর দিন , আপনি জাভাতে ইসি প্রাইভেট কী কীভাবে পড়তে পারেন এটি .pem ফাইলের ফর্ম্যাটে আছে কীভাবে পড়তে হবে

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.