【问题标题】:Unable to load PKCS11 driver using IAIK PKCS11 Wrapper无法使用 IAIK PKCS11 Wrapper 加载 PKCS11 驱动程序
【发布时间】: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


【解决方案1】:

正如EJP 在问题正下方的 cmets 中所指出的,ca2-v34.dll 是 32 位 dll。制造商提供的示例 USB 令牌管理器是一个32 位全软件,因此它可以在 Windows 32 和 Windows 64 上加载此 dll 文件。

JRE的场景不同:

  • 如果客户端计算机安装了 JRE 32bit,Java 应用程序(.jar 文件)可以正常运行,因为 JVM 的进程是 32bit 进程
  • 另一种情况是客户端计算机安装了JRE 64bit,Java应用程序无法正常运行,因为本例中的JVM是64bit进程,可以加载Java 应用程序(.jar 文件)但由于此 dll 文件是 32 位 dll 的原因而无法加载文件“ca2-v34.dll”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-04-04
    • 2018-06-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多