39

我有一个 Maven 项目,我正在尝试将其配置为使用 Maven 发布插件。发布过程的一部分是使用 Maven GPG 插件对工件进行签名,这需要 GPG 签名密钥密码短语才能成功。因为这些构建需要在非交互式环境中运行,(CI-Server)这些参数作为参数传递给 maven,形式为

-Dgpg.passphrase=XXX

对于快照构建,一切正常;Maven GPG 插件会看到传入的密码短语,按预期构建、签名和部署工件,但是,当我尝试使用发布插件时,系统会提示我输入 gpg 签名密钥密码。我已经阅读了几个关于类似问题的讨论,这些问题源于发布插件分叉另一个不接收传入参数的 maven 调用。最流行的修复似乎是像这样使用“arguments”参数:

-Darguments="-Dgpg.passphrase=XXX"

据说这会传递给分叉的实例,但不幸的是对我来说它并没有摆脱提示。

由于对工件进行签名并不是将发布工件部署到公共 maven 存储库的常见先决条件,并且可能大多数生产这些工件的实体都使用某种形式的 CI,我无法想象我是唯一遇到此问题的人。有没有人找到解决方法?

关于已接受答案的说明:

接受的解决方案将无法与 Maven 3.0 - 3.0.3 和 3.0.3 一起使用,这恰好是在 OSX Mountain Lion 上默认安装的 java。您需要升级到 3.0.4。

4

7 回答 7

33

只需在 settings.xml 的配置文件中设置它并默认激活它:

<settings>
  <profiles>
    <profile>
      <id>gpg</id>
      <properties>
        <gpg.executable>gpg2</gpg.executable>
        <gpg.passphrase>mypassphrase</gpg.passphrase>
      </properties>
    </profile>
  </profiles>
  <activeProfiles>
    <activeProfile>gpg</activeProfile>
  </activeProfiles>
</settings>

如您所见,您可以使用任何属性来执行此操作..例如,jarsigner 插件的其他用户名和密码等等。

这应该始终处于活动状态。它可能取决于使用较新的 Maven 版本,但您始终可以使用

mvn help:active-profiles

加密密码

评论和其他答案指出将密码保存在文件中是不安全的......这在一定程度上是正确的,但幸运的是 Maven 允许我们通过创建一个主密码然后加密设置中的所有密码来使其非常安全.xml 与它。

有关详细信息,请查看迷你指南密码加密

于 2013-01-09T20:31:39.367 回答
23

将 GPG 密码短语放在主目录中的文件中绝对是可怕的安全性。

相反,请使用 gpg-agent,因此您只需在每个会话中输入一次密码。安装后,您可以设置 shell 以执行以下操作:

eval $(gpg-agent --daemon --no-grab --write-env-file $HOME/.gpg-agent-info)
export GPG_TTY=$(tty)
export GPG_AGENT_INFO

然后更新您的插件以启用代理。您可以在 pom 中执行此操作,也可以在 settings.xml 中的配置文件中执行此操作可能会更好:

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <configuration>
    <useAgent>true</useAgent>
  </configuration>
</plugin>

或者在您的设置中执行此操作可能更好,更便携:

<profile>
  <id>gpg-profile</id>
  <properties>
    <gpg.useagent>true</gpg.useagent>
  </properties>
</profile>

然后在会话中第一次需要 gpg 密码时,会弹出一个对话框。此后,它每次都使用代理的密码。

于 2014-08-08T07:13:02.927 回答
6

如果您不想在 settings.xml 中使用明文密码并且不想/不能使用 gpg-agent,您可以设置密码加密

您首先需要为 maven 设置主密码(假设 maven 3.2.1+,否则您必须将密码作为参数传递):

mvn -emp

这将返回密码的加密版本。存储此密码~/.m2/settings-security.xml- 它应该如下所示:

<settingsSecurity>
  <master>{inY3jdvspkeO2RUTxzQ4xHPelos+9EF1iFQyJQ=}</master>
</settingsSecurity>

然后使用以下命令加密密钥密码:

mvn -ep

并使用生成的加密密码settings.xml(配置文件 id 需要与您使用的配置文件相匹配,这里我使用过,release因此您需要像运行 maven 一样mvn -P release release:prepare etc.- 或者您可以将其作为活动配置文件的一部分,如另一个答案中所述):

<servers>
  <server>
    <id>gpg.passphrase</id>
    <passphrase>{inY3jdvspkeO2RUTxzQ4xHPelos}</passphrase>
  </server>
</servers>

<profiles>
  <profile>
    <id>release</id>
    <properties>
      <gpg.keyname>6DF60995</gpg.keyname>
    </properties>
  </profile>
