java SunPKCS11多个etokens(智能卡)同时,提供程序未找到错误

时间:2013-08-26 07:10:29

标签: java ssl keystore smartcard pkcs#11

我正在使用智能卡提供的X509证书进行SSL连接。 我有两个来自雅典娜的相同代币。我在读取证书后初始化密钥库,但是当我尝试为第二个令牌执行实际连接时,我没有找到我的私钥的提供者。使用第一个令牌连接它不受影响,它可以工作。 我尝试通过将slotIndexList指定为1来添加不同的SunPCKS11提供程序,第二个令牌的数字由“slots = p11.C_GetSlotList(true)”给出,但仍然是相同的错误。 当我列出提供者时:我看到第二个提供者,但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

以及第二个令牌使用第二个令牌时的错误:

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

由于

PS:我需要同一台机器上的两个令牌

2 个答案:

答案 0 :(得分:0)

在查看these docs之后,它说SunPKCS11的实例化可以在配置中占用一个插槽。

所以也许你可以试试

String pkcs11config1 = "name=Athenaslot1\nslot=1\nlibrary=C:\WINDOWS\system32\asepkcs.dll";

答案 1 :(得分:0)

即使您将2个提供程序添加到提供程序列表中,SunPKCS11类也会缓存第一个实例。似乎它总是一直使用这个实例。这就是你的第二个提供者没有被选中/识别的原因。

您可能需要编写一些偷偷摸摸的代码来处理您的用例。在使用第二个提供程序之前,您必须清除缓存的实例。您可以在此处参考此post。它没有答案,但您应该寻找的代码是

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  

这基本上是清除缓存的实例。现在,您可以继续添加第二个提供程序实例以与第二个令牌进行交互。