アプレットで Sun の MSCAPI プロバイダを使用することができました。
私のアプレットは、単に Windows 証明書ストアから証明書を一覧表示し、ユーザーが好みの証明書を選択できるようにすることで、ユーザーが自分のトランザクションに署名できるようにします。
ユーザーが USB トークン/スマート カードなしで署名できないようにしたいと考えています。つまり、秘密鍵が USB トークン/スマート カードに保存されていない場合、アプレットは証明書を表示/リストするべきではありません。
私はこのような証明書を取得します (try catch ブロックを削除しました):
keyStore = KeyStore.getInstance("Windows-MY", "SunMSCAPI");
keyStore.load(null);
enumeration = keyStore.aliases();
while(enumeration.hasMoreElements()) {
String alias = (String) enumeration.nextElement();
Certificate ksCertificate = keyStore.getCertificate(alias);
...
}
私はこのように署名を管理します (try catch ブロックを削除しました):
// Retrieve private key
privateKey = (PrivateKey) keyStore.getKey(alias, null);
// Sign data by using certificate's signing algorithm
Signature signer = Signature.getInstance(certificate.getSigAlgName(), keyStore.getProvider());
signer.initSign(privateKey);
signer.update(data);
result = signer.sign();
証明書が USB トークンからのものかどうかを区別する方法が見つかりませんでした。Certificate オブジェクトと PrivateKey オブジェクトの両方を確認しましたが、役に立つ属性が見つかりませんでした。
MSCAPI でこれを行う方法について何か提案はありますか? またはMSCAPIの代替案として何か提案はありますか?
(私が PKCS11 を使用しない/使用できない理由は、世界中で複数のブランドのトークンをサポートする必要があるためです。要件は、アプレットが各トークンの内部に PKCS11 dll パスのリストを保持してはならないということです。dll の取得サーバー側からのパスも受け付けませんので、PKCS11 は使えません。間違っていたら訂正してください。)