1

我正在使用以下内容:

  • 视窗 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 is not a valid Win32 application。ca2-v34.dll

这个异常肯定意味着 IAIK 库找到了 .dll 文件,但它不兼容。我被困在这个瓶颈上。

4

1 回答 1

1

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

JRE的场景不同:

  • 如果客户端计算机安装了 JRE 32bit,Java 应用程序(.jar 文件)可以很好地运行,因为JVM 的进程是 32bit 进程
  • 另一种情况是客户端计算机安装了JRE 64bit,Java应用程序无法正常运行,因为JVM在这种情况下是一个64位进程,它可以加载Java应用程序(.jar文件)但无法加载文件'ca2- v34.dll' 由于这个 dll 文件是 32 位 dll 的原因。
于 2013-01-09T04:39:50.403 回答