2

スマート カードでファイルに署名しようとしています。次のようにキーストアを初期化します。

String pkcs11config = "name = CertumSmartCard \n" + "library = "
            + new File(".").getAbsolutePath() + "/cryptoCertum3PKCS.dll";
Provider pkcs11Provider = new SunPKCS11(new ByteArrayInputStream(
                pkcs11config.getBytes()));
Security.addProvider(pkcs11Provider);
KeyStore keyStore = KeyStore.getInstance("PKCS11", pkcs11Provider);
keyStore.load(null, pin.toCharArray());

次に、次を使用して証明書チェーンを読み取ろうとします。

Enumeration<String> aliasesEnum = keyStore.aliases();
String alias = null;
while (aliasesEnum.hasMoreElements()) {
alias = aliasesEnum.nextElement();
Certificate[] certChain = keyStore.getCertificateChain(alias);
(...)
}

残念ながら、チェーン内の証明書は 1 つしか取得できません (このカードの所有者の証明書)。信頼されたルート証明書を持っていないため、検証中に、信頼されていない証明書を使用してファイルが署名されたというエラーが表示されます。

何か考えはありますか?SunPKSC11 クラスを使用する必要がありますか? Java 7 では動作しません (私は Java 6 を使用しています)。非推奨のようです。カードの根性に入る他のライブラリはありますか?

4

2 に答える 2

0

実際、このカードには証明書が 1 つしか含まれていなかったので、私のコードは正しく機能しました。不足している証明書を手動で追加し、それらをチェーンに接続しました。そのチェーンを使用して、ファイルに署名できました。このタイプの証明書でファイルを署名するために公式に使用されている別のアプリケーション (proCertum スマートカード) から証明書を保存することで、欠落している証明書を取得しました。

于 2013-11-26T16:43:44.793 に答える
-1

あなたの問題は while ループの中にあったと思います:

while (aliasesEnum.hasMoreElements()) {
alias = aliasesEnum.nextElement();
**Certificate[] certChain = keyStore.getCertificateChain(alias);**
(...)
}

この場合、最後のエイリアスを持つ証明書を 1 つだけ取得します。

そのため、コードを次のように変更することをお勧めします。

Certificate[] certChain = new Certificate[NumnberOfYourCertificates];
int count = 0 ;
while (aliasesEnum.hasMoreElements()) {
alias = aliasesEnum.nextElement();
certChain[count++] = keyStore.getCertificateChain(alias);
(...)
}

うまくいくと思います。

于 2012-11-28T05:37:22.393 に答える