証明書トークンを使用してドキュメントに署名する 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用です。