2013-08-26 34 views
1

我正在使用SSL連接與智能卡提供的X509證書。 我有2個來自雅典娜的相同的標記。我在讀取證書後初始化密鑰庫,但是當我試圖爲第二個令牌執行實際連接時,我沒有找到爲我的私鑰提供的提供程序。使用第一個令牌進行連接時,它不受影響,它可以工作。 我試着通過將slotIndexList指定爲1來添加不同的SunPCKS11提供程序,第一個是由「slots = p11.C_GetSlotList(true)」給出的第二個標記的編號,但仍然是相同的錯誤。 當我列出提供者時:我看到第二個提供者,但是java不使用它(我不知道爲什麼)。使用第二個是當java SunPKCS11多個etokens(智能卡)同時,提供程序未找到錯誤

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

和錯誤:

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()); 
     } 

回報第二個問題EN:

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

感謝

PS:我需要同一臺機器

回答

0

在兩個標記在看看these docs後,它是說,SunPKCS11的實例可以採取插槽配置。

因此,也許你可以嘗試

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

我把插槽,甚至改名爲新的實例,請參閱:SunPKCS11-Athena,SunPKCS11-Athenaslot1。第一個供應商包含行槽= 0,第二個槽= 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 

這基本上是做什麼是清除緩存實例。現在您可以繼續添加第二個提供程序實例以與第二個標記進行交互。

相關問題