在签署 JAR 时阻止密码请求



我正在尝试设置我的 Maven 构建,以便它自动对 JAR 进行签名,而无需手动输入密码,但是无论我如何尝试配置maven-gpg-plugin它要么失败,要么总是要求输入密码。

我使用此页面作为有关如何设置Mavensettings.xml的指导:

<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 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<profiles>
<profile>
<id>ossrh</id>
<activation>
<activeByDefault>true</activeByDefault>
</activation>
<properties>
<gpg.executable>gpg2</gpg.executable>
<gpg.keyname>${env.GPG_KEY_NAME}</gpg.keyname>
<gpg.passphrase>${env.GPG_PASS_PHRASE}</gpg.passphrase>
</properties>
</profile>
</profiles>
<servers>
<server>
<id>ossrh</id>
<username>${env.OSSRH_JIRA_USERNAME}</username>
<password>${env.OSSRH_JIRA_PASSWORD}</password>
</server>
</servers>
</settings>

上述环境变量是在环境中设置的。

这个问题maven-gpg-plugin配置,我尝试按如下方式设置 POM:

<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>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>

但是当我构建时,我收到以下错误:gpg: setting pinentry mode 'loopback' failed: Not supported

我试图将allow-loopback-pinentry添加到gpg-agent.conf,但结果是一样的。 如果我从Maven插件配置中删除<gpgArguments>,则会收到弹出窗口,要求输入密码。

我正在使用 gpg2 版本 2.1.11

插件文档说默认可执行文件是gpg.如果未启用配置文件,它是否会选取您想要的gpg2useAgent== true 是默认值,对于每个文档的 gpg2,应该保持这种方式。

要使用代理,请尝试在插件而不是配置文件中配置可执行文件。

<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>
<executable>gpg2</executable>
<gpgArguments>
<arg>--pinentry-mode</arg>
<arg>loopback</arg>
</gpgArguments>
</configuration>
</execution>
</executions>
</plugin>

要在没有代理的情况下使用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>
<executable>gpg2</executable>
<keyname>${gpg.keyname}</keyname>
<passphraseServerId>${gpg.keyname}</passphraseServerId>
</configuration>
</execution>
</executions>
</plugin>
<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 http://maven.apache.org/xsd/settings-1.0.0.xsd">
<properties>
<gpg.keyname>${env.GPG_KEY_NAME}</gpg.keyname>
</properties>
<servers>
<server>
<id>${env.GPG_KEY_NAME}</id>
<passphrase>${env.GPG_PASS_PHRASE}</passphrase>
</server>
</servers>
</settings>

请注意,我没有按照他们的建议使用配置文件,因为根据 Maven 配置文件文档(强调我的):

将自动对所有构建处于活动状态,除非使用前面描述的方法之一激活同一 POM 中的另一个配置文件。当 POM 中的配置文件在命令行上或通过其激活配置激活时,默认情况下处于活动状态的所有配置文件都会自动停用。

这给我带来了"有趣"的调试会话,我也看到它吸引了许多其他毫无戒心的开发人员。

出现此问题的原因是我尝试使用gpg2而不是gpg,因为我认为gpg2更好(没有实际研究)。gpg 2 的手册页指出:

与来自 GnuPG 1.x 的独立命令 gpg 相反,它是 可能更适合服务器和嵌入式平台,2.x 版本通常以 GPG2 的名称安装,并针对 桌面需要 要安装的其他几个模块。

gpg2针对桌面,因此我假设是"硬编码"来询问密码,实际上我应该使用gpg

最新更新