我正在尝试从 iaik pkcs#11 包装器(1.3 版,最新的 atm)运行一个简单的示例代码,但随时NoSuchMethodError
待命pkcs11Module.initialize
。
Module pkcs11Module = Module.getInstance("siecap11");
pkcs11Module.initialize(null);
Slot[] slots = pkcs11Module.getSlotList(Module.SlotRequirement.TOKEN_PRESENT);
for (Slot s: slots) {
System.out.println(s.getSlotID());
}
pkcs11Module.finalize(null);
异常堆栈跟踪如下
java.lang.NoSuchMethodError: iaik.pkcs.pkcs11.wrapper.PKCS11.C_Initialize(Ljava/lang/Object;Z)V
at iaik.pkcs.pkcs11.Module.initialize(Module.java:308)
at test.pkcs11.Pkcs11Service.listSlotsWithTokens(Pkcs11Service.java:98)
at test.pkcs11.TestPkcs11Service.testListSlots(TestPkcs11Service.java:35)
类似的代码在 Linux 上运行良好,所以我猜 pkcs11wrapper.dll 有问题。
pkcs11wrapper.dll
和siecap11.dll
在c\windows\system32
目录中,并且都是 32 位模块。
我尝试了不同的 pkcs#11 提供程序、pkcs11wrapper 的调试和发布版本,但结果是相同的。
pkcs11wrapper.dll 的调试版本生成以下输出:
11/26/13 21:30:50 CALL: entering (in Java_iaik_pkcs_pkcs11_wrapper_PKCS11Implementation_initializeLibrary)
11/26/13 21:30:50 CALL: exiting (in Java_iaik_pkcs_pkcs11_wrapper_PKCS11Implementation_initializeLibrary)
11/26/13 21:30:50 CALL: entering (in Java_iaik_pkcs_pkcs11_wrapper_PKCS11Implementation_connect)
11/26/13 21:30:50 INFO: connect to PKCS#11 module: siecap11 ... (in Java_iaik_pkcs_pkcs11_wrapper_PKCS11Implementation_connect)
11/26/13 21:30:50 CALL: exiting (in Java_iaik_pkcs_pkcs11_wrapper_PKCS11Implementation_connect)
智能卡附带的实用程序运行良好,opensc pkcs11-tool 也是如此。
编辑:
使用版本 1.2.17 的 pkcs11 包装库及其随附的 dll,上面的代码可以正常工作。但最初的问题仍未解决。
编辑2:
SubOptimal 建议的以下代码生成以下输出。
@Test
public void testFindLibrary() {
String lineSeparator = System.getProperty("path.separator");
String libraryPath = System.getProperty("java.library.path");
for (String dir : libraryPath.split(lineSeparator)) {
File f = new File(dir + "/" + "pkcs11wrapper.dll");
if (f.exists()) {
System.out.println("found in: " + f.getAbsolutePath());
}
}
}
输出:
found in: C:\Windows\system32\pkcs11wrapper.dll
found in: C:\Windows\system32\pkcs11wrapper.dll
found in: C:\Windows\system32\pkcs11wrapper.dll