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

时间:2018-01-22 19:13:33

标签: java maven gnupg pgp maven-gpg-plugin

我正在尝试设置我的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 questionmaven-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

2 个答案:

答案 0 :(得分:0)

Plugin docs表示默认可执行文件为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文件执行此操作,请尝试此操作(根据我对目标的读取和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 (强调我的):

  

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

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

答案 1 :(得分:0)

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

  

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

gpg2针对的是桌面,因此我假设它是“硬编码的”#39;要求输入密码,我实际上应该使用gpg