2017-01-12 2 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(); 

    } 
} 

Einstellung publicKey zu null, macht keinen Unterschied machen, ich so oder so eine Verbindung herstellen kann. Warum das?JSch addIdentity öffentliche Schlüssel Argument macht keinen Unterschied

Es sieht so aus, als ob die publicKey nicht verwendet wird. Warum also zuerst an addIdentity?

+0

@Kenster nein, id_dsa ist ein privater Schlüssel und id_dsa.pub ein öffentlicher Schlüssel. Keine Passphrasen – Kam

+0

@Kenster meine Frage geht es nicht wirklich um die Umschreibung, es geht um den öffentlichen Schlüssel. Wenn ich null im 3. param (nicht 4.) von jsch.addIdentity überlasse, würde es immer noch funktionieren. – Kam

+0

@kenster Ich habe den Code aktualisiert. – Kam

Antwort

3

Es ist eine Optimierung für (einige) verschlüsselten privaten Schlüssel. Sie haben keinen Unterschied bemerkt, weil Sie unverschlüsselte private Schlüssel verwendet haben. Wenn Sie JSS einen OpenSSL-Format-verschlüsselten privaten Schlüssel geben und nicht die Passphrase bereitstellen, um sie zu entschlüsseln, sondern den öffentlichen Schlüssel bereitstellen (der niemals verschlüsselt wird), wird dieses Schlüsselpaar zur nächsten Wahl Zur Authentifizierung prüft jsch den Server mit dem öffentlichen Schlüssel, um festzustellen, ob der Server möglicherweise auth mit diesem Schlüssel akzeptiert. Wenn ja, muss jsch nach der Passphrase fragen, um den privaten Schlüssel zu entschlüsseln, um die Authentifizierung tatsächlich durchzuführen; Wenn nicht, überspringt es die Aufforderung und geht zur nächsten Möglichkeit, falls vorhanden. Siehe die Quelle für com.jcraft.jsch.UserAuthPublicKey.java.

Der OpenSSH-Client ssh macht fast das gleiche. Wenn Sie einen OpenSSL-format-verschlüsselten privaten Schlüssel (als Option, in der Konfig oder als Standard) eingeben und einen entsprechenden öffentlichen Schlüssel findet, sucht er zuerst und fordert zur Entschlüsselung der Passphrase auf, nur wenn dieser Schlüssel verwendbar ist. ssh lässt nicht im Voraus die Passphrase wie Jsch.addIdentity spezifizieren, aber es kann einen ssh-agent Prozess (oder Ersatz) verwenden, der die gleiche Sache bewerkstelligt.

OpenSSH seit 6.5 unterstützt auch 'neue Format' Schlüsseldateien, die mit ssh-keygen -o erstellt wurden, die verschlüsselten privaten Schlüssel und unverschlüsselten Publickey in einer Datei haben können, um die getrennte Verarbeitung von publickey zu vermeiden. Jsch unterstützt (noch?) Dieses Format nicht, aber es unterstützt PuTTYs PPK-Format, das dasselbe tut und daher die einzige Datei als privaten Schlüssel und ohne öffentlichen Zugriff bereitstellt.

0

Der private Schlüssel enthält die Informationen, die zum Erstellen des öffentlichen Schlüssels benötigt werden. Wenn jsch den öffentlichen Schlüssel benötigt, kann er ihn vom privaten Schlüssel erhalten.

Als Beispiel können Sie ssh-keygen verwenden den öffentlichen Schlüssel aus einem privaten Schlüssel-Datei zu extrahieren:

$ 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

Ich verstehe das, aber dann warum eine API, die einen öffentlichen Schlüssel in erster Linie benötigt. – Kam

Verwandte Themen