我正在尝试使用密钥库访问我的证书的私钥。
这是我的代码:
package test.java.com;
import java.security.Key;
import java.security.KeyStore;
import java.security.cert.Certificate;
import java.security.cert.X509Certificate;
import java.util.Enumeration;
public class Main {
/**
* @param args
*/
public static void main(String[] args) {
KeyStore ks;
try {
ks = KeyStore.getInstance("Windows-MY");
ks.load(null, null);
Enumeration<String> en = ks.aliases();
while (en.hasMoreElements()) {
String aliasKey = (String) en.nextElement();
Certificate c = ks.getCertificate(aliasKey);
Key key = ks.getKey(aliasKey, "1753".toCharArray()); // Here I try to access the private key of my hardware certificate
byte[] bt = key.getEncoded();
if(bt != null) {
System.out.println("private key correctly accessed");
} else {
System.out.println("Can't access private key");
}
System.out.println("---> alias : " + aliasKey);
if (ks.isKeyEntry(aliasKey)) {
Certificate[] chain = ks.getCertificateChain(aliasKey);
System.out.println("---> chain length: " + chain.length);
X509Certificate Cert = null;
for (Certificate cert : chain) {
System.out.println(cert);
}
}
}
} catch (Exception e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
但是当我尝试获取私钥时(为了使用它来签名数据),私钥为空。
我做错了吗?如何使用其私钥对该证书进行数据签名?
注意:我必须使用密钥库(我不能使用硬件令牌驱动程序的DLL,因为我可能有许多不同的驱动程序进入服务器)。
答案 0 :(得分:0)
我终于得到了这篇文章的答案:Java security - MSCAPI provider: How to use without password popup?
String alias = "Alias to my PK";
char[] pass = "MyPassword".toCharArray();
KeyStore ks = KeyStore.getInstance("Windows-MY");
ks.load(null, pass);
Provider p = ks.getProvider();
Signature sig = Signature.getInstance("SHA1withRSA",p);
PrivateKey key = (PrivateKey) ks.getKey(alias, pass)
sig.initSign(key);
sig.update("Testing".getBytes());
sig.sign();
答案 1 :(得分:0)
私钥为null,除非它是KeyEntry。您试图从CertificateEntry中获取私钥,因此您获得了NPE。在尝试使用私钥之前,只需测试条目的类型:或者,只需将其测试为null,如果是,请继续枚举。