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

欢迎!有关如何操作的更多信息,请参阅 关于 页面。

+12 投票
tools.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
错误构建类路径。 [email protected]:cognitect-labs/test-runner: 无效私有密钥:[B@71d55b7e
org.eclipse.jgit.api.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)

原因:org eclipse jgit errors transportexception: git@github com 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

原因: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 现在通过 git 外壳调用并应支持这些。如有问题,请提交新问题。

2 回答

+2 投票
by

谢谢,这些问题已知且同意我们应该着手解决。需要考虑的两个主要途径是a) 升级所有 jgit/jsch(或更新的替代品)和b) 调用 git。两种方法都有其权衡之处,同时将它们作为选项提供可能是有用的,但这需要一些重点关注的时间。

by
tools.deps 现在今天支持这些功能,但不是通过在 .ssh/config 中列出 IdentityFile,而是通过 ssh-agent。
0
by

如果其他人遇到这个问题,临时解决方案可能是创建或恢复到较旧的密钥格式,如下所述 这里

在为 Github 生成 ssh 密钥时,可以运行如下命令,而不是 Github 文档中的示例。
ssh-keygen -m PEM -t rsa -b 4096 -C "你的.email@地址.com"

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

...