JSch не обнаруживает открытый ключ $ HOME / .ssh / id_rsa

Я пытаюсь пройти аутентификацию на удаленном сервере Git, используя JSch версии 0.1.55 через JGit. Использование аутентификации Git из командной строки работает нормально, но через JSch - нет. Я получаю следующую ошибку:

Caused by: org.eclipse.jgit.errors.TransportException: git@REDACTED_HOST:petter/rio.git: Auth fail
    at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:158)
    at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:107)
    at org.eclipse.jgit.transport.TransportGitSsh$SshPushConnection.<init>(TransportGitSsh.java:306)
    at org.eclipse.jgit.transport.TransportGitSsh.openPush(TransportGitSsh.java:143)
    at org.eclipse.jgit.transport.PushProcess.execute(PushProcess.java:127)
    at org.eclipse.jgit.transport.Transport.push(Transport.java:1335)
    at org.eclipse.jgit.api.PushCommand.call(PushCommand.java:137)
    ... 10 more
Caused by: com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:519)
    at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:112)
    ... 16 more

Моя теория заключается в том, что он не может найти никаких открытых ключей, основываясь на последних строках журнала отладки:

11:07:56.228 [main] DEBUG re.dacted - JSCH: Authentications that can continue: publickey,keyboard-interactive,password
11:07:56.228 [main] DEBUG re.dacted - JSCH: Next authentication method: publickey
11:07:56.295 [main] DEBUG re.dacted - JSCH: Disconnecting from REDACTED_HOST port 22

Я думаю, это может быть вызвано каким-то странным взаимодействием между JSch и ssh-agent на моем Mac (я использую gpg-agent). На основе https://gist.github.com/niclasnilsson/038f20bee1bd19e970d59ba35732e262 .ssh/config с включенной в него записью '*', и в какой-то момент я получил другую ошибку из класса UserAuthPublic key. Однако, что бы я ни старался, мне кажется, что я не могу вернуться к этому этапу.

Я также попробовал инструкции из https://dzone.com/articles/how-to-authenticate-with-jgit (разумеется, без жесткого кодирования ключевой фразы, что кажется очень странным делом), но не повезло. Похоже, дело даже не доходит до попытки вызвать какой-либо из методов UserInfo.

Я получил обратно ключ от ssh-add -l. Не уверен, что еще нужно сделать, чтобы попытаться устранить эту неполадку. Будем очень признательны за любые указатели!


person Petter Måhlén    schedule 24.03.2020    source источник


Ответы (2)


JSch не загружает закрытый ключ автоматически из любого места.

Если вы хотите использовать аутентификацию с открытым ключом, вам необходимо явно указать JSch, какой закрытый ключ использовать.

См. Можно ли использовать JSch для связи на основе ключей SSH?

person Martin Prikryl    schedule 24.03.2020
comment
Это правильно - JSchConfigSessionFactory JGit сообщает Jsch, где искать ключи. Оказывается проблема была в другом, опубликую ответ. - person Petter Måhlén; 24.03.2020

Конечно, я нашел ответ вскоре после публикации вопроса. :) Отлаживая то, что класс UserAuthPublicKey делал во время аутентификации, я понял, что неправильно понял, как используется класс UserInfo. Используя следующий код Kotlin, я заставил его вместо этого прочитать кодовую фразу через приглашение терминала:

    private val sshSessionFactory = object : JschConfigSessionFactory() {
        override fun configure(hc: OpenSshConfig.Host?, session: Session?) {
            session?.userInfo = object : UserInfo {
                override fun promptPassphrase(p0: String?) = true
                override fun getPassphrase(): String? = passphraseSupplier()
                override fun getPassword(): String? = null
                override fun promptYesNo(p0: String?) = false
                override fun showMessage(message: String?) = Unit
                override fun promptPassword(p0: String?) = false
            }
        }
    }

Мое непонимание заключалось в том, что означают методы «promptX» и «getX». Кажется, что «prompt» означает «поддерживаете ли вы запрос пользователю X», и что если реализация UserInfo для «promptX» возвращает true, то следующий вызов «getX» должен возвращать правильное значение. Было бы здорово, если бы некоторые javadocs описывали это, это сэкономило бы мне несколько часов!

person Petter Måhlén    schedule 24.03.2020
comment
Собственно, теперь я нахожу здесь javadocs: epaul.github.io/jsch-documentation/simple.javadoc/, но не в источниках, загруженных в IDEA через Maven central? Странный. - person Petter Måhlén; 24.03.2020