使用Java从MacOS X密钥库获取私钥

swl*_*wle 12 java macos

我正在尝试访问我的个人MacOS X钥匙串存储,以检索使用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());
    }
}
Run Code Online (Sandbox Code Playgroud)

执行那段代码后,我可以在我的个人密钥库中看到所有证书.但是,我只能检索一个私钥,即使密钥库中有一堆私钥.(代码的输出只显示多个可信证书+仅一个私钥)

当我从密钥库中删除该私钥并再次执行该代码时,将返回另一个私钥,而所有其他私钥仍然无法访问.导入私钥回到密钥存储和执行该代码的最后一次,它就会被Java回来,先前返回的最后一个私钥变得不可访问.

:我在关于这个问题的一个邮件列表跌跌撞撞 http://lists.apple.com/archives/java-dev/2007/aug/msg00134.html.不幸的是,似乎问题没有解决,我无法联系相关人员(没有电子邮件地址).

有没有人试图从MacOS钥匙串商店检索多个私钥,并成功了?

我的配置:

  • MacOS X 10.6
  • Jva JRE 1.6.0_15(32和64位)
  • Safari 4.0.3
  • Firefox 3.6.3

提前致谢,

Jcs*_*Jcs 2

不幸的是,这是 Apple KeyChain KeyStore 实现的已知限制。OpenJDK MacOSX 端口错误跟踪器 ( MACOSX_PORT-464 )中有一个已打开的票证,并且已提交补丁。

然而,要么您必须从头开始重新编译 OpenJDK(这需要一段时间,但这是一个简单的过程),要么您必须从 OpenJDK 源代码中提取钥匙串加密服务提供程序并构建一个包含独立 JCA 提供程序的新 jar(但它因为它包含本机代码,这可能是一项更复杂的任务)。