我正在尝试在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上的卡(至少没有返回错误),因此在访问密钥库时我可能正在做其他事情。如何访问私钥?