签署 JAR 时防止密码短语请求

Prevent Passphrase request when signing JAR

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

我使用 this 页面作为如何设置 Maven 的指导 settings.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>

上面的环境变量是在环境中设置的

以及 this question 中的 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

Plugin docs 说默认的可执行文件是 gpg。如果配置文件未启用,它会选择您想要的 gpg2 吗? useAgent == 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 文件,试试这个(根据我对目标的阅读和 usage docs):

<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 profile docs (强调我的):

will automatically be active for all builds unless another profile in the same POM is activated using one of the previously described methods. All profiles that are active by default are automatically deactivated when a profile in the POM is activated on the command line or through its activation config.

这导致我 "fun" 调试会话,而且我已经看到它也吸引了许多其他毫无戒心的开发人员。

问题的发生是因为我试图使用 gpg2 而不是 gpg,因为我假设 gpg2 更好(没有实际研究)。 gpg 2 的手册页指出:

In contrast to the standalone command gpg from GnuPG 1.x, which is might be better suited for server and embedded platforms, the 2.x version is commonly installed under the name gpg2 and targeted to the desktop as it requires several other modules to be installed.

gpg2 是针对桌面的,因此我假设是 'hard-coded' 来询问密码,实际上我应该使用 gpg.