如何在Linux上使用Java访问智能卡?

我试图访问虚拟机上的Linux系统上的智能卡。 USB设备映射到虚拟机,可以通过lsusb(ID 076b:3021 OmniKey AG CardMan 3121)列出。 我可以通过pkcs11-tool和pkcs15-tool访问智能卡。 另外firefox可以通过/usr/lib/opensc-pkcs11.so库访问令牌。

但是当我尝试从Java访问智能卡时,会返回一个空的密钥库。 我正在使用sun.security.pkcs11.SunPKCS11提供程序的以下configuration。

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

当使用不同的插槽(我尝试插槽0-15)时,我得到CKR_PIN_INCORRECT错误或“未findPKCS11”。 在我的testing中,我正在像这样加载密钥库:

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

另一方面,pkcs11工具返回插槽0:

Slot 0 CCID Compatible
token model: PKCS#15 emulated

由于Java似乎访问插槽0上的卡(至less不会返回任何错误),所以在访问密钥库时可能会遇到其他问题。 我怎样才能访问私钥?

好的,我找到了解决办法。

为什么插槽0似乎是空的。 时隙1和2具有私钥,但受到不同(本地)PIN的保护。 使用netkey-tool,我可以将本地PIN码设置为全局PIN码。 之后访问该卡没有任何缺陷。