Как предоставить ключ хоста для использования Maven SSH в server.xml

В 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>

person YoYo    schedule 31.07.2015    source источник


Ответы (1)


Это распространенная проблема, вы можете найти много людей в Интернете, которые ищут правильное решение, пытаясь переопределить реализацию knownHostsProvider экземпляром SingleKnownHostsProvider, как вы объяснили в своем примере.

Во-первых, вот почему это не так просто сделать:

Когда URL репозитория начинается с scp:, Plexus, менеджер компонентов, используемый Maven, ищет компонент с ролью org.apache.maven.wagon.Wagon и подсказкой scp и находит единственный, который соответствует этим потребностям в текущей реализации Wagon (до 3.0.1 в минимум), то есть класса org.apache.maven.wagon.providers.ssh.jsch.ScpWagon. Этот класс расширяет класс AbstractJschWagon в том же пакете, и этот последний класс статически определяет подсказку роли 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"

Напротив, класс SingleKnownHostProvider определяется не с подсказкой роли file, а с подсказкой роли single:

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

Итак, привязка к этому нежелательному (в вашей ситуации) FileKnownHostsProvider статически определена в исходном файле AbstractJschWagon. В этом вся сложность.

Теперь, как решить проблему:

Используйте эту исправленную реализацию Maven wagon, доступную здесь, на 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, но доступен на 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 не будет отображать отпечаток ключа и не будет запрашивать проверку этого ключа хоста.

Надеюсь, это поможет.

person Alexandre Fenyo    schedule 18.08.2017
comment
Очень красивое и чистое решение. Хотелось бы, чтобы он был объединен с официальной реализацией. Вы обращались к официальным мейнтейнерам? - person YoYo; 24.08.2017
comment
Я еще не предложил их, но я буду. Спасибо. - person Alexandre Fenyo; 24.08.2017