使用Windows 7,JDK 6(和7)。
我正在尝试获取存储在Windows MSCAPI密钥库中的个人证书及其基本属性(为了使用私钥进行签名)。但是,有些别名被识别为没有私钥(isKeyEntry == false),尽管它实际上有一个。
有关如何处理此“功能”的任何建议吗?
带证书的P12文件(已撤销)&具有此奇怪“属性”的私钥可以从http://download.upce.cz/terena-public.pfx下载。密码是“密码”。
KeyStore ks = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
ks.load(null, null);
Enumeration<String> aliases = ks.aliases();
while (aliases.hasMoreElements()) {
String alias = (String) aliases.nextElement();
X509CertImpl certificate = (X509CertImpl)ks.getCertificate(alias);
System.out.println("Alias: " + alias);
System.out.println(" Subject: " + certificate.getSubjectDN());
System.out.println(" Issued By: " + certificate.getIssuerDN());
if (ks.isKeyEntry(alias)) {
System.out.println(" Has private key");
}
}
答案 0 :(得分:0)
我将您的pfx文件导入Mozilla Thunderbird并将其导出为p12文件。现在我可以通过MSCAPI看到它。原始证书中必须存在阻止MSCAPI查看私钥的内容。
我比较了文件,我注意到在原始文件中使用了Key Usage部分。
原始pfx:
Bag Attributes
localKeyID: 01 00 00 00
friendlyName: le-b6311e84-87e7-4e02-9cf6-4012518e0541
Microsoft CSP Name: Microsoft Software Key Storage Provider
Key Attributes
X509v3 Key Usage: 90
转换后的p12:
Bag Attributes
friendlyName: le-b6311e84-87e7-4e02-9cf6-4012518e0541
localKeyID: 47 E4 D3 F0 75 48 9D 77 07 E9 51 A4 F1 B6 DF E9 40 80 26 7A
Key Attributes: <No Attributes>
这两个文件存在更多差异,但我不确定哪一个会导致不必要的行为。