java - 使用 Java 从 MacOS X keystore 获取私钥

标签 java macos

我正在尝试访问我的个人 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/

相关文章:

java - 我们怎样才能创建一个每次都会发生的 for 循环呢?

c++ - 如何在 Qt/C++ 中构建自定义原生 OSX webkit 小部件?

macos - 有没有办法在 OSX 中安装 gcc 而无需安装 Xcode?

php - dyld : lazy symbol binding failed: Symbol not found: _clock_gettime - in mongodb laravel

bash - 在 shell 脚本 OS X 中设置环境变量

java - 无法在 spring 中注入(inject)请求范围的 bean

java - 在java中什么会更有效率? If-return-else 还是 If-return?

java - 隐藏 View 时回收器 View 未取消选择

java - Erlang OTP 监督 Java 应用程序

c++ - 我如何在不放置 '#include' 语句的情况下访问 cpp 标准库?