Я написал программу на 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:?]
Любая помощь будет оценена