【问题标题】:What causes jarsigner to overwrite MANIFEST.MF是什么导致 jarsigner 覆盖 MANIFEST.MF
【发布时间】:2018-06-21 15:42:15
【问题描述】:

问题是为什么 jarsigner 有时会覆盖 MANIFEST.MF 文件,而不是仅仅将签名条目附加到正在签名的 jar 中的现有 MANIFEST.MF 文件中。

注意:我将此作为开放式问题发布,并将针对我遇到的导致此问题的一种情况提供答案或观察。如果还有其他可能发生这种情况的情况或情况,希望其他人会在发布的问题上进行扩展。

【问题讨论】:

    标签: jarsigner manifest.mf


    【解决方案1】:

    这是我看到的一种情况。我有一个 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】:

      呃,我自己的 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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-03-04
        • 2018-04-09
        • 1970-01-01
        • 1970-01-01
        • 2015-07-25
        • 1970-01-01
        • 2015-10-02
        • 1970-01-01
        相关资源
        最近更新 更多