如何在Java中使用pin/密码加载Windows MY keystore?
我正在开发java小程序,它应该能够从Windows我的实例中读取证书。这是我能做的部分,并且工作得很好。我的问题是,当我输入PIN码(通过编辑文本控件提供)时,Windows证书管理器会在输入PIN码后再次要求我输入相同的PIN码 所以,我没有什么问题,如果你能帮助我,我将非常感激如何在Java中使用pin/密码加载Windows MY keystore?,java,applet,x509certificate,keystore,digital-certificate,Java,Applet,X509certificate,Keystore,Digital Certificate,我正在开发java小程序,它应该能够从Windows我的实例中读取证书。这是我能做的部分,并且工作得很好。我的问题是,当我输入PIN码(通过编辑文本控件提供)时,Windows证书管理器会在输入PIN码后再次要求我输入相同的PIN码 所以,我没有什么问题,如果你能帮助我,我将非常感激 我的代码做错了什么,为什么它没有使用通过EditText控件提供的PIN码?如何做到这一点 如果不可能,请告诉我,PKCS#12数字证书的行为是否与PKCS#11智能卡证书的行为相同?准确地说,他们要求PIN的方式
EditText
控件提供的PIN码?如何做到这一点李>
keystore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keystore.load(null,_PIN);
String aliass = (String) aliasses.nextElement();
X509Certificate oPublicCertificate = (X509Certificate) keystore.getCertificate(alias);
PrivateKey oPrivateKey = (PrivateKey) keystore.getKey(alias,null);
if(oPrivateKey == null) continue;
if(aliass != alias) continue;
System.out.println("Sign with alias:"+aliass);
System.out.println("gettype:"+oPublicCertificate.getType());
System.out.println("serial:"+oPublicCertificate.getSerialNumber());
System.out.println("Public Key:"+oPublicCertificate.getPublicKey());
_PK = Base64Utils.base64Encode(oPublicCertificate.getPublicKey().getEncoded());
System.out.println("Public Key:"+_PK);
Provider p = keystore.getProvider();
// data to sign
byte[] data ="Data for signing".getBytes();
// Signing the data
Signature sig = Signature.getInstance("SHA1withRSA");
sig.initSign(oPrivateKey);
sig.update(data);
byte[] signature = sig.sign(); //<--- Here asks for PIN second time.
System.out.println("Signature.sign():" + signature);
Signature verifier = Signature.getInstance("SHA1withRSA", p);
verifier.initVerify(oPublicCertificate);
verifier.update(data);
boolean isValidSignature = verifier.verify(signature);
System.out.println("the verification result "+ isValidSignature);
keystore=keystore.getInstance(“Windows我的”、“SunMSCAPI”);
keystore.load(null,_PIN);
字符串别名=(字符串)别名.nextElement();
X509Certificate oPublicCertificate=(X509Certificate)keystore.getCertificate(别名);
PrivateKey oPrivateKey=(PrivateKey)keystore.getKey(别名,null);
如果(oPrivateKey==null)继续;
如果(别名!=别名)继续;
System.out.println(“用别名签名:+别名”);
System.out.println(“gettype:+oPublicCertificate.gettype());
System.out.println(“序列号:+oPublicCertificate.getSerialNumber());
System.out.println(“公钥:+oPublicCertificate.getPublicKey());
_PK=Base64Utils.base64Encode(opublicertificate.getPublicKey().getEncoded());
System.out.println(“公钥:”+_PK);
Provider p=keystore.getProvider();
//要签名的数据
byte[]data=“用于签名的数据”。getBytes();
//签署数据
Signature sig=Signature.getInstance(“SHA1withRSA”);
信号初始信号(oPrivateKey);
信号更新(数据);
字节[]签名=sig.sign()// 您需要实现一个回调处理程序
请查收
本例复制了上述引用,该引用覆盖回调处理
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof PasswordCallback) {
// prompt the user for sensitive information
PasswordCallback pc = (PasswordCallback)callbacks[i];
System.err.print(pc.getPrompt());
System.err.flush();
pc.setPassword(readPassword(System.in));
}
}
}
我希望这能有所帮助。您需要实现回调处理程序
请查收
本例复制了上述引用,该引用覆盖回调处理
public void handle(Callback[] callbacks)
throws IOException, UnsupportedCallbackException {
for (int i = 0; i < callbacks.length; i++) {
if (callbacks[i] instanceof PasswordCallback) {
// prompt the user for sensitive information
PasswordCallback pc = (PasswordCallback)callbacks[i];
System.err.print(pc.getPrompt());
System.err.flush();
pc.setPassword(readPassword(System.in));
}
}
}
我希望这能有所帮助。您是否测试了提供的解决方案?。我认为您没有,因为SunMSCAPI密钥库实现完全忽略了中所示的密码。您是否测试了提供的解决方案?。我认为您没有这样做,因为SunMSCAPI密钥库实现完全忽略了中所示的密码。