</profiles>
于 2015-06-18T12:24:29.860 回答
2

结合此处的答案和插件官方文档,我设法使其与settings.xml 中的加密密码(记录在此处)一起工作。

设置.xml:

<?xml version="1.0" encoding="UTF-8"?>
 <settings xmlns="http://maven.apache.org/SETTINGS/1.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation="http://maven.apache.org/SETTINGS/1.0.0 https://maven.apache.org/xsd/settings-1.0.0.xsd">
   <servers>
     <server>
       <id>YOUR_KEY_ID</id>
       <passphrase>YOUR_KEY_ENCRYPTED_PASSPHRASE</passphrase>
     </server>
   </servers>
   <profiles>
     <profile>
       <id>my-release</id>
       <activation>
         <!-- I run explicitly with "-Pmy-release". Change this to "true" if you don't want to. -->
         <activeByDefault>false</activeByDefault>
       </activation>
       <properties>
         <gpg.keyname>YOUR_KEY_ID</gpg.keyname>
       </properties>
     </profile>
   </profiles>
 </settings>

pom.xml 中的 maven-gpg-plugin 部分:

<!-- Sign with GPG (properties are in ~/.m2/settings.xml) -->
<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <version>1.6</version>
  <executions>
    <execution>
      <id>sign-artifacts</id>
      <phase>verify</phase>
      <goals>
        <goal>sign</goal>
      </goals>
      <configuration>
        <useAgent>true</useAgent>
        <keyname>${gpg.keyname}</keyname>
        <passphraseServerId>${gpg.keyname}</passphraseServerId>
        <gpgArguments>
          <arg>--batch</arg>
          <arg>--pinentry-mode</arg>
          <arg>loopback</arg>
        </gpgArguments>
      </configuration>
    </execution>
  </executions>
</plugin>

Maven版本:3.6.3

于 2021-04-13T04:40:13.103 回答
2

接受的答案对我不起作用(使用 Maven 3.6.2)。对我有用的是更新 maven-gpg-plugin 配置:

<plugin>
  <artifactId>maven-gpg-plugin</artifactId>
 ....
  <configuration>
    <useAgent>true</useAgent>
    <passphrase>${env.GPG_PASSPHRASE}</passphrase>
    <gpgArguments>
      <arg>--batch</arg>
      <arg>--pinentry-mode</arg>
      <arg>loopback</arg>
    </gpgArguments>
  </configuration>
....
</plugin>
于 2020-09-17T16:30:17.087 回答
1

settings.xml 中的 GPG 密码是有效的解决方案,但它是打开的,这很糟糕。我在项目中使用的替代解决方案如下:

stty -echo && printf "GPG password: " && read gpgPwd && printf '\n' && stty echo
mvn release:prepare -Darguments="-Dgpg.passphrase=$gpgPwd"
git push
git push --tags
mvn release:perform -Darguments="-Dgpg.passphrase=$gpgPwd"
unset gpgPwd

其他必需的配置:

export GPG_TTY=$(tty) (in the ~/.bash_profile)
maven-release-plugin/configuration/pushChanges=false (in the root pom.xml)
于 2014-09-21T20:54:21.287 回答
0

配置maven-gpg-plugin非常复杂,并且取决于本机操作系统功能。

maven-gpg-plugin我们可以使用另一个专为在 CI/CD 环境中使用而设计的插件,而不是与所有困难作斗争。

您可以尝试https://www.simplify4u.org/sign-maven-plugin/,这是可以替换maven-gpg-plugin的。

的所有配置参数sign-maven-plugin都可以作为环境变量传递。

在 Maven 项目中,我们替换maven-gpg-plugin为:

<plugins>
    <plugin>
        <groupId>org.simplify4u.plugins</groupId>
        <artifactId>sign-maven-plugin</artifactId>
        <version><!-- check releases page --></version>
        <executions>
            <execution>
                <goals>
                    <goal>sign</goal>
                </goals>
            </execution>
        </executions>
    </plugin>
</plugins>

在 CI 系统中,我们为构建设置环境变量:

  • SIGN_KEY - 装甲 GPG/PGP 钥匙
  • SIGN_KEY_ID - 十六进制格式的密钥 ID - 如果未提供,将使用来自 SIGN_KEY 的第一个密钥
  • SIGN_KEY_PASS - 解密私钥的密码

此外,sign-maven-plugin如果配置项不可用,我们不需要特殊配置文件来默认激活/停用签名,插件跳过执行而不会出错。

于 2021-02-02T15:26:12.787 回答