我正在使用智能卡提供的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:我需要同一台机器上的两个令牌
答案 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
这基本上是清除缓存的实例。现在,您可以继续添加第二个提供程序实例以与第二个令牌进行交互。