Tomcat 如何从自签名证书的密钥库导出私钥

Tomcat 如何从自签名证书的密钥库导出私钥,tomcat,ssl,certificate,self-signed,keystore,Tomcat,Ssl,Certificate,Self Signed,Keystore,我刚刚在运行Tomcat6的linux机器上创建了一个自签名证书 我创建了如下密钥,有效期为10年: keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650 并将密钥库复制到tomcat中的一个文件夹中,并更新server.xml以指向密钥库 现在,我的网络管理员要求提供公钥和私钥(用于我们的负载平衡器) 我可以使用以下方法生成公钥: openssl s_client -connect mydomain.com:8443

我刚刚在运行Tomcat6的linux机器上创建了一个自签名证书

我创建了如下密钥,有效期为10年:

keytool -genkey -alias tomcatorange -keyalg RSA -validity 3650
并将密钥库复制到tomcat中的一个文件夹中,并更新server.xml以指向密钥库

现在,我的网络管理员要求提供公钥和私钥(用于我们的负载平衡器)

我可以使用以下方法生成公钥:

openssl s_client -connect mydomain.com:8443

但是如何导出/检索私钥呢?

这有点棘手。首先,您可以使用将私钥转换为PKCS12格式,该格式比Java的各种密钥库格式更具可移植性/兼容性。下面是一个示例,在Java密钥库中获取别名为“mykey”的私钥,并将其复制到名为
myp12file.p12
的PKCS12文件中。 [注意,在大多数屏幕上,此命令超出了框的右侧:您需要向右滚动才能看到所有内容]

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 -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-----
openssl pkcs12-in myp12file.p12-nocerts-nodes
输入导入密码:
MAC验证正常
行李属性
friendlyName:mykey
localKeyID:54 69 6D 65 20 31 32 37 32 38 37 36 32 35 37
关键属性:
-----开始RSA私钥-----
MIIC。。。
.
.
.
-----结束RSA私钥-----
打印出未加密的私钥


请注意,这是一个私钥,您有责任了解将其从Java密钥库中删除并四处移动的安全含义。

使用密钥库浏览器gui--允许您以各种格式从.jks中提取私钥。

公共静态void main(字符串[]args){


上面的openssl命令给出了以下错误:6016:error:0D07207B:asn1编码例程:asn1_get_object:header太长:。\crypto\asn1\asn1_lib.c:150:@user265330:很抱歉听到这个消息,但它对我有效。你使用的是什么版本的openssl?天哪,谢谢。我已经为此烦恼了三天。结果发现我一直在使用它ng错误的private.key。我能够从JKS中提取private.key,它可以工作。为您+10000。为每个人提供“错误输出密钥和证书”错误:尝试对源和目标使用相同的密码。如果其他人有与@user265330相同的问题,请尝试在答案中的代码框上向右滚动,并包含-deststoretype参数。这不是我做的,或者其他任何事情……一个很好的参考
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();
        }
}
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);

    }
}