كيفية تصدير المفتاح الخاص من شهادة مفاتيح للشهادة الموقعة ذاتيا

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

سؤال

لقد قمت للتو بإنشاء شهادة موقعة ذاتيا على صندوق Linux الذي يدير Tomcat 6.

لقد قمت بإنشاء مفاتيح مثل هذا ، صالحة لمدة 10 سنوات:

keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650

ونسخت Keystore إلى مجلد في Tomcat ، وتم تحديث server.xml لتشير إلى keystore.

الآن يسأل مسؤول الشبكة عن المفتاح العام والخاص (من أجل موازن التحميل لدينا)

يمكنني إنشاء المفتاح العام باستخدام:

openssl s_client -connect mydomain.com:8443

ولكن كيف يمكنني تصدير/استرداد المفتاح الخاص؟

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

المحلول

إنه أمر صعب بعض الشيء. أولا يمكنك استخدام KeyTool لوضع المفتاح الخاص في تنسيق PKCS12 ، والذي يكون أكثر توافقًا/متوافقًا من تنسيقات keystore المختلفة في Java. فيما يلي مثال على أخذ مفتاح خاص مع الاسم المستعار "mykey" في java keystore ونسخه إلى ملف PKCS12 المسمى myp12file.p12. [لاحظ أنه في معظم الشاشات يمتد هذا الأمر إلى ما وراء الجانب الأيمن من المربع: تحتاج إلى التمرير بشكل صحيح لرؤية كل شيء

keytool -v -importkeystore -srckeystore .keystore -srcalias mykey -destkeystore myp12file.p12 -deststoretype PKCS12
Enter destination keystore password:  
Re-enter new password: 
Enter source keystore password:  
[Storing myp12file.p12]

الآن الملف myp12file.p12 يحتوي على المفتاح الخاص في تنسيق PKCS12 الذي يمكن استخدامه مباشرة من قبل العديد من حزم البرامج أو معالجته أكثر باستخدام openssl pkcs12 أمر. علي سبيل المثال،

openssl pkcs12 -in myp12file.p12 -nocerts -nodes
Enter Import Password:
MAC verified OK
Bag Attributes
    friendlyName: mykey
    localKeyID: 54 69 6D 65 20 31 32 37 31 32 37 38 35 37 36 32 35 37 
Key Attributes: <No Attributes>
-----BEGIN RSA PRIVATE KEY-----
MIIC...
.
.
.
-----END RSA PRIVATE KEY-----

يطبع المفتاح الخاص غير المشفر.

لاحظ أن هذا هو مفتاح سري, ، و أنت هي مسؤولة عن تقدير الآثار الأمنية لإزالته من Java Keystore الخاص بك ونقله.

نصائح أخرى

استخدم keystore explorer واجهة المستخدم الرسومية - http://keystore-explorer.sourceforge.net/ - يتيح لك استخراج المفتاح الخاص من .jks بتنسيقات مختلفة.

http://anandsekar.github.io/exporting-the-private-key-from-a-jks-keystore/

public class ExportPrivateKey {
        private File keystoreFile;
        private String keyStoreType;
        private char[] password;
        private String alias;
        private File exportedFile;

        public static KeyPair getPrivateKey(KeyStore keystore, String alias, char[] password) {
                try {
                        Key key=keystore.getKey(alias,password);
                        if(key instanceof PrivateKey) {
                                Certificate cert=keystore.getCertificate(alias);
                                PublicKey publicKey=cert.getPublicKey();
                                return new KeyPair(publicKey,(PrivateKey)key);
                        }
                } catch (UnrecoverableKeyException e) {
        } catch (NoSuchAlgorithmException e) {
        } catch (KeyStoreException e) {
        }
        return null;
        }

        public void export() throws Exception{
                KeyStore keystore=KeyStore.getInstance(keyStoreType);
                BASE64Encoder encoder=new BASE64Encoder();
                keystore.load(new FileInputStream(keystoreFile),password);
                KeyPair keyPair=getPrivateKey(keystore,alias,password);
                PrivateKey privateKey=keyPair.getPrivate();
                String encoded=encoder.encode(privateKey.getEncoded());
                FileWriter fw=new FileWriter(exportedFile);
                fw.write(“—–BEGIN PRIVATE KEY—–\n“);
                fw.write(encoded);
                fw.write(“\n“);
                fw.write(“—–END PRIVATE KEY—–”);
                fw.close();
        }


        public static void main(String args[]) throws Exception{
                ExportPrivateKey export=new ExportPrivateKey();
                export.keystoreFile=new File(args[0]);
                export.keyStoreType=args[1];
                export.password=args[2].toCharArray();
                export.alias=args[3];
                export.exportedFile=new File(args[4]);
                export.export();
        }
}

الفراغ الثابت العام الرئيسي (سلسلة [] args) {

try {
        String keystorePass = "20174";
        String keyPass = "rav@789";
        String alias = "TyaGi!";
        InputStream keystoreStream = new FileInputStream("D:/keyFile.jks");
        KeyStore keystore = KeyStore.getInstance("JCEKS");
        keystore.load(keystoreStream, keystorePass.toCharArray());
        Key key = keystore.getKey(alias, keyPass.toCharArray());

        byte[] bt = key.getEncoded();
        String s = new String(bt);
        System.out.println("------>"+s);      
        String str12 = Base64.encodeBase64String(bt);

        System.out.println("Fetched Key From JKS : " + str12);

    } catch (KeyStoreException | IOException | NoSuchAlgorithmException | CertificateException | UnrecoverableKeyException ex) {
        System.out.println(ex);

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