JSCH addIdentity public 关键参数没有区别
JSCH addIdentity public key argument doesn't make a difference
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
?
私钥包含构造public密钥所需的信息。如果jsch需要public密钥,可以从私钥中获取。
例如,您可以使用 ssh-keygen
从私钥文件中提取 public 密钥:
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/foo/.ssh/id_dsa): key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
...
$ ls -l
total 16
-rw------- 1 foo bar 668 Jan 12 16:28 key
-rw-r--r-- 1 foo bar 613 Jan 12 16:28 key.pub
$ cat key.pub
ssh-dss AAAAB3NzaC1kc3MAAACBANzp8qnI3e+iO/5KkK...
$ rm key.pub
$ ssh-keygen -y -f key
ssh-dss AAAAB3NzaC1kc3MAAACBANzp8qnI3e+iO/5KkK...
这是对(某些)加密私钥的优化。您没有注意到任何差异,因为您使用了未加密的私钥。
如果您给 jsch 一个 OpenSSL-format 加密私钥,并且不 up-front 提供解密它的密码,但提供 public 密钥(从不加密) ),并且该密钥对成为身份验证的下一个选择,jsch 使用 public 密钥探测服务器以确定服务器是否可能接受使用此密钥的身份验证。如果是这样,jsch 必须提示输入密码来解密私钥以实际执行身份验证;如果不是,它会跳过提示并转到下一个可能性(如果有的话)。查看 com.jcraft.jsch.UserAuthPublicKey.java
.
的来源
OpenSSH 客户端ssh
做几乎相同的事情。如果你给它(作为一个选项,在配置中或默认情况下)一个 OpenSSL-format 加密的私钥,并且它找到一个匹配的 public 密钥,它首先探测,并提示输入密码,只有在这个情况下才能解密钥匙可用。 ssh
不允许像 Jsch.addIdentity
那样提前指定密码,但它可以使用 ssh-agent
过程(或替代)来完成同样的事情。
OpenSSH 自 6.5 起还支持 'new format' 使用 ssh-keygen -o
创建的密钥文件,这些文件可以在一个文件中包含加密的私钥和未加密的 public 密钥,避免单独处理 public 密钥. Jsch 不(还?)支持这种格式,但它确实支持 PuTTY 的 PPK 格式,它做同样的事情,因此您提供单个文件作为私钥而不是 publickey。
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
?
私钥包含构造public密钥所需的信息。如果jsch需要public密钥,可以从私钥中获取。
例如,您可以使用 ssh-keygen
从私钥文件中提取 public 密钥:
$ ssh-keygen -t dsa
Generating public/private dsa key pair.
Enter file in which to save the key (/Users/foo/.ssh/id_dsa): key
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
...
$ ls -l
total 16
-rw------- 1 foo bar 668 Jan 12 16:28 key
-rw-r--r-- 1 foo bar 613 Jan 12 16:28 key.pub
$ cat key.pub
ssh-dss AAAAB3NzaC1kc3MAAACBANzp8qnI3e+iO/5KkK...
$ rm key.pub
$ ssh-keygen -y -f key
ssh-dss AAAAB3NzaC1kc3MAAACBANzp8qnI3e+iO/5KkK...
这是对(某些)加密私钥的优化。您没有注意到任何差异,因为您使用了未加密的私钥。
如果您给 jsch 一个 OpenSSL-format 加密私钥,并且不 up-front 提供解密它的密码,但提供 public 密钥(从不加密) ),并且该密钥对成为身份验证的下一个选择,jsch 使用 public 密钥探测服务器以确定服务器是否可能接受使用此密钥的身份验证。如果是这样,jsch 必须提示输入密码来解密私钥以实际执行身份验证;如果不是,它会跳过提示并转到下一个可能性(如果有的话)。查看 com.jcraft.jsch.UserAuthPublicKey.java
.
OpenSSH 客户端ssh
做几乎相同的事情。如果你给它(作为一个选项,在配置中或默认情况下)一个 OpenSSL-format 加密的私钥,并且它找到一个匹配的 public 密钥,它首先探测,并提示输入密码,只有在这个情况下才能解密钥匙可用。 ssh
不允许像 Jsch.addIdentity
那样提前指定密码,但它可以使用 ssh-agent
过程(或替代)来完成同样的事情。
OpenSSH 自 6.5 起还支持 'new format' 使用 ssh-keygen -o
创建的密钥文件,这些文件可以在一个文件中包含加密的私钥和未加密的 public 密钥,避免单独处理 public 密钥. Jsch 不(还?)支持这种格式,但它确实支持 PuTTY 的 PPK 格式,它做同样的事情,因此您提供单个文件作为私钥而不是 publickey。