Невозможно установить соединение с сервером Unix, используя Jsch и закрытый ключ от клиента IPSwitch. - PullRequest
0 голосов
/ 12 июня 2019

Я пытаюсь установить соединение с сервером Unix и поместить / получить файлы с использованием SFTP.Я использую JCraft Jsch 0.1.53 и аутентификацию на основе токенов RSA.Нет пароля

Я сгенерировал закрытый ключ и открытые ключи с помощью программного обеспечения IPSwitch и настроил открытый ключ для пользователя на сервере Unix.

Я использую закрытый ключ, сгенерированный IPSwitch в моемJava-программа, которая в свою очередь использует JSch.

Файл Store.ini IPSwitch выглядит следующим образом:

[____Item____0]
____ItemName____=auto
PublicKey=C:\ClientKeyStore\Pub203E.tmp
Pass=_y**************************NyYbpT
PrivateKey=C:\ClientKeyStore\Pri203F.tmp
[__CONFIG__]
Count=1

закрытый ключ выглядит так:

-----BEGIN ENCRYPTED PRIVATE KEY-----

MIIFHzBJB*******************************

B**************************************B

************1on4MNDZfTgQ==

-----END ENCRYPTED PRIVATE KEY-----

Существует множество примеров в stackoverflow и в других местах.Я пытался, но я нажимаю com.jcraft.jsch.JSchException: Auth отмена.

import com.jcraft.jsch.Channel;
import com.jcraft.jsch.JSch;
import com.jcraft.jsch.JSchException;
import com.jcraft.jsch.Session;
import com.jcraft.jsch.UserInfo;


public class UnixUtilities {

public void unixConnectionUsingKey(String username, String hostIPAddress, int portNumber) throws JSchException {

    JSch jsch = new JSch();

    jsch.addIdentity("src/main/resources/keys/id_rsa");

    Session session = jsch.getSession(username, hostIPAddress, portNumber);

    session.setConfig("StrictHostKeyChecking", "no");
    session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");

    UserInfo userinfo = new MyUserInfo();
    session.setUserInfo(userinfo);

    session.connect();

    Channel channel = session.openChannel("sftp");
}

}

class MyUserInfo implements UserInfo {
String password = null;

@Override
public String getPassphrase() {
    return null;
}

@Override
public String getPassword() {
    return password;
}

public void setPassword(String passwd) {
    password = passwd;
}

@Override
public boolean promptPassphrase(String message) {
    return true;
}

@Override
public boolean promptPassword(String message) {
    return true;
}

@Override
public boolean promptYesNo(String message) {
    return true;
}

@Override
public void showMessage(String message) {
    // TODO Auto-generated method stub

}
}

Я нажимаю

com.jcraft.jsch.JSchException: Auth cancel
at com.jcraft.jsch.Session.connect(Session.java:511)
at com.jcraft.jsch.Session.connect(Session.java:183)

Когда я использую только publickey вместо publickey, клавиатура-интерактив, пароль как PreferredAuthentications , я нажимаю,

  com.jcraft.jsch.JSchException: Auth fail
    at com.jcraft.jsch.Session.connect(Session.java:512)
    at com.jcraft.jsch.Session.connect(Session.java:183)

Кроме того, если я игнорирую ниже2 строки, т. Е. Если я прокомментирую следующие 2 строки

UserInfo userinfo = new MyUserInfo();

session.setUserInfo(userinfo);

Я нажимаю,

com.jcraft.jsch.JSchException: USERAUTH fail
at com.jcraft.jsch.UserAuthPublicKey.start(UserAuthPublicKey.java:119)
at com.jcraft.jsch.Session.connect(Session.java:463)
at com.jcraft.jsch.Session.connect(Session.java:183)

