使用Maven发布插件时,请避免使用gpg签名提示

Nic*_*ick 30 code-signing gnupg maven maven-release-plugin

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

-Dgpg.passphrase=XXX
Run Code Online (Sandbox Code Playgroud)

对于快照构建,一切正常; Maven GPG插件看到传入的密码短语,工件按预期构建,签名和部署,但是,当我尝试使用发布插件时,系统会提示我输入gpg签名密钥密码.我已经阅读了几个关于类似问题的讨论,这些讨论来自于发布插件,这个问题是另一个maven的调用,它没有收到传入的参数.最流行的修复似乎是使用"arguments"参数,如下所示:

-Darguments="-Dgpg.passphrase=XXX"
Run Code Online (Sandbox Code Playgroud)

据说这会被传递给分叉的实例,但不幸的是,它并没有消除提示.

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

关于接受的答案的注意事项:

接受的解决方案将无法与Maven 3.0 - 3.0.3和3.0.3一起使用,恰好是在OSX Mountain Lion上默认使用java安装的. 请参阅此处了解详情.您需要升级到3.0.4.

Man*_*ser 31

只需在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>
Run Code Online (Sandbox Code Playgroud)

你可以看到你可以用任何属性做到这一点..例如jarsigner插件的其他用户名和密码等等.

这应始终有效.它可能取决于使用较新的Maven版本,但您始终可以使用它进行调试

mvn help:active-profiles
Run Code Online (Sandbox Code Playgroud)

加密密码

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

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

  • 这是在settings.xml中而不是在pom中.并且适用于所有项目,包括开源项目.事实上,配置文件不应该在pom中. (2认同)
  • Maven 3.0.3 和 gpg 插件 1.4 (2认同)

gre*_*egw 21

将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
Run Code Online (Sandbox Code Playgroud)

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

<plugin>
  <groupId>org.apache.maven.plugins</groupId>
  <artifactId>maven-gpg-plugin</artifactId>
  <configuration>
    <useAgent>true</useAgent>
  </configuration>
</plugin>
Run Code Online (Sandbox Code Playgroud)

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

<profile>
  <id>gpg-profile</id>
  <properties>
    <gpg.useagent>true</gpg.useagent>
  </properties>
</profile>
Run Code Online (Sandbox Code Playgroud)

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

  • 但这仍然会在第一次提示输入密码吗?如果是这样,这正是这个问题要求避免的,因为它必须在 CI 环境中自动工作。 (2认同)

ass*_*ias 6

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

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

mvn -emp
Run Code Online (Sandbox Code Playgroud)

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

<settingsSecurity>
  <master>{inY3jdvspkeO2RUTxzQ4xHPelos+9EF1iFQyJQ=}</master>
</settingsSecurity>
Run Code Online (Sandbox Code Playgroud)

然后用以下密码加密密钥密码:

mvn -ep
Run Code Online (Sandbox Code Playgroud)

并使用生成的加密密码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>
Run Code Online (Sandbox Code Playgroud)