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

时间:2010-07-21 14:31:29

标签: java linux pkcs#11

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

但是当我尝试从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);

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

Slot 0 CCID Compatible
token model: PKCS#15 emulated

由于Java似乎访问插槽0上的卡(至少没有返回错误),我可能在访问密钥库时做了其他错误。如何访问私钥?

1 个答案:

答案 0 :(得分:0)

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

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