我正在开发这个Java项目,我需要使用提供商SunMSCAPI从Windows KeyStore加载私钥,但我根本不提供任何密码,我不知道我是否需要这样做。 这是我正在做的样本测试案例:
{
"id":1,
"name":"Foods",
"products":[
{
"id":2,
"name":"Chicken Fri",
"price":80
},
{
"id":4,
"name":"Tomato Salad",
"price":20
}
]
},
{
"id":3,
"name":"Vegitable",
"products":[
{
"id":3,
"name":"Potato",
"price":20
},
{
"id":6,
"name":"Bean",
"price":55
}
]
}
当我运行这个时,我得到了一些我之前从使用Adobe Reader的pfx文件导入的证书,但是我无法获得与该证书相对应的私钥,相反,我只是得到了空。
围绕此问题的任何帮助?提前谢谢
答案 0 :(得分:0)
我想我找到了解决问题的解决方案。 我尝试使用这段代码在Java中导入pfx
private static void importPFX(File pfxFile, char pass[]) throws Exception {
SunMSCAPI providerMSCAPI = new SunMSCAPI();
Security.addProvider(providerMSCAPI);
KeyStore wins=KeyStore.getInstance("Windows-MY", providerMSCAPI);
wins.load(null, null);
BouncyCastleProvider bcp = new BouncyCastleProvider();
Security.addProvider(bcp);
KeyStore pfx = KeyStore.getInstance("PKCS12","BC");
pfx.load(new FileInputStream(pfxFile), pass);
Enumeration<String> aliases = pfx.aliases();
while (aliases.hasMoreElements()) {
String alias = (String) aliases.nextElement();
Certificate[] chain = pfx.getCertificateChain(alias);
X509Certificate x509[]=new X509Certificate[chain.length];
for (int i = 0; i < chain.length; i++) {
x509[i]=(X509Certificate) chain[i];
}
X500Name x500name = new JcaX509CertificateHolder(x509[0]).getSubject();
RDN cn = x500name.getRDNs(BCStyle.CN)[0];
String commonName = IETFUtils.valueToString(cn.getFirst().getValue());
PrivateKey pkey = (PrivateKey) pfx.getKey(alias, pass);
System.out.println(pkey);
wins.setKeyEntry(commonName, pkey, "1234".toCharArray(), new X509Certificate[]{x509[0]});
wins.store(null, null);
}
}
然后我使用问题中的第一个代码列出了Windows密钥库的密钥和证书,我得到了私钥。
一个重要的细节,在导入证书和私钥时,您应该只传递用户证书,而不是整个链。至少是它对我有用的唯一方式。