1

スマートカードから提供された X509 証明書で SSL 接続を使用しています。私は athena から 2 つの同一のトークンを持っています。証明書を読み取った後にキーストアを初期化しますが、2 番目のトークンの実際の接続を試みているときに、秘密鍵のプロバイダーが見つかりません。最初のトークンを使用して接続しても影響はなく、動作します。slotIndexList を「slots = p11.C_GetSlotList(true)」で指定された 2 番目のトークンの番号である 1 に指定して、別の SunPCKS11 プロバイダーを追加しようとしましたが、それでも同じエラーが発生します。プロバイダーをリストしているとき: 2 番目のプロバイダーが表示されますが、Java はそれを使用しません (理由はわかりません)。

Provider _etpkcs11;
slots = p11.C_GetSlotList(true);

if(slot ==0) 
{
String pkcs11config = "name=Athena\nlibrary=C:\WINDOWS\system32\asepkcs.dll";
byte[] pkcs11configBytes =pkcs11config.getBytes();
 ByteArrayInputStream configStream = new ByteArrayInputStream(pkcs11configBytes);
etpkcs11 = new SunPKCS11(configStream);
Security.addProvider(etpkcs11);

}

上記は動作します 以下は動作しません

if(slot ==1) 
{
String pkcs11config1 = "name=Athenaslot1\nlibrary=C:\WINDOWS\system32\asepkcs.dll";
byte[] pkcs11configBytes1 =pkcs11config1.getBytes();
ByteArrayInputStream configStream1 = new ByteArrayInputStream(pkcs11configBytes1);
etpkcs11 = new SunPKCS11(configStream1);
Security.addProvider(etpkcs11);
}

以下

for(int j=0;j<Security.getProviders().length;j++)
        {
            System.out.println(Security.getProviders()[j].getName());   
        }

戻り値:

SunPKCS11-Athena
SunPKCS11-Athenaslot1
SUN
SunRsaSign
SunEC
SunJSSE
SunJCE
SunJGSS
SunSASL
XMLDSig
SunPCSC

2番目の2番目のトークンを使用した場合のエラー:

 No installed provider supports this key: sun.security.pkcs11.P11Key$P11PrivateKey

ありがとう

PS: 同じマシンに両方のトークンが必要です

4

2 に答える 2

0

プロバイダーのリストに 2 つのプロバイダーを追加しても、SunPKCS11クラスは最初のインスタンスをキャッシュします。常にこのインスタンスを常に使用しているようです。これが、2 番目のプロバイダーが取得/識別されない理由です。

ユースケースにアプローチするには、卑劣なコードを書かなければならない場合があります。2 番目のプロバイダーを使用する直前に、キャッシュされたインスタンスをクリアする必要があります。この投稿はこちらから参照できます。未回答ですが、探しているコードは

Field moduleMapField = PKCS11.class.getDeclaredField("moduleMap");  
moduleMapField.setAccessible(true);  
Map<?, ?> moduleMap = (Map<?, ?>) moduleMapField.get(<YOUR_FIRST_PROVIDER_INSTANCE>);  
moduleMap.clear(); // force re-execution of C_Initialize next time  

これが基本的に行うことは、キャッシュされたインスタンスをクリアすることです。これで、2 番目のプロバイダー インスタンスを追加して、2 番目のトークンと対話することができます。

于 2016-11-10T18:39:26.310 に答える
0

これらのドキュメントを見た後、SunPKCS11 のインスタンス化が構成内のスロットを取ることができると言っています。

だから多分あなたは試すことができます

String pkcs11config1 = "name=Athenaslot1\nslot=1\nlibrary=C:\WINDOWS\system32\asepkcs.dll";
于 2013-08-26T08:15:08.333 に答える