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

5
我正在尝试在虚拟机上的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提供程序。
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-tool返回的是插槽0:

插槽0 CCID兼容
令牌型号:PKCS#15 模拟

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

1个回答

1

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

不过,插槽0似乎完全为空。插槽1和2有私钥,但是受到不同(本地)PIN的保护。使用netkey工具,我能够将本地PIN设置为全局PIN。之后,访问卡片就可以无缺陷地进行了。


您可以在配置文件中设置“plug_and_play = false”来禁用热插拔功能。或者不要依赖于PKCS#11插槽索引,而是搜索所有插槽(有时可能比较困难)。 - Martin Paljak
谢谢你的提示!你所说的“配置文件”是指opensc.conf吗?我们换了另一张智能卡,但它不再被opensc支持。因此,我需要找到一个新的解决方案。幸运的是,目前它正在工作。 - Ulf Jaehrig

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接