Как исправить исключение JSch «Нет доступных шифров» при попытке использовать Spring Config Server? - PullRequest
1 голос
/ 14 июня 2019

Я пытаюсь заставить работать встроенную реализацию Spring Config Server, которая читает конфигурацию из GitHub.Я следую этому уроку:

https://mromeh.com/2017/12/04/spring-boot-with-embedded-config-server-via-spring-cloud-config/

При попытке запуска моего приложения Spring Boot появляется следующее исключение:

Причина:com.jcraft.jsch.JSchException: нет доступных шифров.в com.jcraft.jsch.Session.send_kexinit (Session.java:629) в com.jcraft.jsch.Session.connect (Session.java:307) в org.eclipse.jgit.transport.JschConfigSessionFactory.getSession (JschConfigjactFession: 146) ... еще 23

Единственный интересный фрагмент в моем коде, который я вижу, способствующий этому, - это мой файл bootstrap.yml, который выглядит следующим образом:

spring:
  application:
    name: DemoApplication.yml

---
spring:
  cloud:
    config:
      failFast: true
      server:
        bootstrap: true
        git:
          uri: git@github.com:mycompany/demo-config.git

Я использую OpenJDK 8 v212 в MacOS, выполнив следующее:

#> java -version
openjdk version "1.8.0_212"
OpenJDK Runtime Environment (AdoptOpenJDK)(build 1.8.0_212-b03)
OpenJDK 64-Bit Server VM (AdoptOpenJDK)(build 25.212-b03, mixed mode)

Я искал код и документацию Spring и до сих пор не нашел ничего о передаче параметров конфигурации или добавлении кода длякак сессия Jsch используется Spring.Все, что я нахожу, говорит о том, что то, что я делаю, должно просто работать.

Я не знаю, куда идти дальше.Может кто-нибудь сказать мне, что мне не хватает ... что мне нужно сделать, чтобы обойти эту проблему?

Ответы [ 2 ]

2 голосов
/ 16 июня 2019

Чтобы объединить комментарии ранее ...

За кулисами Spring использует JGit для установления SSH-соединения.По умолчанию это использует JSch для создания SSH-соединения, которое настраивается в файле ~/.ssh/config.

В вики также есть сведения о том, как обойти JSch и использовать собственный sshВ качестве команды можно установить переменную окружения GIT_SSH, например /usr/bin/ssh в OS X или Linux, или даже что-то вроде C:\Program Files\TortoiseGit\bin\TortoiseGitPlink.exe.


После комментария о том, как избежать зависимости отУстанавливая переменную среды, обратите внимание, как переменная среды GIT_SSH проверяется с использованием SystemReader в методе TransportGitSsh.useExtSession () .

Это означает, что одним из способов будет переопределениеSystemReader класс.Хотя это не маленький интерфейс, поэтому может потребоваться немало оберточного кода - с пользовательским битом в getenv():

import org.eclipse.jgit.lib.Config;
import org.eclipse.jgit.storage.file.FileBasedConfig;
import org.eclipse.jgit.util.FS;
import org.eclipse.jgit.util.SystemReader;

public class CustomSystemReader extends SystemReader {
    private final SystemReader systemReader;

    public CustomSystemReader(SystemReader systemReader) {
        this.systemReader = systemReader;
    }

    @Override
    public String getHostname() {
        return systemReader.getHostname();
    }

    @Override
    public String getenv(String variable) {
        if ("GIT_SSH".equals(variable))
            return "/usr/bin/ssh";
        return systemReader.getenv(variable);
    }

    @Override
    public String getProperty(String key) {
        return systemReader.getProperty(key);
    }

    @Override
    public FileBasedConfig openUserConfig(Config parent, FS fs) {
        return systemReader.openUserConfig(parent, fs);
    }

    @Override
    public FileBasedConfig openSystemConfig(Config parent, FS fs) {
        return systemReader.openSystemConfig(parent, fs);
    }

    @Override
    public long getCurrentTime() {
        return systemReader.getCurrentTime();
    }

    @Override
    public int getTimezone(long when) {
        return systemReader.getTimezone(when);
    }
}

, который затем можно подключить так:

    SystemReader.setInstance(
            new CustomSystemReader(SystemReader.getInstance()));
1 голос
/ 16 июня 2019

@ df778899 дал мне направление, в котором я должен был это выяснить, с утверждением

Как вы обнаружили, по умолчанию здесь используется JSch, который настраивается ~ / .ssh / файл конфигурации - если он существует, вы можете найти подсказку.

Я уже искал этот файл для подсказок, особенно в поисках ничего о настройке шифрования. Я увидел, что у меня была закомментированная строка в верхней части файла:

#   Ciphers +aes256-cbc

То, что я пропустил (я думал, что я сделал текстовый поиск для «шифра», но, очевидно, я этого не сделал), было то, что я спрятался в середине файла среди множества несвязанных настроек, которые я делал опять то же самое, не закомментировано на этот раз:

Host *
    ...
    Ciphers +aes256-cbc
    ...

Именно эта линия убивает меня с помощью Иша. Если я закомментирую эту строку, моя простая установка будет работать нормально. Заявление @ df778899 о том, что ~/.ssh/config имеет решающее значение для настройки Jsch, было тем толчком, который мне был нужен.

Это не будет частью моего решения, но я укажу, что следующий код, кажется, показывает, как я могу установить GIT_SSH в Java, в верхней части моего main():

public static void main(String[] args) {

    try {
        Map<String, String> env = System.getenv();
        Field field = env.getClass().getDeclaredField("m");
        field.setAccessible(true);
        ((Map<String, String>) field.get(env)).put("GIT_SSH", "/usr/bin/ssh");
    } catch (NoSuchFieldException e) {
        e.printStackTrace();
    } catch (IllegalAccessException e) {
        e.printStackTrace();
    }

    SpringApplication.run(DemoApplication.class, args);
}

Это также "решает" мою проблему. Этот бит о getDeclaredField("m") особенно странен. Какого черта "м"?

...