Maven项目中的Jar签名策略

27
我们有几个基于构建服务器构建的Maven项目。在某些情况下,我们希望签署我们的交付成果。我们使用 Maven Jarsigner Plugin 实现这一点。
我们面临以下问题:
  • 应该将签名密码存储在哪里?
  • 签署Maven项目的好策略是什么?
我们不想将密钥库放在服务器上的任何位置并硬编码路径。因此,我们将此密钥库包装在一个JAR文件中,并将其作为工件上传到我们内部的Maven仓库。当我们想要签署Maven项目时,我们使用 Maven Dependency Plugin 下载密钥库工件,并将签名目标附加到Maven构建生命周期中。 这里 有更详细的信息。
为了隐藏密钥库的密码,我们将它们放入公司的 pom.xml 文件中。我们也考虑将密码存储在构建服务器上的 settings.xml 中。
当在开发人员机器上构建和签署项目时,我们使用自签名证书进行签署。但是当在构建服务器上构建和签署项目时,我们使用我们的“官方”证书进行签署。
这是一个好策略吗?
1个回答

33

我使用了2个 keystore:

  • 一个开发 keystore,存储在 SCM 中。这样 CI 服务器可以签署快照。
  • 一个生产 keystore,具有由受信任的认证机构颁发的真实生产证书。

开发 keystore 的密码在 pom.xml 文件中。以下是我的 pom.xml 代码片段:

  <plugin>
    <artifactId>maven-jarsigner-plugin</artifactId>
    <version>1.2</version>
    <configuration>
      <storetype>${keystore.type}</storetype>
      <keystore>${keystore.path}</keystore>
      <alias>${keystore.alias}</alias>
      <storepass>${keystore.store.password}</storepass>
      <keypass>${keystore.key.password}</keypass>
    </configuration>
  </plugin>
  <!-- 
      ... rest of the pom.xml ...
  -->
  <properties>
    <keystore.path>cert/temp.keystore</keystore.path>
    <keystore.type>JKS</keystore.type>
    <keystore.alias>dev</keystore.alias>
    <keystore.password>dev_password</keystore.password>
    <keystore.store.password>${keystore.password}</keystore.store.password>
    <keystore.key.password>${keystore.password}</keystore.key.password>
  </properties>

~/.m2/settings.xml 文件中,我定义了一个 codesgining 配置文件:

<settings>
  <profiles>
    <profile>
      <id>codesigning</id>
      <properties>
        <keystore.path>/opt/prod/prod.keystore</keystore.path> 
        <keystore.alias>prod</keystore.alias>
        <keystore.type>JKS</keystore.type>
        <keystore.store.password>${keystore.password}</keystore.store.password>
        <keystore.key.password>${keystore.password}</keystore.key.password>
      </properties>
    </profile>
  </profiles>
</settings>

当我想要签署真实证书时,我会使用带有 -Pcodesigning -Dkeystore.password=strongPassword 参数的 maven 命令。我还配置了 maven-release-plugin 使用 codesigning 配置文件。

实际上,只要文件仅限您本人阅读,就可以将密码存储在 settings.xml 中。


我们走了同样的路。只是生产密钥库密码存储在配置文件settings.xml中的配置文件中。而且该配置文件会被构建服务器自动调用。 - Maksim Sorokin
请注意,由于这个 bug:http://jira.codehaus.org/browse/MJARSIGNER-11,您的别名不能包含单引号字符。 - Jason Thrasher
1
从版本1.3开始,jar签名插件支持Maven加密。这使得在settings.xml中存储密码相对安全。有关详细信息,请访问http://maven.apache.org/guides/mini/guide-encryption.html。 - Rob
3
闭合设置标签缺少正斜杠。 - CodeBuddy

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接