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

YoY*_*oYo 10 jsch maven maven-wagon-plugin

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

  • 要连接的主机
  • 要连接的用户
  • 私钥的位置(用于验证自己)
  • 手动提供主机密钥(验证服务器的公钥)

我不想:

  • 依赖于~/.ssh/known_hosts文件
  • 要求接受主机密钥
  • 忽略主机密钥验证

因此,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>
Run Code Online (Sandbox Code Playgroud)

Ale*_*nyo 4

这是一个常见问题,您可以在 Internet 上找到许多人寻找正确的解决方案,尝试使用 的knownHostsProvider实例覆盖实现SingleKnownHostsProvider,正如您在示例中所解释的那样。

首先,这就是为什么做到这一点并不容易:

当存储库 URL 以 开头时scp:,Maven 使用的组件管理器 Plexus 会查找具有角色org.apache.maven.wagon.Wagon和提示的组件scp,并找到当前 Wagon 实现中唯一符合这些需求的组件(至少到 3.0.1),那是阶级的org.apache.maven.wagon.providers.ssh.jsch.ScpWagonAbstractJschWagon这个类扩展了同一个包中的类,并且后一个类静态地定义了一个file角色提示来选择一个KnownHostProvider实例。

因此,此file角色提示使 Plexus 使用该类FileKnownHostsProvider来实例化KnownHostsProvider提供给实例的对象ScpWagon。这是因为该类FileKnownHostsProvider在其源文件的开头按以下方式定义:

public class FileKnownHostsProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
*    role-hint="file"
Run Code Online (Sandbox Code Playgroud)

相反,类SingleKnownHostProvider不是用 role-hint 定义的,而是用 role-hint 定义filesingle

public class SingleKnownHostProvider
[...]
* @plexus.component role="org.apache.maven.wagon.providers.ssh.knownhost.KnownHostsProvider"
*    role-hint="single"
Run Code Online (Sandbox Code Playgroud)

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

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

通过运行以下步骤,使用GitHub 上提供的Maven wagon 修补实现:

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>
Run Code Online (Sandbox Code Playgroud)

请注意,您可以使用 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>
Run Code Online (Sandbox Code Playgroud)

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

因此,您必须自行安装,例如以下方式:

% git clone https://github.com/AlexandreFenyo/maven-wagon.git
% cd maven-wagon
% mvn install
Run Code Online (Sandbox Code Playgroud)

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>
Run Code Online (Sandbox Code Playgroud)

现在一切都应该如您所愿:如果文件中定义的主机密钥setup.xml正确,maven 将不会显示密钥指纹,也不会要求您验证该主机密钥。

希望有帮助。