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

Ulf*_*rig 5 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
Run Code Online (Sandbox Code Playgroud)

使用其他插槽(我尝试使用0-15插槽)时,出现CKR_PIN_INCORRECT错误或“找不到PKCS11”。在我的测试中,我正在像这样加载密钥库:

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

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

Slot 0 CCID Compatible
token model: PKCS#15 emulated

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

Ulf*_*rig 1

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

为什么插槽 0 似乎根本是空的。插槽 1 和插槽 2 有私钥,但受到不同(本地)PIN 的保护。使用 netkey-tool,我可以将本地 PIN 设置为全局 PIN。之后访问该卡就可以正常工作了。