2010-07-21 33 views
4

我試圖訪問虛擬機上的Linux系統上的智能卡。 USB設備映射到虛擬機,並可通過lsusb(ID 076b:3021 OmniKey AG CardMan 3121)列出。我可以通過pkcs11-tool和pkcs15-tool訪問智能卡。另外firefox可以通過/usr/lib/opensc-pkcs11.so庫訪問令牌。如何在Linux上使用Java訪問智能卡?

但是當我嘗試從Java訪問智能卡時,返回一個空的密鑰庫。我爲sun.security.pkcs11.SunPKCS11提供程序使用以下配置。

name = PKCS11Test 
library = /usr/lib/opensc-pkcs11.so 
slot = 0 

當使用不同的插槽(我試過插槽0-15),我得到CKR_PIN_INCORRECT錯誤或「PKCS11未找到」。在我的測試中我加載像這樣的密鑰庫:

char[] pin = "123456".toCharArray(); 
KeyStore ks = KeyStore.getInstance("PKCS11", p); 
ks.load(null, pin); 

在另一方面插槽0的PKCS11工具返回:

Slot 0 CCID Compatible
token model: PKCS#15 emulated

從Java似乎訪問插槽卡0(至少沒有返回錯誤),我可能在訪問密鑰庫時做了其他的錯誤。我如何訪問私鑰?

回答

0

好的,我找到了解決方案。

爲什麼插槽0看起來完全是空的。插槽1和2具有私鑰,但受到不同(本地)PIN的保護。使用netkey-tool,我可以將本地PIN設置爲全局PIN。之後訪問該卡沒有任何缺陷。

+0

您可以在配置文件中設置「plug_and_play = false」來禁用hotplug功能。或者不要依賴PKCS#11插槽索引,而是搜索所有插槽(有時候很難..) – 2011-06-22 14:09:04

+0

謝謝你的提示! 「配置文件」是指opensc.conf,是嗎?我們轉移到了另一個不受opensc支持的智能卡。所以我需要找到一個新的解決方案。幸運的是目前它正在運行。 – 2011-07-27 14:46:03