我正在开发一个使用证书令牌签署文档的 java 代码。到目前为止,一切都很好,但我想禁止“输入密码”对话框,因为我正在存储用户的密码,所以他/她不需要每次都输入密码。这里真正的问题是这段代码将以批处理模式运行(没有用户交互)。我知道一旦键入,密钥可能在内存中,因此短时间内不需要再次键入。但我不能依赖它,我需要提供 PIN。这是我到目前为止的代码(它只是一个示例,它可能不完整也不工作):
protected KeyStore loadKeyStoreFromSmartCard() {
keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keyStore.load(null, null);
return keyStore;
}
public void signDocument(byte[] conteudoParaAssinar, String certAlias) {
char[] pass = (char[]) null;
PrivateKey key = (PrivateKey) loadKeyStoreFromSmartCard.getKey(certAlias, pass);
Certificate[] chain = loadKeyStoreFromSmartCard(true).getCertificateChain(certAlias);
CertStore certsAndCRLs = CertStore.getInstance("Collection", new CollectionCertStoreParameters(Arrays.asList(chain)), "BC");
X509Certificate cert = (X509Certificate) chain[0];
CMSSignedDataGenerator gen = new CMSSignedDataGenerator();
gen.addSigner(key, cert, CMSSignedDataGenerator.DIGEST_SHA1);
gen.addCertificatesAndCRLs(certsAndCRLs);
CMSProcessable data = new CMSProcessableByteArray(conteudoParaAssinar);
CMSSignedData signed = gen.generate(data, true, "SunMSCAPI");
byte[] envHex = signed.getEncoded();
}
编辑
我听说CryptSetProvParam
PP_KEYEXCHANGE_PIN
女巫可能是解决方案,但我不知道如何从 java 中调用它。我找到的所有示例都是针对 .net 的。