【发布时间】:2018-06-21 15:42:15
【问题描述】:
问题是为什么 jarsigner 有时会覆盖 MANIFEST.MF 文件,而不是仅仅将签名条目附加到正在签名的 jar 中的现有 MANIFEST.MF 文件中。
注意:我将此作为开放式问题发布,并将针对我遇到的导致此问题的一种情况提供答案或观察。如果还有其他可能发生这种情况的情况或情况,希望其他人会在发布的问题上进行扩展。
【问题讨论】:
标签: jarsigner manifest.mf
问题是为什么 jarsigner 有时会覆盖 MANIFEST.MF 文件,而不是仅仅将签名条目附加到正在签名的 jar 中的现有 MANIFEST.MF 文件中。
注意:我将此作为开放式问题发布,并将针对我遇到的导致此问题的一种情况提供答案或观察。如果还有其他可能发生这种情况的情况或情况,希望其他人会在发布的问题上进行扩展。
【问题讨论】:
标签: jarsigner manifest.mf
这是我看到的一种情况。我有一个 gradle 构建,它构建了一个使用 jarsigner 创建的调试和发布签名 jar。调试 jar 由 android studio 提供的默认“debug.keystore”签名,发布 jar 由我的私有密钥库签名。出于实际目的,这两个罐子几乎相同。两者都包含相同的 META-INF/MANIFEST.MF 条目。调试 jar 的 jarsigner 覆盖了 MANIFEST.MF 条目。它只包含签名条目。另一方面,发布 jar 的 jarsigner 按预期将签名条目附加到现有 MANIFEST.MF 文件的末尾。只是为了好玩,我复制了“debug.keystore”并将其重命名并尝试将其用于密钥库。清单文件仍然被覆盖。然后我创建了一个私有密钥库,并使用与 debug.keystore 中包含的相同的密钥别名 cn、o、ou 创建它。这次清单文件被附加到而不是被覆盖。这似乎暗示有一些与密钥库本身相关的东西决定了 MANIFEST.MF 文件是否被覆盖。很奇怪,但这是我观察到的。
经过进一步调查,我发现我的原始 MANIFEST.MF 文件不包含“Manifest-Version”标头条目。所以我添加了条目并再次尝试使用原始的“debug.keystore”对调试 jar 进行签名。这一次,两个 jar 都将签名条目附加到现有 MANIFEST.MF 文件的末尾,而不是覆盖 MANIFEST.MF 文件的调试 jar。从那个观察来看,我们都可以说,这是有道理的。但谁能想到。我当然无法在任何地方找到该行为的记录。
【讨论】:
呃,我自己的 2 美分就是简单地将 jarsigner 插件升级到版本 3.0.0 解决了问题(原始清单条目保持不变)
在 pom.xml 中:
...
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-jarsigner-plugin</artifactId>
<version>3.0.0</version>
<executions>
<execution>
<id>sign</id>
<goals>
<goal>sign</goal>
</goals>
</execution>
</executions>
<configuration>
<keystore>mykeystore.jks</keystore>
<alias>myalias</alias>
<storepass>password</storepass>
<keypass>password</keypass>
</configuration>
</plugin>
...
当然,可能还会出现其他问题 - 例如。在我的情况下 ClassNotFoundException 仍然被抛出 - 因为事实证明有一些 bouncycastle .SF 和 .DSA 文件包含在我的 JAR 的 META-INF 文件夹中,由阴影插件从 bouncycastle 签名的 JAR 中携带 - 它们干扰了后来的签名我使用 jarsigner 插件,在使用 java -jar myjar.jar 运行生成的 jar 时导致 this error
【讨论】: