كيفية استيراد القائمة شهادة X. 509 و المفتاح الخاص في جافا keystore إلى استخدام SSL ؟

StackOverflow https://stackoverflow.com/questions/906402

  •  05-09-2019
  •  | 
  •  

سؤال

لدي هذا في شكرا التكوين:

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

لدي زوج من X. 509 cert و ملف مفتاح.

كيف يمكنني استيراد هذين من أجل استخدامها في طبقة المقابس الآمنة SSL+ستومب الموصلات ؟ كل الأمثلة التي يمكنني أن جوجل دائما توليد المفتاح أنفسهم ، ولكن لدي بالفعل الرئيسية.

لقد حاولت

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.

لقد حاولت وصل شهادة و مفتاح ولكن حصلت على نفس النتيجة.

كيف يمكنني استيراد المفتاح ؟

هل كانت مفيدة؟

المحلول

نعتقد أم لا، لا يوفر Keytool وظيفة أساسية مثل استيراد مفتاح خاص إلى Keystore. يمكنك تجربة هذا الحل البديل مع دمج ملف PKSC12 مع مفتاح خاص إلى Keystore.

أو مجرد استخدام أكثر سهلة الاستخدام رئيسي من IBM لمعالجة Keystore بدلا من Keytool.exe.

نصائح أخرى

لقد استخدمت الخطوتين التاليين الذي وجدته في التعليقات / المشاركات المرتبطة بالإجابات الأخرى:

الخطوة الأولى: تحويل CERT X.509 ومفتاح ملف PKCS12

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

ملحوظة: تأكد من وضع كلمة مرور في ملف pkcs12 - وإلا فسوف تحصل على استثناء مؤشر فارقى عند محاولة استيراده. (في حال كان لدى أي شخص آخر هذا الصداع). فيشكرا jocull!)

ملاحظة 2: قد ترغب في إضافة -chain خيار الحفاظ على سلسلة الشهادة الكاملة. فيشكرا مافوبا)

الخطوة الثانية: تحويل ملف PKCS12 إلى Keystore Java

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

هتافات!

Keytool في Java 6 هل لديك هذه القدرة: استيراد مفاتيح خاصة في مفتاح Java باستخدام Keytool

فيما يلي التفاصيل الأساسية من هذا المنصب.

  1. تحويل المركز الحالي إلى PKCS12 باستخدام Openssl. كلمة المرور مطلوبة عند سؤالها أو ستشكو الخطوة الثانية.

    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 إلى ملف Java Keystore.

    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]
    

و واحدة اخرى:

#!/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"

نعم، إنها حقيقة حزينة أن Keytool لا يوجد لديه وظيفة لاستيراد مفتاح خاص.

للسجل، في النهاية ذهبت مع الحل الموصوف هنا

أولا تحويل إلى P12:

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

إنشاء JKS جديد من P12:

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

في حالتي كان بيم الملف الذي يتضمن اثنين من شهادات مشفرة خاصة مفتاح المتبادلة مصادقة 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-----

هنا هو ما فعلته:

تقسيم الملف إلى ثلاثة ملفات منفصلة ، بحيث يحتوي كل واحد على واحد فقط من الدخول ، بدءا من "---تبدأ.." وتنتهي "---نهاية.." خطوط.لنفترض لدينا الآن ثلاثة ملفات:cert1.بيم cert2.بيم و pkey.pem

تحويل pkey.بيم في دير تنسيق باستخدام بينسل و بناء الجملة التالي:

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

ملاحظة أنه إذا كان المفتاح الخاص مشفرة تحتاج إلى توفير كلمة مرور( الحصول عليها من المورد الأصلي الملف pem ) لتحويل دير الشكل ، بينسل سوف يطلب منك كلمة المرور مثل هذا:"أدخل تمريرة phraze على pkey.بيم:" إذا كان التحويل بنجاح ، سوف تحصل على ملف جديد يسمى "pkey.دير"

إنشاء جديد جافا مفتاح مخزن استيراد المفتاح الخاص و الشهادات:

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

Keystore نوع:JKS Keystore مزود:الشمس

الخاص بك keystore يحتوي على 3 مداخل

cn=...,ou=...,o=.., سبتمبر 2, 2014, trustedCertEntry, شهادة بصمة (SHA1):2C:B8:...

importkey, سبتمبر 2, 2014, PrivateKeyEntry شهادة بصمة (SHA1):9C:B0:...

cn=...,س=...., Sep 2, 2014, trustedCertEntry شهادة بصمة (SHA1):83:63:...

(اختياري) اختبار شهادات المفتاح الخاص من المفتاح الجديد متجر ضد ملقم SSL:( قد تحتاج إلى تمكين التصحيح كما VM الخيار:-Djavax.صافي.تصحيح=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);

بناء على الإجابات أعلاه، إليك كيفية إنشاء Keystore جديد تماما لخادم الويب الذي يعتمد على Java، خارج جهاز Certo Certo Cert and الخاص الذي تم إنشاؤه بشكل مستقل باستخدام Keytool (يتطلب JDK 1.6+)

  1. قم بإصدار هذا الأمر وعلى موجه كلمة المرور، أدخل MothessPass - 'Server.crt' هو CERT الخادم الخاص بك و "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. ثم استخدم Keytool لتحويل Keystore P12 إلى KKS Keystore: keytool -importkeystore -deststorepass somepass -destkeypass somepass -destkeystore keystore.jks -srckeystore server.p12 -srcstoretype PKCS12 -srcstorepass somepass

ثم استيراد اثنين من الجذر / المتوسطة erts التي تلقيتها من كومودو:

  1. استيراد comodorsaaddtrustca.crt: keytool -import -trustcacerts -alias cert1 -file COMODORSAAddTrustCA.crt -keystore keystore.jks

  2. استيراد comodorsadomainvaleseCureserverca.crt: keytool -import -trustcacerts -alias cert2 -file COMODORSADomainValidationSecureServerCA.crt -keystore keystore.jks

