【问题标题】:How to export private key from a keystore of self-signed certificate如何从自签名证书的密钥库中导出私钥
【发布时间】:2011-02-08 02:25:32
【问题描述】:

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

我创建了这样的密钥,有效期为 10 年:

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

并将密钥库复制到 tomcat 中的文件夹中,并更新 server.xml 以指向密钥库。

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

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

openssl s_client -connect mydomain.com:8443

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

【问题讨论】:

标签: tomcat ssl certificate self-signed keystore


【解决方案1】:

这有点棘手。首先您可以使用keytool 将私钥放入PKCS12 格式,这比Java 的各种keystore 格式更便携/兼容。这是一个示例,在 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 命令进一步处理。例如,

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 密钥库中删除并移动它所带来的安全隐患。

【讨论】:

  • 上面的 openssl 命令给出以下错误:6016:error:0D07207B:asn1 encoding routines:ASN1_get_object:header too long:.\crypto\asn1\asn1_lib.c:150:
  • @user265330:很抱歉听到这个消息,但这对我有用。你用的是什么版本的openssl?
  • 天哪,谢谢。为此我拉了三天的头发。才发现我一直在使用错误的 private.key。我能够从 JKS 中提取 private.key 并且它可以工作。 +10000 给你。
  • 对于收到“错误输出密钥和证书”错误的每个人:尝试对源和目标使用相同的密码。
  • 如果其他人遇到与@user265330 相同的问题,请尝试在答案中的代码框上向右滚动并包括 -deststoretype 参数。不是我做了这个,或任何事情......
【解决方案2】:

使用 Keystore Explorer gui - http://keystore-explorer.sourceforge.net/ - 允许您从各种格式的 .jks 中提取私钥。

【讨论】:

    【解决方案3】:

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

    【讨论】:

      【解决方案4】:

      public static void main(String[] 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);
      
          }
      }
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 2013-11-10
        • 1970-01-01
        • 1970-01-01
        • 2019-12-16
        • 2019-04-20
        • 1970-01-01
        • 2017-02-05
        相关资源
        最近更新 更多