2017-01-12 1805 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

相關問題