JSch未检测到$ HOME / .ssh / id_rsa公钥

时间:2020-03-24 10:43:48

标签: java git ssh jsch ssh-agent

我正在尝试通过JGit使用JSch版本0.1.55向远程Git服务器进行身份验证。使用命令行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

我认为这可能是由于Mac上的JSch和ssh-agent之间发生了一些奇怪的交互(我使用的是gpg-agent)。基于https://gist.github.com/niclasnilsson/038f20bee1bd19e970d59ba35732e262,我尝试创建一个包含{*“条目的.ssh/config文件,有一次我从UserAuthPublic密钥类中得到了另一个错误。但是,无论我尝试什么,我似乎都无法回到那个阶段。

我也尝试了https://dzone.com/articles/how-to-authenticate-with-jgit中的指令(ofc,没有对密码短语进行硬编码,这似乎是一件很奇怪的事情),但是没有运气。似乎还没有达到尝试调用UserInfo上任何方法的地步。

我确实从ssh-add -l得到了一个钥匙。不知道该怎么办才能尝试对此进行故障排除。任何指针将不胜感激!

2 个答案:

答案 0 :(得分:1)

JSch不会从任何地方自动加载任何私钥。

如果要使用公共密钥身份验证,则需要明确告诉JSch使用什么私有密钥。

请参见Can we use JSch for SSH key-based communication?

答案 1 :(得分:1)

当然,我在发布问题后不久就找到了答案。 :)通过调试身份验证期间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”方法的含义是什么。似乎“提示”的意思是“您是否支持提示用户输入X”,并且如果“ promptX”的UserInfo实现返回true,则随后对“ getX”的调用应返回正确的值。某些Javadocs对此进行描述会很棒,这样可以节省我几个小时!

相关问题