server.xml 如何为 Maven SSH 使用提供主机密钥

How to provide Host Key for Maven SSH usage in server.xml

在 Maven settings.xml 中,我想定义一个 SSH 服务器并提供:

我不想:

因此,StackExchange 上的现有答案对我没有帮助,其中包括:

这是我设想如何在 Maven 中设置它的示例 setup.xml:

<servers>
  <server>
    <id>gitcloud.myserver.net:8001</id>
    <username>git</username>
    <privateKey>C:/data/home/.ssh/id_rsa</privateKey>
    <configuration>
      <knownHostsProvider implementation="org.apache.maven.wagon.providers.ssh.knownhost.SingleKnownHostProvider">
        <hostKeyChecking>yes</hostKeyChecking>
        <contents>codecloud.web.att.com ssh-rsa XXXXA3NvvFakeSSHKEYsdfADA...doLQ==</contents>
      </knownHostsProvider>
    </configuration>
  </server>
</servers>

这是一个常见问题,您可以在 Internet 上找到许多人寻找正确的解决方案,他们试图用 SingleKnownHostsProvider 的实例覆盖 knownHostsProvider 实现,正如您在例如。

首先,这就是为什么这样做并不容易:

当存储库 URL 以 scp: 开头时,Maven 使用的组件管理器 Plexus 查找具有角色 org.apache.maven.wagon.Wagon 和提示 scp 的组件,并且在当前的 Wagon 实现(至少达到 3.0.1)中找到唯一符合这些需求的,即 class org.apache.maven.wagon.providers.ssh.jsch.ScpWagon。 class 在同一个包中扩展了 class AbstractJschWagon,而 后者 class 静态定义了一个 file 角色提示到 select一个KnownHostProvider实例。

因此,此 file 角色提示使 Plexus 使用 class FileKnownHostsProvider 来实例化一个 KnownHostsProvider 对象,该对象被赋予 ScpWagon 实例.这是因为 class FileKnownHostsProvider 在其源文件的开头定义如下:

public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
*    role-hint="file"

相反,class SingleKnownHostProvider 不是 定义角色提示 file 但角色提示 single:

public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
*    role-hint="single"

因此,绑定到这个不需要的(在您的情况下)FileKnownHostsProvider 是在 AbstractJschWagon 源文件中静态定义的。这就是全部难度。

现在,解决问题的方法如下:

使用此 Maven wagon 修补实施 available here on GitHub,通过 运行 这些步骤:

1- 在您的 pom.xml 中,您可能以这种方式定义了一些 Maven 扩展:

<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>3.0.1</version>
    </extension>
  </extensions>
</build>

请注意,您可以使用 3.0.1 以外的其他版本。

无论如何,通过特定版本 3.0.1-SINGLE 更改此定义:

<build>
  <extensions>
    <extension>
      <groupId>org.apache.maven.wagon</groupId>
      <artifactId>wagon-ssh</artifactId>
      <version>3.0.1-SINGLE</version>
    </extension>
  </extensions>
</build>

2- 这个特定的版本 3.0.1-SINGLE 是我打过补丁来解决这个非常常见的问题的 Wagon 版本,我也遇到过。它在 Maven Central 上不可用,但在 GitHub.

上可用

所以,您必须自己安装,例如以下方式:

% git clone https://github.com/AlexandreFenyo/maven-wagon.git
% cd maven-wagon
% mvn install

3- 现在,以这种方式配置您的 setup.xml

<servers>
  <server>
    <id>gitcloud.myserver.net:8001</id>
    <username>git</username>
    <privateKey>C:/data/home/.ssh/id_rsa</privateKey>
    <configuration>
      <hostKey>codecloud.web.att.com ssh-rsa XXXXA3NvvFakeSSHKEYsdfADA...doLQ==</hostKey>
    </configuration>
  </server>
</servers>

现在一切都应该像你想要的那样工作:如果 setup.xml 文件中定义的主机密钥是正确的,maven 将不会显示密钥指纹,也不会要求你验证这个主机密钥。

希望对您有所帮助。