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

使用Java从MacOS X密钥库获取私钥,java,macos,Java,Macos,我正在尝试访问我的个人MacOS X密钥链商店,以检索特定的私钥,从而使用Java对一些数据进行加密和签名。加密和签名部分功能正常,但我无法检索所需的私钥。以下是我编写的一些代码,用于说明我的问题: KeyStore myKeyStore; myKeyStore = KeyStore.getInstance("KeychainStore", "Apple"); myKeyStore.load(null, null); // Get all the aliases in a list (I th

我正在尝试访问我的个人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());
    }
}
keystoremykeystore;
myKeyStore=KeyStore.getInstance(“KeychainStore”、“Apple”);
加载(null,null);
//获取列表中的所有别名(我认为调用密钥库
//迭代过程中的方法是getKey没有正确响应的原因!)
// ... 实际上不是!
ArrayList别名=新的ArrayList();
枚举e=myKeyStore.alias();
而(e.hasMoreElements()){
add(e.nextElement());
}
用于(字符串别名:别名){
试一试{
//我在网上读到任何ASCII密码都是必需的
//使getKey方法工作。
Key k=myKeyStore.getKey(别名“TEST”.toCharArray());
if(k==null){
System.out.println(别名+“:(无法检索密钥)”;
}否则{
System.out.println(别名+“:”);
系统输出println(k);
}
}捕获(例外情况除外){
System.out.println(别名+”:“+ex.getMessage());
}
}
执行这段代码后,我可以看到我个人密钥库中的所有证书。但是,我只能检索一个私钥,即使密钥库中有很多私钥。(代码的输出仅显示多个受信任证书+仅一个私钥)

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

我偶然发现了一个关于这个主题的邮件列表: . 不幸的是,这个问题似乎没有得到解决,我无法联系相关人员(没有电子邮件地址)

是否有人尝试从MacOS keychain store检索多个私钥并成功

我的配置:

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

提前感谢,

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


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

您是否尝试过从命令行使用keytool?如果它能工作,可能是解决您问题的一种方法。我过去曾使用过它,它对我来说很有效。。。