如何在不破坏完整性检查的情况下对包装的罐子进行数字签名?

问题描述 投票:0回答:1

我有一个用 maven 构建的 java 项目。在打包阶段,代码被构建到一个 jar (maven-jar-plugin 3.1.1) 中并被包装到一个 .exe (launch4j-maven-plugin 1.7.25)

我的部分代码将 .exe 作为文件系统打开以获取资源。具体来说,使用java.nio.file.FileSystems.newFileSystem(URL url),传入exe

这个文件系统正确地识别出我的文件确实是一个包装好的 jar,并照原样读取它。

当我尝试对我的 .exe 文件进行数字签名时,这一切都崩溃了。对其进行数字签名后,我无法再在 Java 中将 exe 作为文件系统打开。我将其缩小到的具体错误位于 ZipFileSystem.java:991

            // Now scan the block backwards for END header signature
            for (int i = buf.length - ENDHDR; i >= 0; i--) {
                if (buf[i+0] == (byte)'P'    &&
                    buf[i+1] == (byte)'K'    &&
                    buf[i+2] == (byte)'\005' &&
                    buf[i+3] == (byte)'\006' &&
                    (pos + i + ENDHDR + ENDCOM(buf, i) == ziplen)) { -- this check fails. We find the header name, but the size check fails.

因此,对 .exe 文件进行数字签名会增加一些字节到我的文件大小,并导致 jar 文件的完整性检查总是失败。我尝试在包装 (jarsigner) 之前对 jar 进行签名,然后使用高级安装程序和 Jsign 对 exe 进行签名,但未能解决此问题。

将 jar 包装在一个 exe 中然后进行签名,导致 jar 变得无法被 java.nio.file.FileSystems 读取。我该怎么做才能解决这个问题?是否有签名者知道更新 jar 的完整性检查值?任何帮助表示赞赏

java maven maven-plugin digital-signature java-11
1个回答
0
投票

ZipFileSystem 设法读取嵌入可执行文件中的 jar,这真是太神奇了,但我不认为它打算以这种方式使用。

您可以通过使用类加载器而不是使用 NIO 文件系统从 jar 加载资源来解决此问题:

InputStream resource = Thread.currentThread().getContextClassLoader().getResourceAsStream("path/to/your/resource");
© www.soinside.com 2019 - 2024. All rights reserved.