2

我正在尝试对 XML 文档进行数字签名。为此,我有 2 个选择。有一个由爱沙尼亚认证中心创建的程序员库,还有一个由银行制作的运行 Java 代码的脚本。如果使用官方(认证中心)库,那么一切都会像一个魅力一样进行一些调整,但是当涉及到银行脚本时,它就会变得疯狂,导致错误:

java.io.IOException: %1 is not a valid Win32 application.
esteid-pkcs11
        at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.connect(Native Method)
        at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.<init>(PKCS11Implementation.java:166)
        at iaik.pkcs.pkcs11.wrapper.PKCS11Connector.connectToPKCS11Module(PKCS11Connector.java:75)
        at iaik.pkcs.pkcs11.Module.getInstance(Module.java:202)
        at client.smartcard.SmartcardHelper.initializePKCS11Module(SmartcardHelper.java:46)
        at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:29)
        at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:21)
        at client.Signer.main(Signer.java:36)
10:03:31 ERROR - Signing failed: PKCS11 initialization failed
java.lang.RuntimeException: PKCS11 initialization failed
        at client.smartcard.SmartcardHelper.initializePKCS11Module(SmartcardHelper.java:52)
        at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:29)
        at client.smartcard.SmartcardHelper.initialize(SmartcardHelper.java:21)
        at client.Signer.main(Signer.java:36)
Caused by: java.io.IOException: %1 is not a valid Win32 application.
esteid-pkcs11
        at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.connect(Native Method)
        at iaik.pkcs.pkcs11.wrapper.PKCS11Implementation.<init>(PKCS11Implementation.java:166)
        at iaik.pkcs.pkcs11.wrapper.PKCS11Connector.connectToPKCS11Module(PKCS11Connector.java:75)
        at iaik.pkcs.pkcs11.Module.getInstance(Module.java:202)
        at client.smartcard.SmartcardHelper.initializePKCS11Module(SmartcardHelper.java:46)
        ... 3 more

Esteid-pkcs11file 是特定于国家/地区的 dll 文件。我在谷歌上阅读了很多关于导致相同错误的问题的回复,但似乎没有一个回复能解决问题。我已经安装了 JDK(64 位)和 JRE(32 位)。我以为.dll我尝试打开的文件可能是 32 位的,所以我将JAVA_HOME路径更改为指向 32 位 JRE,但后来它说类似

无法在 amd 64 位平台上加载 IA 32 位 .dll。

所以我认为这不是位的问题。在弄乱了环境变量几个小时后,我认为这可能是银行制作的脚本有问题。可以这样吗?如果不是还有什么可能导致此错误?

编辑:显然我尝试使用 C-library 进行签名并且它可以工作,但是当使用 Java-library 时,它给了我一个错误。

java.io.IOException: %1 is not a valid Win32 application. opensc-pkcs11.dll

我 100% 确定 opensc-pkcs11.dll 是 64 位 dll,但我想知道控制台是否无权访问 system32 文件夹。可以这样吗?

4

2 回答 2

3

错误

原因:java.io.IOException:%1 不是有效的 Win32 应用程序。

是我在 64 位 Java 环境中尝试通过 Sun PKCS#11 Provider 使用 32 位 PKCS#11 DLL 时得到的结果。

当我切换到 64 位 PKCS#11 DLL 时,错误停止发生。

我认为您的“esteid-pkcs11”文件是一个 32 位 DLL。

于 2018-02-16T10:07:14.383 回答
0

也许 opensc-pkcs11.dll 包含对同一目录中其他 dll 的引用。

我对 Gemalto (Safenet) crpytoki.dll 有类似的错误。解决方案是将包含 cryptoki.dll 的目录放入 Windows PATH。

于 2019-11-28T15:56:39.730 回答