Журнал Jsch выглядит следующим образом:

    Connecting to ***.***.**.*** port ****

    Connection established

    Remote version string: SSH-2.0-6.4.0.370 SSH Tectia Server

    Local version string: SSH-2.0-JSCH-0.1.53

    CheckCiphers: aes256-ctr,aes192-ctr,aes128-ctr,aes256-cbc,aes192-cbc,aes128-cbc,3des-ctr,arcfour,arcfour128,arcfour256

    aes256-ctr is not available.

    aes192-ctr is not available.

    aes256-cbc is not available.

    aes192-cbc is not available.

    CheckKexes: diffie-hellman-group14-sha1,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521

    CheckSignatures: ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521

    SSH_MSG_KEXINIT sent

    SSH_MSG_KEXINIT received

    kex: server: diffie-hellman-group1-sha1,diffie-hellman-group14-sha1,diffie-hellman-group14-sha256@ssh.com,diffie-hellman-group-exchange-sha1,diffie-hellman-group-exchange-sha256

    kex: server: ssh-rsa,ssh-rsa-sha256@ssh.com

    kex: server: aes128-cbc

    kex: server: aes128-cbc

    kex: server: hmac-sha1,hmac-sha1-96,hmac-sha256-2@ssh.com,hmac-sha224@ssh.com,hmac-sha256@ssh.com,hmac-sha384@ssh.com,hmac-sha512@ssh.com

    kex: server: hmac-sha1,hmac-sha1-96,hmac-sha256-2@ssh.com,hmac-sha224@ssh.com,hmac-sha256@ssh.com,hmac-sha384@ssh.com,hmac-sha512@ssh.com

    kex: server: none,zlib

    kex: server: none,zlib

    kex: server: 

    kex: server: 

    kex: client: ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1,diffie-hellman-group-exchange-sha256,diffie-hellman-group-exchange-sha1,diffie-hellman-group1-sha1

    kex: client: ssh-rsa,ssh-dss,ecdsa-sha2-nistp256,ecdsa-sha2-nistp384,ecdsa-sha2-nistp521

    kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc

    kex: client: aes128-ctr,aes128-cbc,3des-ctr,3des-cbc,blowfish-cbc

    kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96

    kex: client: hmac-md5,hmac-sha1,hmac-sha2-256,hmac-sha1-96,hmac-md5-96

    kex: client: none

    kex: client: none

    kex: client: 

    kex: client: 

    kex: server->client aes128-cbc hmac-sha1 none

    kex: client->server aes128-cbc hmac-sha1 none

    SSH_MSG_KEXDH_INIT sent

    expecting SSH_MSG_KEXDH_REPLY

    ssh_rsa_verify: signature true

    Permanently added '***.***.**.***' (RSA) to the list of known hosts.

    SSH_MSG_NEWKEYS sent

    SSH_MSG_NEWKEYS received

    SSH_MSG_SERVICE_REQUEST sent

    SSH_MSG_SERVICE_ACCEPT received

    Authentications that can continue: publickey

    Next authentication method: publickey

    Disconnecting from ***.***.**.*** port ****

Я использую тот же ключ, который был сгенерирован IPSwitch, и назвал его как id_rsa в моем затмении.Должен ли закрытый ключ, сгенерированный из IPSwitch, работать и для JSch?

Когда я подключаюсь через IPSwitch, все работает нормально.Не могли бы вы помочь мне здесь? Спасибо заранее.

Ответы [ 2 ]

0 голосов
/ 17 июня 2019

Спасибо Мартину Прикрилу и сообществу за то, что были с этим, пока я решаю эту проблему.

Это было просто.Как Мартин упомянул в одном из своих комментариев, мне просто нужно было сгенерировать еще один набор ключей, используя другой инструмент, такой как SSH-Keygen, и использовать его вместо этого.Я использовал программное обеспечение VANDYKE SecureCRT для генерации еще одного набора ключей, и оно отлично работает с JSch.Похоже, что IPSwitch что-то делает, генерируя ключи, которые, похоже, не работают с JSch.Это может быть тот «Pass», который доступен в конфигурационном файле IPSwitch, который специфичен для IPSwitch.

Код выглядит следующим образом:

        JSch jsch = new JSch();
        jsch.addIdentity(privateKeyPath);


        JSch.setLogger(new com.jcraft.jsch.Logger() {
            Path path = Paths.get("target/jsch.log");
            @Override
            public boolean isEnabled(int level){
                return true;
            }
            public void log(int level, String message){
                try {
                    StandardOpenOption option =
                       !Files.exists(path) ? StandardOpenOption.CREATE : StandardOpenOption.APPEND;
                    Files.write(path, java.util.Arrays.asList(message), option);
                } catch (IOException e) {
                    System.err.println(message);
                }
            }
        });

        Session session = jsch.getSession(username, host, port);

        session.setConfig("StrictHostKeyChecking", "no");
        session.setConfig("PreferredAuthentications", "publickey");
        session.connect();

Здесь метод setlogger помогает вам с хорошими журналами.Если вы не хотите этого, вы можете игнорировать этот шаг.

0 голосов
/ 12 июня 2019

Чтобы предоставить кодовую фразу для зашифрованного закрытого ключа , вам необходимо реализовать UserInfo.promptPassphrase и UserInfo.getPassphrase, а неUserInfo.getPassword и UserInfo.promptPassword.

@Override
public boolean promptPassphrase(String message) {
    return true;
}

@Override
public String getPassphrase() {
    return password;
}

(и для согласованности вам следует переименовать поле password в passphrase).

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...