使用 Maven 发布插件时避免 gpg 签名提示
Posted
技术标签:
【中文标题】使用 Maven 发布插件时避免 gpg 签名提示【英文标题】:Avoid gpg signing prompt when using Maven release plugin 【发布时间】:2013-01-01 21:48:45 【问题描述】:我有一个 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。
【问题讨论】:
如果您想对已接受的答案发表评论,请使用该答案下方的评论选项 【参考方案1】:只需在 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
加密密码
cmets 和其他答案指出将密码保存在文件中是不安全的......这在一定程度上是正确的,但幸运的是 Maven 允许我们通过创建一个主密码然后加密所有settings.xml 中的密码。
详情请查看迷你指南Password Encryption。
【讨论】:
这将如何与已经定义了默认配置文件的 pom.xml 一起使用?我无法将这些属性添加到 pom.xml 中的相应默认配置文件,因为该项目是开源的,我不希望 gpg 签名密码与 pom.xml 的其余部分一起公开。 这是在 settings.xml 而不是在 pom 中。并且适用于所有项目,包括您的开源项目。事实上,配置文件不应该在 pom 中。 请记住,设置中的配置文件将始终被继承到有效的 pom 中,无论您的 pom 文件中有什么。 Maven 3.0.3 和 gpg 插件 1.4 是的 - 升级到 3.0.4 解决了这个问题!【参考方案2】:将您的 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 密码时,会弹出一个对话框。之后每次都使用代理的密码。
【讨论】:
这完全有效并且是正确的方法。此外,gpg.useagent 默认为 true,因此我无需更改任何插件设置。 但这是否仍然在第一次提示输入密码?如果是这样,这正是这个问题要求避免的,因为它必须在 CI 环境中自动工作。【参考方案3】:如果您不想在 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>
【讨论】:
【参考方案4】:接受的答案对我不起作用(使用 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】:结合这里的答案和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】: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)
【讨论】:
【参考方案7】: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_KEY - 装甲 GPG/PGP 钥匙 SIGN_KEY_ID - 十六进制格式的密钥 ID - 如果未提供,将使用来自 SIGN_KEY 的第一个密钥 SIGN_KEY_PASS - 用于解密私钥的密码同样对于sign-maven-plugin
,如果配置项不可用,默认情况下我们不需要特殊配置文件来激活/停用签名插件跳过执行而不会出错。
【讨论】:
以上是关于使用 Maven 发布插件时避免 gpg 签名提示的主要内容,如果未能解决你的问题,请参考以下文章
[Publish AAR To Maven] 使用GPG对文件进行签名加密
对于使用 WSL2 进行签名的 git 提交,Windows 10 上的 Visual Studio Code 中没有 GPG 密码提示
选择 maven-gpg-plugin 中使用的 GnuPG 密钥