2017-01-12 260 views
1
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(); 

    } 
} 

设置publicKeynull,不有所作为,我可以连接两种方式。这是为什么?JSCH addIdentity公钥参数不有所作为

看起来好像publicKey没有被使用,所以为什么要把它首先传递给addIdentity

+0

@Kenster no,id_dsa是一个私钥,id_dsa.pub是一个公钥。没有密码 – Kam

+0

@Kenster我的问题并不是关于公钥的解释。如果我在jsch.addIdentity的第三个参数(不是第四个参数)中传递null,它仍然可以工作。 – Kam

+0

@kenster我更新了代码。 – Kam

回答

3

它是(部分)加密私钥的优化。您没有注意到任何区别,因为您使用了未加密的私钥。

如果您给jsch一个OpenSSL格式的加密私钥,并且不提前提供密码来解密它,但是提供公钥(从不加密),并且该密钥对将成为下一个选项对于身份验证,jsch使用publickey来探测服务器,以确定服务器是否可能接受使用此密钥的身份验证。如果是这样,jsch必须提示输入密码来解密私钥才能真正执行身份验证;如果不是,则跳过提示并转到下一个可能性(如果有的话)。查看com.jcraft.jsch.UserAuthPublicKey.java的来源。

OpenSSH客户端ssh做几乎相同的事情。如果您以OpenSSL格式加密的专用密钥(作为选项,在配置中或默认情况下)提供它,并且它找到匹配的公钥,则首先进行探测,并且只有在此密钥可用时提示输入密码才能解密。 ssh不允许像Jsch.addIdentity那样预先指定密码短语,但它可以使用完成相同内容的过程(或替代)。

OpenSSH自6.5以来还支持使用ssh-keygen -o创建的'新格式'密钥文件,该文件可以在一个文件中加密privatekey和未加密的publickey,避免单独处理publickey。 Jsch不支持这种格式,但它支持PuTTY的PPK格式,它的功能相同,因此您可以将单个文件作为privatekey和publickey提供。

0

私钥包含构建公钥所需的信息。如果jsch需要公钥,它可以从私钥中获得。

举个例子,你可以使用ssh-keygen从私钥文件中提取公钥:

$ 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... 
+0

我明白,但是为什么首先需要公钥的API。 – Kam

相关问题