2016-09-08 1 views
0

Ich versuche, Java zu verwenden, um eine Verbindung zu einem Linux-Server herzustellen, der über eine zweistufige Verifizierungsanmeldung verfügt. Ich bin die jsch-Bibliothek, das ist der Code, den ich bisher habe:Bestätigung in zwei Schritten mit der JSCH-Bibliothek

session = jsch.getSession(username, ip); 
Properties config = new java.util.Properties(); 
config.put("StrictHostKeyChecking", "no"); 
session.setConfig(config); 

session.setPassword(password); 
session.connect(); 
System.out.println("Connected to " + ip); 

Natürlich, wenn ich dieses Skript ausführen ich erhalte einen „Auth fehlgeschlagen“ Fehler wie ich nicht den Authentifizierungsschlüssel eingeben. Wie logge ich mich mit dem Bestätigungsschlüssel ein? Wenn dies nicht möglich ist, könnte jemand eine Bibliothek vorschlagen, die diese Funktionalität hat.

Dies meldet sich mit Putty beim Server an. Sie geben also den Benutzernamen ein, dann den generierten Code auf Zeitbasis und dann das Passwort. enter image description here

+0

Sind Sie Kann ich mich mit dem Kommandozeilen-SSH-Dienstprogramm bei diesem Host anmelden? Bitte führen Sie ssh aus, um sich bei diesem Server anzumelden, und fügen Sie die Option -vvv hinzu, damit ssh Debugging-Informationen ausgeben kann. Bearbeiten Sie dann Ihre Frage, um den von Ihnen ausgeführten Befehl ssh und die von ihm erstellte Ausgabe einzuschließen. Dies würde den Menschen helfen zu wissen, wie diese zusätzliche Überprüfung durchgeführt wird. – Kenster

+0

Das ist nicht wirklich möglich, da die zusätzliche Überprüfung zeitbasiert ist. Daher wird eine geheime Zeichenfolge an eine Java-Methode übergeben, die dann den Schlüssel für den zweiten Teil der Überprüfung zurückgibt. –

+0

Der Punkt meines Vorschlags war zu verstehen, wie dieser Verifikationsschritt durch das ssh Protokoll erfolgt. – Kenster

Antwort

0

Ich habe dies schließlich ausgearbeitet, müssen Sie UserInfo und UIKeyboardInteractive implementieren. Verwenden Sie die promptKeyboardInteractive Methode, um es den Authentifizierungsschlüssel zurückgeben, in den folgenden Code dargestellt, die für mich funktioniert:

import java.security.InvalidKeyException; 

import com.jcraft.jsch.Channel; 
import com.jcraft.jsch.ChannelExec; 
import com.jcraft.jsch.JSch; 
import com.jcraft.jsch.Session; 
import com.jcraft.jsch.UIKeyboardInteractive; 
import com.jcraft.jsch.UserInfo; 

public class UserAuthKI{ 
    public static void main(String[] arg){ 

try{ 
    JSch jsch=new JSch(); 

    String host=""; 
    String user=""; 

    Session session=jsch.getSession(user, host, 22); 

    // username and passphrase will be given via UserInfo interface. 
    UserInfo ui=new MyUserInfo(); 
    session.setUserInfo(ui); 
    session.connect(); 

    Channel channel =session.openChannel("exec"); 
    ((ChannelExec)channel).setCommand("echo 'hello'"); 

    channel.setInputStream(System.in); 
    channel.setOutputStream(System.out); 

    channel.connect(); 

} 
catch(Exception e){ 
    System.out.println(e); 
} 
    } 

    public static class MyUserInfo implements UserInfo, UIKeyboardInteractive{ 
public String getPassword(){ return "passwordHere"; } 
public boolean promptYesNo(String str){ 
    return true; 
} 

public String getPassphrase(){return null;} 
public boolean promptPassphrase(String message){ return false; } 
public boolean promptPassword(String message){ 
    return true; 
} 
public void showMessage(String message){ 
    System.out.println(message); 
} 

public String[] promptKeyboardInteractive(String destination, 
              String name, 
              String instruction, 
              String[] prompt, 
              boolean[] echo){ 

    System.out.println("destination: "+destination); 
    System.out.println("name: "+name); 
    System.out.println("instruction: "+instruction); 
    System.out.println("prompt.length: "+prompt.length); 

    String[] str = new String[1]; 

    if(prompt[0].contains("Password:")){ 
     str[0] = getPassword(); 
    } 
    else if(prompt[0].contains("Verification code: ")){ 
     try { 
      str[0] = PasswordUtils.verify_code("CODEHERE"); 
     } catch (InvalidKeyException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 
    else{ 
     str = null; 
    } 

    return str; 

    } 
    } 
} 

(PasswordUtils.verif_code() ist die statische Methode, die den Schlüssel erzeugt)

Verwandte Themen