1

我正在使用 SSL 连接和智能卡提供的 X509 证书。我有 2 个来自 athena 的相同令牌。我在读取证书后初始化密钥库,但是当我尝试为第二个令牌进行实际连接时,我没有找到我的私钥的提供者。使用第一个令牌连接它不受影响,它可以工作。我尝试通过将 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:我需要在同一台机器上的两个令牌

4

2 回答 2

0

在查看了这些文档之后,它说 SunPKCS11 的实例化可以在配置中占据一席之地。

所以也许你可以试试

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

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

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

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  

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

于 2016-11-10T18:39:26.310 回答