请在 2024 Clojure 状态调查中! 分享您的想法。

欢迎!有关如何使用本站点的更多信息,请参阅 关于 页面。

+12
工具.gitlibs
关闭

cljtools.gitlibs 通过 jgit 库使用旧的 jschjsch 不支持由 OpenSSH ssh-keygen 创建的所有私钥格式和密钥类型。这可能会导致相当神秘的错误消息
(请见下文的堆栈跟踪)。JGit 通过将 jsch 更改为另一种 ssh 实现来在最新版本中添加了对这些的支持。
https://wiki.eclipse.org/JGit/New_and"Noteworthy/5.2

目前 tools.gitlibs 使用 org.eclipse.jgit:org.eclipse.jgit 4.10.0.201712302008-r

当前 jgit 的版本为 5.5.1.201910021850-r
有关 jsch 的相关问题,请参阅 https://clojure.atlassian.net/browse/TDEPS-91

看起来以这行开始的私钥不受支持。这正是 openssh

ssh-keygen 默认创建的内容
-----BEGIN OPENSSH PRIVATE KEY-----

例如,在使用不支持的 ssh 私钥格式时,会发生此类错误

克隆: https://github.com/cognitect-labs/test-runner
`
构建classpath时出错。[email protected]:cognitect-labs/test-runner: 无效的私钥: [B@71d55b7e
org.eclipse.jgit.api.errors.TransportException: [email protected]:cognitect-labs/test-runner: 无效的私钥: [B@71d55b7e
org.eclipse.jgit.errors.TransportException: [email protected]:cognitect-labs/test-runner: 无效的私钥: [B@71d55b7e

at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:248)
at org.eclipse.jgit.api.CloneCommand.fetch(CloneCommand.java:306)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:200)
at org.eclipse.jgit.api.CloneCommand.call(CloneCommand.java:89)
at clojure.tools.gitlibs.impl$call_with_auth.invokeStatic(impl.clj:50)
at clojure.tools.gitlibs.impl$call_with_auth.invoke(impl.clj:41)
at clojure.tools.gitlibs.impl$git_clone_bare.invokeStatic(impl.clj:71)
at clojure.tools.gitlibs.impl$git_clone_bare.invoke(impl.clj:68)
at clojure.tools.gitlibs.impl$ensure_git_dir.invokeStatic(impl.clj:110)
at clojure.tools.gitlibs.impl$ensure_git_dir.invoke(impl.clj:100)
at clojure.tools.gitlibs$resolve.invokeStatic(gitlibs.clj:33)
at clojure.tools.gitlibs$resolve.invoke(gitlibs.clj:29)
at clojure.tools.gitlibs$procure.invokeStatic(gitlibs.clj:47)
at clojure.tools.gitlibs$procure.invoke(gitlibs.clj:41)
at clojure.tools.deps.alpha.extensions.git$eval966$fn__968.invoke(git.clj:41)
at clojure.lang.MultiFn.invoke(MultiFn.java:239)
at clojure.tools.deps.alpha$expand_deps.invokeStatic(alpha.clj:181)
at clojure.tools.deps.alpha$expand_deps.invoke(alpha.clj:164)
at clojure.tools.deps.alpha$resolve_deps.invokeStatic(alpha.clj:231)
at clojure.tools.deps.alpha$resolve_deps.invoke(alpha.clj:213)
at clojure.tools.deps.alpha.script.make_classpath$create_classpath.invokeStatic(make_classpath.clj:61)
at clojure.tools.deps.alpha.script.make_classpath$create_classpath.invoke(make_classpath.clj:53)
at clojure.tools.deps.alpha.script.make_classpath$run.invokeStatic(make_classpath.clj:79)
at clojure.tools.deps.alpha.script.make_classpath$run.invoke(make_classpath.clj:72)
at clojure.tools.deps.alpha.script.make_classpath$_main.invokeStatic(make_classpath.clj:118)
at clojure.tools.deps.alpha.script.make_classpath$_main.doInvoke(make_classpath.clj:93)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:705)
at clojure.core$apply.invokeStatic(core.clj:665)
at clojure.main$main_opt.invokeStatic(main.clj:514)
at clojure.main$main_opt.invoke(main.clj:510)
at clojure.main$main.invokeStatic(main.clj:664)
at clojure.main$main.doInvoke(main.clj:616)
at clojure.lang.RestFn.applyTo(RestFn.java:137)
at clojure.lang.Var.applyTo(Var.java:705)
at clojure.main.main(main.java:40)

Caused by: org.eclipse.jgit.errors.TransportException: [email protected]:cognitect-labs/test-runner: 无效的私钥: [B@71d55b7e

at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:172)
at org.eclipse.jgit.transport.SshTransport.getSession(SshTransport.java:140)
at org.eclipse.jgit.transport.TransportGitSsh$SshFetchConnection.<init>(TransportGitSsh.java:280)
at org.eclipse.jgit.transport.TransportGitSsh.openFetch(TransportGitSsh.java:170)
at org.eclipse.jgit.transport.FetchProcess.executeImp(FetchProcess.java:137)
at org.eclipse.jgit.transport.FetchProcess.execute(FetchProcess.java:123)
at org.eclipse.jgit.transport.Transport.fetch(Transport.java:1269)
at org.eclipse.jgit.api.FetchCommand.call(FetchCommand.java:237)
... 35 more

Caused by: com.jcraft.jsch.JSchException: 无效的私钥: [B@71d55b7e

at com.jcraft.jsch.KeyPair.load(KeyPair.java:948)
at com.jcraft.jsch.KeyPair.load(KeyPair.java:561)
at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:407)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:367)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getJSch(JschConfigSessionFactory.java:320)
at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:257)
at org.eclipse.jgit.transport.JschConfigSessionFactory.createSession(JschConfigSessionFactory.java:188)
at org.eclipse.jgit.transport.JschConfigSessionFactory.getSession(JschConfigSessionFactory.java:119)
... 42 more

`

关闭时附带备注:` Clojure CLI 现在已将 shell 外部化到 git 并应支持这些。如有问题,请提交新的问题。 `

2 答案

+2

谢谢,这些都是已知问题,我们应着力解决它们。需要考虑的两大路径是:a) 升级所有 jgit / jsch(或更新的替代品)和 b) 使用 git 外壳。两者都有权衡,将两者都作为选项提供可能是有用的,但这需要一些专注的时间。

tools.deps 现在支持这些格式,但不是通过在 .ssh/config 中列出 IdentityFile,而是通过 ssh-agent。
0 投票

如果其他人也遇到了这个问题,一个临时解决方案可能是创建或恢复到旧的密钥格式,如此处所述。

在创建用于 Github 的 ssh 密钥时,你可以运行以下类似命令,而不是像 Github 文档中的示例。
ssh-keygen -m PEM -t rsa -b 4096 -C "[email protected]"

我确信他们迁移到新格式有很好的理由,请注意这只是一个临时的解决方案。

...