1

アプレットで 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 は使えません。間違っていたら訂正してください。)

4

1 に答える 1