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

欢迎!请查看 关于 页面了解如何使用本信息。

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;

}
String _passphrase=userinfo.getPassphrase();
if(_passphrase!=null){

passphrase=Util.str2byte(_passphrase);

}
}
`

修复方法是将一个占位符UserInfo实现设置到Session中,以避免抛出上述异常并使ssh-agent能够处理返回给JSCH的密钥。有了这个补丁,您无需从您的~/.ssh/config文件中移除IdentityFile属性的解决方案。

补丁已附上(日期:2018-11-27)并命名为tdeps-49-fix.patch。如果您有任何疑问,请告知。

0
参考:[https://clojure.atlassian.net/browse/TDEPS-49](https://clojure.atlassian.net/browse/TDEPS-49)(由alex+import报告)
...