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

Posted

技术标签:

【中文标题】java.io.IOException: %1 不是有效的 Win32 应用程序【英文标题】:java.io.IOException: %1 is not a valid Win32 application 【发布时间】:2013-06-20 07:43:54 【问题描述】:

我正在尝试对 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-pkcs11 文件是特定国家/地区的 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 文件夹。可以这样吗?

【问题讨论】:

"%1" 看起来像批处理脚本中缺少的占位符...看起来您需要将参数传递给它。 @echo off call env.bat java %JAVA_OPTIONS% client.Signer %* 这就是批处理脚本的样子。 调用批处理脚本时,我使用类似:"sign.bat signCert=idcard file=test.xml" 【参考方案1】:

错误

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

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

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

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

【讨论】:

在我的情况下,问题是 64 位窗口上的 32 位 JAVA【参考方案2】:

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

我在使用 Gemalto (Safenet) crpytoki.dll 时遇到了类似的错误。解决方案是将包含cryptoki.dll的目录放入Windows PATH中。

【讨论】:

以上是关于java.io.IOException: %1 不是有效的 Win32 应用程序的主要内容,如果未能解决你的问题,请参考以下文章

解决Caused by: java.io.IOException: java.io.IOException: error=12, Cannot allocate memory

任务 ':app:compileDebugKotlin' java.io.IOException 执行失败

java.io.IOException:没有 X-Jenkins-CLI2-Port(jenkins cli 不工作)

使用自定义字体 [java.io.IOException:读取字体数据时出错。]

java.io.IOException:无法解包数据,无效状态

为啥我收到 java.io.IOException: Mark has been invalidated?