在生产Clojure调查问卷中分享您的想法!2024 State of Clojure Survey!

欢迎!请参阅关于页面了解更多关于此页如何运作的信息。

0
tools.deps

Jsch 在处理加密(受密码保护)的密钥的公钥身份验证时存在问题。为了解决这个问题,~/.ssh/config 不能在任何 Jsch 决定读取的节中包含 IdentityFile。要查看问题的完整描述、堆栈跟踪和一些解决方案,请参阅此 gist:https://gist.github.com/niclasnilsson/038f20bee1bd19e970d59ba35732e262

注意:这个问题不仅与 tools.deps 有关,而是在使用它时发现的,因此 Alex Miller 要求添加一个问题以跟踪这个问题。

3 答案

0

评论由: alexmiller 提出

感谢您跟踪所有这些并提出文章...

0

评论由: manderson202 提出

我在找到这个解决方案之前遇到了这个问题,所以我想提交一个补丁。如 gist 中所述,JSCH 并不知道 jsch-agent-proxy,因此它会像通常那样尝试解析密钥。在正常执行过程中,它会期望一个 UserInfo 实现,当它遇到加密(受密码保护的)私钥时。如果不存在 UserInfo 实现,代码会直接抛出一个异常,不给 jsch-agent-proxy 从 ssh-agent 中提取密钥的机会。以下是从 com.jcraft.jsch.UserAuthPublicKey#start 方法第 118-130 行的代码片段:

`java
if((identity.isEncrypted() && passphrase==null)){
if(userinfo==null) throw new JSchException("USERAUTH fail");
if(identity.isEncrypted() &&

 !userinfo.promptPassphrase("Passphrase for "+identity.getName())){
throw new JSchAuthCancelException("publickey");
//throw new JSchException("USERAUTH cancel");
//break;

}
字符串 _passphrase = userinfo.getPassphrase();
if(_passphrase != null){

passphrase=Util.str2byte(_passphrase);

}
}
`

修复方法是设置一个占位符 UserInfo 实现到 Session 上,这样上述异常就不会抛出,而 ssh-agent 可以处理返回 JSCH 密钥。补丁后,无需从您的 ~/.ssh/config 文件中删除 IdentityFile 属性的 workaround。

补丁已附加(今天:2018-11-27)并命名为 tdeps-49-fix.patch。如有疑问,请告知。

0
参考: https://clojure.atlassian.net/browse/TDEPS-49 (由 alex+import 提供)
...