يمكنك استخدام هذه الخطوات لاستيراد المفتاح إلى Keystore موجود. يتم دمج التعليمات من الإجابات في هذا الموضوع وغيرها من المواقع. هذه التعليمات عملت بالنسبة لي (Keystore Java):

  1. يركض

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

(إذا لزم الأمر وضع خيار -Chain. وضع ذلك فشل بالنسبة لي). سيطلب هذا كلمة المرور - يجب عليك إعطاء كلمة المرور الصحيحة أخرى ستحصل على خطأ (خطأ في العنوان أو خطأ الحشو، إلخ).

  1. سيطلب منك إدخال كلمة مرور جديدة - يجب عليك إدخال كلمة مرور هنا - أدخل أي شيء سوى تذكره. (دعونا نفترض أنك تدخل aragorn).
  2. سيؤدي ذلك إلى إنشاء ملف Server.p12 بتنسيق PKCS.
  3. الآن لاستيرادها إلى *.jks تشغيل الملف:
    keytool -importkeystore -srckeystore server.p12 -srcstoretype PKCS12 -destkeystore yourexistingjavakeystore.jks -deststoretype JKS -deststorepass existingjavastorepassword -destkeypass existingjavastorepassword
    (مهم جدا - لا تترك المعلمات DestStoyPass و Parameters Distretypass.)
  4. سيطلب منك كلمة مرور SRC Key Store. أدخل aragorn وضرب دخول. يتم الآن استيراد الشهادة والمفتاح الآن إلى مفتاح Java الموجود الحالي.

تشير الإجابات السابقة بشكل صحيح بحيث يمكنك القيام بذلك فقط مع أدوات JDK القياسية عن طريق تحويل ملف JKS إلى تنسيق PKCS # 12 أولا. إذا كنت مهتما، فقد قمت بتجميع الأداة المساعدة المدمجة لاستيراد المفاتيح المشتقة من Openssl إلى مفتاح مفاتيح تنسيق JKS دون الحاجة إلى تحويل KeyStore إلى PKCS # 12 أولا: http://commandlinefanatic.com/cgi-bin/showarticle.cgi؟article=art049.

ستستخدم الأداة المساعدة المرتبطة مثل هذا:

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

(قم بالتوقيع على المسؤولية الاجتماعية للشركات، وارجع localhost.cer)

$ 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

إذا كان لديك ملف PEM (على سبيل المثال server.pem) تحتوي:

  • الشهادة الموثوقة
  • المفتاح الخاص

ثم يمكنك استيراد الشهادة والمفتاح في KKS Keystore مثل هذا:

1) انسخ المفتاح الخاص من ملف PEM إلى ملف ASCII (على سبيل المثال server.key)

2) انسخ CERT من ملف PEM إلى ملف ASCII (على سبيل المثال 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 إلى KKS Keystore:

$ keytool -importkeystore -deststorepass changeit -destkeypass changeit \
          -destkeystore keystore.jks  -srckeystore server.p12 -srcstoretype PKCS12 \
          -srcstorepass changeit
  • ال srcstorepass يجب أن تطابق كلمة المرور كلمة مرور التصدير من الخطوة 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: الحصول على مفتاح Pase64 المشفر الخاص

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 الحالية ومفتاح خاص في Keystore Java للاستخدام في SSL؟
  2. http://tutororials.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));
}

ما عليك سوى إجراء Keystore PKCS12، ويمكن ل Java استخدامه الآن. في الواقع، إذا قمت بإدراج Keystore على طراز Java، فإن KeyTool نفسه تنبيهك إلى حقيقة أن 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) من مزود الشهادات الخاصة بك. لست متأكدا من ما يعنيه "جذر الاسم" في الواقع، ولكن يبدو أنه يجب تحديده بهذه الطريقة.

في كود Java، تأكد من تحديد نوع المفتاح الصحيح.

KeyStore.getInstance("PKCS12")

حصلت على شهادة SSL الخاصة ب Comodo.com الخاصة بي تعمل بشكل جيد في Nanohttpd بهذه الطريقة.

باستخدام دعونا تشفير الشهادات

على افتراض أنك قمت بإنشاء شهاداتك ومفاتيح خاصة دعونا تشفير في /etc/letsencrypt/live/you.com:

1. إنشاء أ PKCS # 12. ملف

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

هذا يجمع شهادة SSL الخاصة بك fullchain.pem ومفتاح الخاص بك privkey.pem في ملف واحد، pkcs.p12.

سوف تتم مطالبتك بكلمة مرور ل pkcs.p12.

ال export يحدد الخيار أنه سيتم إنشاء ملف PKCS # 12 بدلا من تحليله (من الدليل).

2. إنشاء مفتاح Java Keystore

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

إذا keystore.jks غير موجود، سيتم إنشاؤه يحتوي على pkcs.12 ملف تم إنشاؤه أعلاه. خلاف ذلك، سوف تستورد pkcs.12 في المفتاح الحالي.


هذه التعليمات مشتقة من هذه المدونة post..

هنا أكثر على نوع مختلف من الملفات في /etc/letsencrypt/live/you.com/.

في حالة منحنى إهليلجيه والإجابة على السؤال استيراد شهادة X509 الحالية والمفتاح الخاص في Java Keystore, ، قد ترغب في الحصول على نظرة أيضا لهذا الموضوع كيفية قراءة مفتاح EC الخاص في Java وهو بتنسيق ملف .pem

مرخصة بموجب: CC-BY-SA مع الإسناد
لا تنتمي إلى StackOverflow
scroll top