我有一个Maven项目,我正在尝试配置为使用maven发布插件。发布过程的一部分是使用Maven GPG插件来签署工件,这些工件需要GPG签名密钥密码才能成功。因为这些构建需要在非交互式环境中运行,(CI-Server)这些参数作为参数传递给maven,形式为
-Dgpg.passphrase=XXX
对于快照构建,一切正常; Maven GPG插件看到传入的密码短语,工件按预期构建,签名和部署,但是,当我尝试使用发布插件时,系统会提示我输入gpg签名密钥密码。我已经阅读了几个关于类似问题的讨论,这些讨论来自于发布插件,这个问题是另一个maven的调用,它没有收到传入的参数。最流行的修复似乎是使用“arguments”参数,如下所示:
-Darguments="-Dgpg.passphrase=XXX"
据说这会传递给分叉的实例,但不幸的是,它并没有消除提示。
由于签名工件不是将发布工件部署到公共maven repos的不常见的先决条件,并且大概产生这些工件的大多数实体都使用某种形式的CI,我无法想象我是唯一遇到此问题的人。有人找到了解决方法吗?
关于接受回答的说明:
接受的解决方案将无法与Maven 3.0 - 3.0.3和3.0.3一起使用,恰好在OSX Mountain Lion上默认安装java。 See here了解详情。您需要升级到3.0.4。
答案 0 :(得分: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>
如你所见,你可以用任何财产做到这一点......例如还有jarsigner插件的其他用户名和密码等。
这应始终有效。它可能取决于使用较新的Maven版本,但您始终可以使用
进行调试mvn help:active-profiles
加密密码
评论和其他答案指出,将密码保存在文件中并不安全...这在某种程度上是正确的,但幸运的是Maven允许我们通过创建一个主密码然后加密所有带有密码的settings.xml中的密码。
有关详细信息,请查看迷你指南Password Encryption。
答案 1 :(得分: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
然后更新您的插件以启用代理。您可以在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密码短语时,会弹出一个对话框。每次之后,它都会使用代理的密码。
答案 2 :(得分:6)
如果您不想在settings.xml中以明文形式提供密码,并且不想/不能使用gpg-agent,则可以setup password encryption。
首先需要为maven设置主密码(假设maven为3.2.1+,否则你必须将密码作为参数传递):
mvn -emp
这将返回密码的加密版本。将此密码存储在~/.m2/settings-security.xml
中 - 它应如下所示:
<settingsSecurity>
<master>{inY3jdvspkeO2RUTxzQ4xHPelos+9EF1iFQyJQ=}</master>
</settingsSecurity>
然后使用以下方法加密密钥密码:
mvn -ep
并在settings.xml
中使用生成的加密密码(个人资料ID需要与您使用的个人资料相匹配,此处我使用了release
,因此您需要像mvn -P release release:prepare etc.
一样运行maven - 或者,您可以将其作为活动配置文件的一部分,详见另一个答案):
<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>
答案 3 :(得分: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)
答案 4 :(得分:1)
接受的答案对我不起作用(使用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>
答案 5 :(得分:1)
结合此处的答案和 plugin official documentation,我设法使用 settings.xml 中的加密密码 (documented here) 使其工作。
settings.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
答案 6 :(得分:0)
maven-gpg-plugin
的配置非常复杂,并且取决于本机操作系统功能。
我们可以使用另一个专为在 CI/CD 环境中使用而设计的插件,而不是用 maven-gpg-plugin
与各种困难作斗争。
你可以试试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-maven-plugin
,如果配置项不可用,默认情况下我们不需要特殊的配置文件来激活/停用签名,插件跳过执行没有错误。