无法使用IAIK PKCS11 Wrapper加载PKCS11驱动程序

时间:2013-01-08 09:45:22

标签: java java-native-interface pki pkcs#11 iaik-jce

我正在使用以下内容:

  • Windows 7 64位
  • JDK 7 64bit
  • JRE 7 64bit

新的有趣的JRE 7 64bit不再支持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文件,但它在某种程度上不兼容。我陷入了这个瓶颈。

1 个答案:

答案 0 :(得分:1)

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

JRE的情况不同:

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