0

我需要支持 Keytool.exe 的相同功能,使用 KeyTool 类通过编程将 java 密钥库转换为 PFX 文件。由于项目要求限制,我无法从我的应用程序中使用命令提示符进程,因此通过编程我也无法打开命令进程。

例如

C:\keytool -importkeystore -srckeystore .keystore -srcstoretype JKS -destkeystore thekeystore.pfx -deststoretype PKCS12

我可以使用上述命令通过 keytool.exe 创建 PFX 文件,但我的要求是通过我自己的应用程序的密钥库生成 PFX 文件。我在谷歌上搜索了很多,我找不到任何有用的链接可以提供有关此问题的任何参考或帮助。有一个类 sun.security.tools.Keytool 我也搜索了这个,但我找不到这个类的任何一般编程帮助。如果有人有任何提示或想法,请分享。

4

1 回答 1

2

我不知道 KeyTool 类,而且由于它不是公共 API,我不喜欢使用它,但您可以使用KeyStore类自己读写密钥库。根据文档,Java 至少支持jkspkcs12keystore 类型,因此您可以执行以下操作:

public void convertKeystore(Path sourceKeystorePath,
                            char[] sourceKeystorePassword,
                            Path destKeystorePath,
                            char[] destKeystorePassword)
throws GeneralSecurityException, IOException {

    KeyStore sourceKeystore = KeyStore.getInstance("jks");
    try (InputStream stream =
            new BufferedInputStream(
                Files.newInputStream(sourceKeystorePath))) {
        sourceKeystore.load(stream, sourceKeystorePassword);
    }

    KeyStore destKeystore = KeyStore.getInstance("pkcs12");
    destKeystore.load(null, destKeystorePassword);

    // Assume each alias in a keystore has the same password
    // as the keystore itself.
    KeyStore.ProtectionParameter sourceAliasPassword =
        new KeyStore.PasswordProtection(sourceKeystorePassword);
    KeyStore.ProtectionParameter destAliasPassword =
        new KeyStore.PasswordProtection(destKeystorePassword);

    Enumeration<String> aliasList = sourceKeystore.aliases();
    while (aliasList.hasMoreElements()) {
        String alias = aliasList.nextElement();
        KeyStore.Entry entry =
            sourceKeystore.getEntry(alias, sourceAliasPassword);
        destKeystore.setEntry(alias, entry, destAliasPassword);
    }

    try (OutputStream stream =
            new BufferedOutputStream(
                Files.newOutputStream(destKeystorePath))) {
        destKeystore.store(stream, destKeystorePassword);
    }
}
于 2013-03-23T13:43:34.017 回答