我正在尝试访问我的个人 MacOS X 钥匙串(keychain)存储以检索特定私钥,以使用 Java 加密和签署一些数据。加密和签名部分功能正常,但我无法检索到我想要的私钥。以下是我为展示我遇到的问题而编写的一些代码:
KeyStore myKeyStore;
myKeyStore = KeyStore.getInstance("KeychainStore", "Apple");
myKeyStore.load(null, null);
// Get all the aliases in a list (I thought that calling the KeyStore
// methods during the iteration was the reason why getKey wasn't responding properly!)
// ... it wasn't actually!
ArrayList<String> aliases = new ArrayList<String>();
Enumeration<String> e = myKeyStore.aliases();
while (e.hasMoreElements()) {
aliases.add(e.nextElement());
}
for (String alias : aliases) {
try {
// I read on the Internet that any ASCII password is required
// to get the getKey method working.
Key k = myKeyStore.getKey(alias, "TEST".toCharArray());
if (k == null) {
System.out.println(alias + ": <null> (cannot retrieve the key)");
} else {
System.out.println(alias + ":");
System.out.println(k);
}
} catch (Exception ex) {
System.out.println(alias + ": " + ex.getMessage());
}
}
执行那段代码后,我可以在我的个人 keystore 中看到所有证书。但是,我只能检索一个私钥,即使 keystore 中有一堆私钥。 (代码的输出只显示多个可信证书+一个私钥)
当我从 keystore 中删除该私钥并再次执行该代码时,会返回另一个私钥,而所有其他私钥仍然无法访问。将私钥重新导入 keystore 并最后一次执行该代码,它会由 Java 返回,并且之前返回的最后一个私钥变得不可访问。
我偶然发现了一个关于该主题的邮件列表: http://lists.apple.com/archives/java-dev/2007/aug/msg00134.html . 不幸的是,这个问题似乎没有得到解决,我无法联系到相关人员(没有电子邮件地址)。
有没有人尝试从 MacOS 钥匙串(keychain)存储中检索多个私钥并成功了?
我的配置:
- MacOS X 10.6
- Jva JRE 1.6.0_15(32 位和 64 位)
- Safari 4.0.3
- 火狐 3.6.3
提前致谢
最佳答案
不幸的是,这是 Apple KeyChain KeyStore 实现的一个已知限制。在 OpenJDK MacOSX 端口错误跟踪器 (MACOSX_PORT-464) 中有一个打开的票证,并且已经提交了一个补丁。
但是,要么您必须从头开始重新编译 OpenJDK(这需要一段时间,但过程很简单),要么您必须从 OpenJDK 源中提取钥匙串(keychain)加密服务提供程序并构建一个包含独立 JCA 提供程序的新 jar(但是因为它包含 native 代码,所以它可能是一项复杂得多的任务。
关于java - 使用 Java 从 MacOS X keystore 获取私钥,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/4437726/