【问题标题】:JSch doesn't detect $HOME/.ssh/id_rsa public keyJSch 没有检测到 $HOME/.ssh/id_rsa 公钥
【发布时间】:2020-03-25 19:51:11
【问题描述】:

我正在尝试通过 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

我认为这可能是由 JSch 和我的 Mac 上的 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 得到了钥匙。不知道还能做什么才能尝试解决此问题。任何指针将不胜感激!

【问题讨论】:

    标签: java git ssh jsch ssh-agent


    【解决方案1】:

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

    如果要使用公钥认证,需要明确告诉JSch使用什么私钥。

    Can we use JSch for SSH key-based communication?

    【讨论】:

    • 没错——是 JGit 的 JschConfigSessionFactory 告诉 Jsch 在哪里可以找到密钥。原来问题是另一个问题,我会发布答案。
    【解决方案2】:

    当然,我在发布问题后不久就找到了答案。 :) 通过调试 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”,并且如果“提示 X”的 UserInfo 实现返回 true,那么对“getX”的后续调用应该返回正确的值。如果有一些 javadocs 对此进行描述,那就太好了,这样可以节省我几个小时!

    【讨论】:

    猜你喜欢
    • 2021-09-02
    • 2021-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-10-31
    • 1970-01-01
    • 2012-11-16
    相关资源
    最近更新 更多