gpt4 book ai didi

java - JSCH addIdentity 公钥参数没有区别

转载 作者:塔克拉玛干 更新时间:2023-11-01 22:40:13 25 4
gpt4 key购买 nike

public class FTP {
public static void main(String args[]){
JSch jsch = new JSch();
jsch.setKnownHosts("./known_hosts");

Path privateKeyPath = Paths.get("./id_dsa");
byte[] privateKey = Files.readAllBytes(privateKeyPath);

Path publicKeyPath = Paths.get("./id_dsa.pub");
byte[] publicKey = Files.readAllBytes(publicKeyPath);

// Either of the lines below work... Why?
// jsch.addIdentity("", privateKey, publicKey, null);
// or
jsch.addIdentity("", privateKey, null, null);

Session session = jsch.getSession("USER", "myHost.com", 22);

session.connect();

}
}

publicKey 设置为 null,没有任何区别,我可以通过任何一种方式连接。这是为什么?

看起来 publicKey 没有被使用,那么为什么首先将它传递给 addIdentity

最佳答案

这是对(某些)加密私钥的优化。您没有注意到任何差异,因为您使用了未加密的私钥。

如果您给 jsch 一个 OpenSSL 格式的加密私钥,并且不预先提供密码来解密它,而是提供公钥(从不加密),那么该 key 对将成为下一个选择身份验证,jsch 使用公钥探测服务器以确定服务器是否可能接受使用此 key 的身份验证。如果是这样,jsch 必须提示输入密码来解密私钥以实际执行身份验证;如果不是,它会跳过提示并转到下一个可能性(如果有的话)。请参阅 com.jcraft.jsch.UserAuthPublicKey.java 的源代码。

OpenSSH 客户端 ssh 做几乎相同的事情。如果你给它(作为一个选项,在配置中或默认情况下)一个 OpenSSL 格式的加密私钥,并且它找到一个匹配的公钥,它首先探测,并提示输入密码,只有当这个 key 可用时才解密。 ssh 不允许像 Jsch.addIdentity 那样预先指定密码,但它可以使用 ssh-agent 进程(或替代进程)来完成同样的事情。

从 6.5 开始,OpenSSH 还支持使用 ssh-keygen -o 创建的“新格式” key 文件,它可以在一个文件中包含加密的私钥和未加密的公钥,避免单独处理公钥。 Jsch 不(还?)支持这种格式,但它确实支持 PuTTY 的 PPK 格式,它做同样的事情,因此您提供单个文件作为私钥而不是公钥。

关于java - JSCH addIdentity 公钥参数没有区别,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/41622662/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com