Maven 正在尝试在settings.xml中加密gpg密码

Maven 正在尝试在settings.xml中加密gpg密码,maven,gnupg,password-encryption,Maven,Gnupg,Password Encryption,我有一个maven构建,它试图利用maven gpg插件。如果我在settings.xml中有一个明文密码,那么一切正常。如果粘贴加密密码,则会出现“坏密码”错误。下面是我的详细步骤,但你知道我做错了什么吗?另外,作为一个附带问题,我很惊讶多次运行“mvn-ep”会得到不同的结果。我本以为能够解密,同样的结果应该会被返回。我很想得到一个解释 首先,我生成并分发了我的密钥对,如下所示。接下来,我用密码更新了~/.m2/settings.xml文件,如下所示。最后,我建立了。它工作得很好。是时候加密

我有一个maven构建,它试图利用maven gpg插件。如果我在settings.xml中有一个明文密码,那么一切正常。如果粘贴加密密码,则会出现“坏密码”错误。下面是我的详细步骤,但你知道我做错了什么吗?另外,作为一个附带问题,我很惊讶多次运行“mvn-ep”会得到不同的结果。我本以为能够解密,同样的结果应该会被返回。我很想得到一个解释

首先,我生成并分发了我的密钥对,如下所示。接下来,我用密码更新了~/.m2/settings.xml文件,如下所示。最后,我建立了。它工作得很好。是时候加密了

接下来,我创建了一个(maven)主密码,将其放入settings-security.xml中,对gpg密码进行加密,然后将其放入settings.xml中。(我以各种方式尝试过,包括在每个阶段都使用相同的密码。)现在,当我尝试构建时,会出现以下错误:

gpg: no default secret key: Bad passphrase
gpg: signing failed: Bad passphrase
如果我将settings.xml中的密码改回明文,事情就会重新开始。如果我在maven构建中添加“-X”,我会看到它正在查找settings-security.xml。(实际上,如果我删除文件,我只能在它找不到的时候才能看到。)

gpg--gen键
gpg——密钥服务器hkp://pool.sks-keyservers.net --发送密钥
mvn清洁gpg:标志
mvn-emp
mvn-ep
mvn清洁gpg:标志
pom.xml:

<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>

<groupId>example</groupId>
<artifactId>example.test</artifactId>
<version>develop-SNAPSHOT</version>
<packaging>pom</packaging>

<build>
    <plugins>
        <plugin>
            <groupId>org.apache.maven.plugins</groupId>
            <artifactId>maven-gpg-plugin</artifactId>
            <version>1.6</version>
            <executions>
                <execution>
                    <goals>
                       <goal>sign</goal>
                    </goals>
                </execution>
            </executions>
        </plugin>
    </plugins>
</build>

</project>

4.0.0
例子
例如:测试
开发快照
聚甲醛
org.apache.maven.plugins
maven gpg插件
1.6
签名
settings.xml:

<?xml version="1.0" encoding="UTF-8" ?>
<settings>
<profiles>
    <profile>
        <id>ossrh</id>
        <activation>
            <activeByDefault>true</activeByDefault>
        </activation>
        <properties>
            <gpg.executable>gpg</gpg.executable>
            <gpg.passphrase>{pQ...lV}</gpg.passphrase>
        </properties>
    </profile>
</profiles>
</settings>

ossrh
真的
gpg
{pQ…lV}
settings-security.xml:

<settingsSecurity>
<master>{KC...jm}</master>
</settingsSecurity>

{KC…jm}
我很惊讶多次运行
mvn-ep
会得到不同的结果。我本以为能够解密,同样的结果应该会被返回。我很想得到一个解释

加密方案添加了一个随机和,从而产生非确定性加密文本<代码>解密(加密(纯文本))还是确定性的,因为省略了填充和初始化向量


IV和填充可以防止若干选定的和已知的纯文本攻击。

仔细阅读,似乎只有settings.xml中的“servers”部分可以使用加密密码。然而,使用来自的信息,我能够让我的上述用例工作。我所做的大部分是正确的,我只需要做以下修改

1) 我将pom.xml执行部分改为:

    <executions>
      <execution>
        <goals>
          <goal>sign</goal>
        </goals>
        <configuration>
          <keyname>${gpg.keyname}</keyname>
          <passphraseServerId>${gpg.keyname}</passphraseServerId>
        </configuration>
      </execution>
    </executions>

签名
${gpg.keyname}
${gpg.keyname}
2) 我得到了我的公共gpg密钥(“gpg——列表密钥| grep^pub”,8个十六进制数字的值)。我将在下一步中将其列为A1234567

3) 我更新了settings.xml,如下所示:

<?xml version="1.0" encoding="UTF-8" ?>
<settings>
  <profiles>
    <profile>
      <id>ossrh</id>
      <activation>
        <activeByDefault>true</activeByDefault>
      </activation>
      <properties>
        <gpg.executable>gpg</gpg.executable>
        <gpg.keyname>A1234567</gpg.keyname>
      </properties>
    </profile>
  </profiles>
  <servers>
    <server>
      <id>A1234567</id>
      <passphrase>{pQ...lV}</passphrase>
    </server>
  </servers>
</settings>

ossrh
真的
gpg
A1234567
A1234567
{pQ…lV}

4) “mvn clean gpg:sign”不起作用,但“mvn clean install”起作用。我真正的用例是让“mvn干净安装”工作,所以我没有费心去弄清楚这一点。(我敢打赌这与生命周期阶段有关。)

要在Maven
settings.xml
中使用加密的GPG密码,您必须将其放入
服务器
块中,并将
GPG.passphrase
作为服务器ID。这很奇怪,但实际上是文档中隐藏的方法:

例如,一旦您拥有加密密码,即
{asdf1234}
,请按如下方式进行设置:

<server>
   <id>gpg.passphrase</id>
   <passphrase>{asdf1234}</passphrase>
</server>

gpg.passphrase
{asdf1234}
然后,当您运行调用
Maven gpg插件的Maven命令时,它将自动从那里获取密码短语

<server>
   <id>gpg.passphrase</id>
   <passphrase>{asdf1234}</passphrase>
</server>