Код зависает при получении удаленной идентификации от моего собственного прокси Shadowsocks - PullRequest
0 голосов
/ 03 июня 2019

Я написал программу на Java, которая пытается подключиться к SFTP-серверу через прокси-сервер. Прокси-сервер - это сервер Shadowsocks, который я установил на другом компьютере в моей локальной сети. Я использую Java 8 и j2ssh-Maverick 1.5

Я следовал примеру, чтобы создать прокси-соединение SFTP, которое поставляется с j2ssh-maverick. Когда я пытаюсь установить первое соединение с прокси-сервером, выполнение зависает в классе SshConnect при попытке получить удаленную идентификацию, которая так и не была получена.

private void connect() throws ProcessorException {
    try {
        boolean useProxy = StringUtils.isNotBlank(System.getProperty("wwProxyHost"));
        if (useProxy) {
            String proxyHost = System.getProperty("wwProxyHost");
            int proxyPort = Integer.parseInt(System.getProperty("wwProxyPort", "1080"));
            logger.info("Connecting to SFTP server through proxy "+proxyHost+":"+proxyPort);
            String proxyUser = System.getProperty("wwProxyUser", null);
            SocketTransport socketTransport = new SocketTransport(proxyHost, proxyPort);
// Execution doesn't go beyong the line below
            SshClient proxySshClient = sshConnector.connect(socketTransport, proxyUser);
            if (StringUtils.isNotBlank(proxyUser)) {
                logger.debug("Trying to authenticate proxy server with user "+proxyUser);
                PasswordAuthentication proxyAuthentication = new PasswordAuthentication();
                proxyAuthentication.setPassword(System.getProperty("wwProxyPassword", ""));
                int proxyAuthResult = proxySshClient.authenticate(proxyAuthentication);
                if (proxyAuthResult != SshAuthentication.COMPLETE) {
                    throw new ProcessorException("Cannot authenticate proxy server "+proxyHost+":"+proxyPort+" with user "+proxyUser);
                }
                logger.debug("Proxy authentication completed");
            }

            SshTunnel tunnel = proxySshClient.openForwardingChannel(host, port, "127.0.0.1", 22, "127.0.0.1", 22, null, null);
            sshClient = sshConnector.connect(tunnel, user);
        } else {
            SocketTransport socketTransport = new SocketTransport(host, port);
            socketTransport.setTcpNoDelay(true);
            sshClient = sshConnector.connect(socketTransport, user);
        }
        PublicKeyAuthentication authentication = new PublicKeyAuthentication();
        SshPrivateKeyFile sshPrivateKeyFile = SshPrivateKeyFileFactory.parse(new FileInputStream(identity));

        int authResult = -1;
        if (sshPrivateKeyFile.isPassphraseProtected()) {
            throw new ProcessorException("Using passphrase protected key files not implemented");
        } else {
            SshKeyPair keyPair = sshPrivateKeyFile.toKeyPair(null);
            authentication.setPrivateKey(keyPair.getPrivateKey());
            authentication.setPublicKey(keyPair.getPublicKey());
            authResult = sshClient.authenticate(authentication);
        }
        if (authResult == SshAuthentication.COMPLETE && sshClient.isConnected()) {
            sftpClient = new SftpClient(sshClient);
            sftpClient.setTransferMode(SftpClient.MODE_BINARY);
        } else {
            throw new ProcessorException("Authentication didn't complete or SSH clients is not connected; (authResult=" + authResult + ", conected=" + sshClient.isConnected() + ")");
        }
    } catch (IOException | SshException | InvalidPassphraseException | SftpStatusException | ChannelOpenException e) {
        throw new ProcessorException("Cannot connect to " + host+":"+port, e);
    }

}

Через некоторое время из входного потока читается -1, и возникает исключение SshException с сообщением «Не удалось прочитать удаленную идентификацию».

Это от трассировки стека:

Caused by: com.sshtools.ssh.SshException: Failed to read remote identification  [Unknown cause]
    at com.sshtools.ssh.SshConnector.getRemoteIdentification(SshConnector.java:355) ~[j2ssh-maverick-1.5.5.jar:?]
    at com.sshtools.ssh.SshConnector.connect(SshConnector.java:296) ~[j2ssh-maverick-1.5.5.jar:?]
    at com.sshtools.ssh.SshConnector.connect(SshConnector.java:169) ~[j2ssh-maverick-1.5.5.jar:?]

Любая помощь будет оценена

...