我需要支持Keytool.exe的相同功能,通过使用KeyTool类通过编程将java密钥库转换为PFX文件。由于项目要求的限制,我无法从我的应用程序中使用命令提示符进程,因此通过编程我也无法打开命令进程。
e.g。
C:\ keytool -importkeystore -srckeystore .k eystore -srcstoretype JKS -destkeystore thekeystore.pfx -deststoretype PKCS12
我可以使用上面的命令通过keytool.exe创建PFX文件,但我的要求是通过我自己的应用程序中的密钥库生成PFX文件。我在谷歌搜索了很多,我找不到任何有用的链接,可以提供任何有关此问题的参考或帮助。有一个类sun.security.tools.Keytool我搜索了这个,但我无法找到任何一般编程帮助这个类。如果有人有任何提示或想法,请分享。
答案 0 :(得分:2)
我不知道KeyTool类,因为它不是公共API,我不愿意使用它,但你可以使用KeyStore类自己读写密钥库。根据{{3}},Java至少支持jks
和pkcs12
密钥库类型,因此您可以执行以下操作:
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);
}
}