27

我们有几个构建在构建服务器上的 Maven 项目。在某些情况下,我们希望签署我们的可交付成果。我们使用Maven Jarsigner 插件来做到这一点。

我们面临以下问题:

  • 我们应该将签名的密码存储在哪里?
  • 签署maven项目的好策略是什么?

我们不想将我们的密钥库放在我们的服务器上的某个地方并硬编码到它的路径。所以我们只是将这个密钥库包装在一个 jar 中,并将其作为工件上传到我们内部的 maven 存储库。当我们想要签署一个 maven 项目时,我们使用Maven 依赖插件下载密钥库工件并将签名目标附加到 maven 构建生命周期。这里有更详细的信息。

为了隐藏密钥库的密码,我们将它们放入公司pom.xml文件中。我们还考虑将密码存储在settings.xml构建服务器上。

当一个项目在开发者机器上构建和签名时,我们使用自签名证书对其进行签名。但是当项目在构建服务器上构建和签名时,我们使用我们的“官方”证书对其进行签名。

这是一个好的策略吗?

4

1 回答 1

33

我使用 2 个密钥库:

  • 存储在 SCM 中的开发密钥库。CI 服务器因此可以对快照进行签名。
  • 具有由受信任的证书颁发机构颁发的真实生产证书的生产密钥库。

开发密钥库密码位于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只要除了您之外没有人可以读取文件,就可以存储密码。

于 2010-09-01T17:22:07.697 回答