【发布时间】:2013-01-08 09:45:22
【问题描述】:
我正在使用以下内容:
- Windows 7 64 位
- JDK 7 64 位
- JRE 7 64 位
新的有趣的 JRE 7 64 位不再支持 Sun PKCS11(位于包“sun.security.pkcs11”中)。而且最大的问题是我们公司产品的最终用户可能安装了任何版本的JRE。
所以我必须将“Sun PKCS11”中的现有代码换成“IAIK PKCS11 Wrapper”。 IAIK 的包装器就是这样工作的:
(iaik-wrapper.jar)->(iaik-pkcs11-jni.dll)->(pki-token-driver.dll)
PKI 令牌驱动程序动态链接库由 PKI USB 令牌制造商提供,实际名称为“ca2-v34.dll”。加载本机驱动的方法在程序员手册中描述如下:
import iaik.pkcs.pkcs11.*;
...
Module pkcs11Driver;
try {
pkcs11Driver = Module.getInstance("ca2-v34.dll"); //<--exception!
pkcs11Driver.initialize(null);
//test
System.out.println(pkcs11Driver.getInfo());
}
catch (Exception ex) {
System.out.println(ex);
}
在上面代码中标记的行引发了异常,详细信息如下:java.io.IOException: %1 不是有效的 Win32 应用程序。 ca2-v34.dll
这个异常肯定意味着 IAIK 库找到了 .dll 文件,但它不兼容。我被这个瓶颈困住了。
【问题讨论】:
-
看起来
ca2-v34.dll是一个 32 位 DLL。 -
我们的制造商提供的示例 USB 令牌管理器在 windows7-32 位和 windows7-64 位上都使用了这个 .dll 文件。我比较了这两个文件,它们是相同的,所以我相信这个 dll 可以在 32 位和 64 位中使用。
-
这仅意味着他们的软件始终是 32 位的。你不能在 64 位软件中使用 32 位 DLL,至少在没有构建 thunking 层的情况下不能这样做,如果这仍然可能的话:我们过去必须在 16-32 位转换中做一些事情。
-
谢谢。是的,你是对的,我必须暂时切换到 jre32 才能构建和运行。我将提交有关从制造商处获取 64 位驱动程序 dll 的请求。
标签: java java-native-interface pki pkcs#11 iaik-jce