Titan SFTP 服务器无法识别 JSch hostKey
JSch hostKey not recognised with Titan SFTP server
我在通过 JSch 验证主机密钥时遇到问题。我正在为我的应用程序使用 jsch 0.1.53,我连接的服务器是 SouthRiverTech 的 Titan SFTP 服务器。
我已经尝试使用 Puttygen(Titan 内置密钥生成器)以及 JSch 的内置库生成密钥对。我使用的设置是 RSA,2048 位。
JSch 的内置库创建的密钥似乎不起作用。 Titan 和 Puttygen 生成的密钥可以与 winSCP 一起使用,但 JSch 一直给我一个 "Reject Hostkey" 错误,这应该是 known_hosts 文件的问题。根据我的发现,known_hosts 文件应该与 public 密钥文件相同,但如果我错了请告诉我。我已将 Titan 的 SFTP 版本设置为版本 3.
我在 Titan 中为用户配置文件设置了相同的键来找出错误所在,但无济于事。到目前为止,我还没有在网上找到关于 JSch 和 Titan 服务器之间的主机密钥问题的任何答案。这让我很头疼。
提前感谢您的任何答复。我会尽力 post 我可能错过的任何信息。
编辑
进一步调试发现 JSchException: UnknownHostKey,随后是服务器使用的 RSA 密钥指纹。我的客户端密钥指纹和服务器密钥指纹是一样的,为什么会这样?
编辑
这是我的 Java 代码:
knownHostsFile = "D:/Keys/test.pub";
privateKey = "D:/Keys/test";
Session session = null;
Channel channel = null;
for(int i = 0; i < 3; i++) {
try {
logger.debug("Starting Upload");
JSch ssh=new JSch();
logger.debug("setting hosts - public key");
ssh.setKnownHosts(knownHostsFile);
logger.debug("Known hosts set as "+knownHostsFile);
logger.debug("Setting identity - private key");
ssh.addIdentity(privateKey);
logger.debug("identity set");
try {
int hostSFTPPort = Integer.parseInt(sftpPort);
if (!hostUserName.equalsIgnoreCase("no")
&& !hostPassword.equalsIgnoreCase("no")
&& !hostAddress.equalsIgnoreCase("no")) {
session=ssh.getSession(hostUserName,hostAddress,hostSFTPPort);
session.setPassword(hostPassword);
}
} catch (NumberFormatException ef){
logger.debug(ef);
}
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "yes");
config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
session.setConfig(config);
logger.debug("Establishing connection...");
session.connect(120000);
logger.debug("Connection established.");
logger.debug("Creating SFTP Channel.");
channel=session.openChannel("sftp");
logger.debug("Channel assigned. Connecting channel...");
channel.connect(120000);
logger.debug("SFTP Channel created.");
ChannelSftp sftp = (ChannelSftp) channel;
logger.debug("connection:"+sftp.isConnected());
if(sftp.isConnected()) {
result=Constants.CONNECTION_ONLINE;
}
session.disconnect();
channel.disconnect();
break;
} catch (JSchException e) {
logger.debug(e);
logger.debug(session.getHost());
logger.debug(session.getHostKey());
logger.debug("Continuing next loop......");
throw new JSchException("Session.connect failed",e);
} catch (Exception ex) {
logger.debug(ex);
logger.debug("Continuing next loop......");
continue;
}
}
的图片
以下是我遇到问题的键:
这个似乎不适用于 winSCP,并且是在 Linux 环境中创建的
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4R+w9rGUsBNJGZxAdnbnA7FMfGGhx3YaLYZtKf9wzKm8NkZeYIuh1fJ6ViX6RmdO55QxQ3PmBIg8QdhQ8m6SizEt9OGeXU2AnEbX/sbj54oHmiFsv24eDFzr7nrDKnrcllByob3LqjeOy5zg27kJt860oh6BAJfimdqVtETSXR1JHfqUIqGxIqsvyKEotX8gjoGkgsW653f18dW5PJKSEvrq6k1SL0bfgSAA0rN4nUq3JzDvowg5ijkOl91/lj8+FEQ7SjWmguTSx5BoI/CTxatCwNZSdzNED/u5A8I3716JuY7MEiTciPdzspGAXS2mHOtsDPkT7z6jvKQ6hWWv/w== test1@10.70.149.178
这个与 winSCP 一起工作,并且是在 Windows 环境中创建的
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "test"
AAAAB3NzaC1yc2EAAAABJQAAAQEA9a1nnbl/DV2Zo7s1IUifeC5suRmdO2ikSb0ToteO9uvA
gg0zYKA1iH52ysC+4Ni86Ceal4oWGl1dXZRKOaWNH6175uDTI1aBfPBvOddBheTeSQAWOkaM
eL5PDDabLkaKZ1GrtbTeEFOD/Kj/dVREhT5/OcEdFmCbHK6+vr2klrtH2xOd/Qeb89BzDFaj
weNER3fFnHVqy5/Nugo3n7CsiBxuK8KOVN4WpDHzrVe/tjAfVZyH8l4XHlR7bWA5rlAGwt0Y
HILQ+lT1PRmi5PiDq7WuP7NF3QhWjG/D1u/5PC/DzxjTOxwwmXfYj2T2OkE/2/tHSdU4geYr
+1ivdASJ5w==
---- END SSH2 PUBLIC KEY ----
您将帐户密钥对与主机密钥(对)混淆了。
JSchException
"reject HostKey: ..." 表示服务器的 public 密钥(又名主机密钥)与 public 密钥不同您的代码已知或缓存在 known_hosts
文件中。
服务器的主机密钥通常不是由 PuTTYgen 生成的(尽管它可能是可能的)并且绝对与 WinSCP 无关。在 PuTTYgen 中,您通常会生成一个帐户密钥对(然后您可以在 WinSCP 中使用)。
详见我的文章Understanding SSH key pairs。
帐号密钥对和主机密钥对没有任何关系。无论您使用什么帐户密钥,它都不会让 JSch 接受服务器的主机密钥。忘掉这个想法吧。完全错了。
您必须在 known_hosts
文件(或 JSch HostKeyRepository
接口的其他实现)中提供正确的主机密钥。您不能将 .pub
文件用于 known_hosts
文件。 known_hosts
文件的格式如下:
IP_address ssh-rsa public_key
您还可以使用 KnownHosts.add
在运行时设置预期的主机密钥。
我在通过 JSch 验证主机密钥时遇到问题。我正在为我的应用程序使用 jsch 0.1.53,我连接的服务器是 SouthRiverTech 的 Titan SFTP 服务器。
我已经尝试使用 Puttygen(Titan 内置密钥生成器)以及 JSch 的内置库生成密钥对。我使用的设置是 RSA,2048 位。
JSch 的内置库创建的密钥似乎不起作用。 Titan 和 Puttygen 生成的密钥可以与 winSCP 一起使用,但 JSch 一直给我一个 "Reject Hostkey" 错误,这应该是 known_hosts 文件的问题。根据我的发现,known_hosts 文件应该与 public 密钥文件相同,但如果我错了请告诉我。我已将 Titan 的 SFTP 版本设置为版本 3.
我在 Titan 中为用户配置文件设置了相同的键来找出错误所在,但无济于事。到目前为止,我还没有在网上找到关于 JSch 和 Titan 服务器之间的主机密钥问题的任何答案。这让我很头疼。
提前感谢您的任何答复。我会尽力 post 我可能错过的任何信息。
编辑
进一步调试发现 JSchException: UnknownHostKey,随后是服务器使用的 RSA 密钥指纹。我的客户端密钥指纹和服务器密钥指纹是一样的,为什么会这样?
编辑
这是我的 Java 代码:
knownHostsFile = "D:/Keys/test.pub";
privateKey = "D:/Keys/test";
Session session = null;
Channel channel = null;
for(int i = 0; i < 3; i++) {
try {
logger.debug("Starting Upload");
JSch ssh=new JSch();
logger.debug("setting hosts - public key");
ssh.setKnownHosts(knownHostsFile);
logger.debug("Known hosts set as "+knownHostsFile);
logger.debug("Setting identity - private key");
ssh.addIdentity(privateKey);
logger.debug("identity set");
try {
int hostSFTPPort = Integer.parseInt(sftpPort);
if (!hostUserName.equalsIgnoreCase("no")
&& !hostPassword.equalsIgnoreCase("no")
&& !hostAddress.equalsIgnoreCase("no")) {
session=ssh.getSession(hostUserName,hostAddress,hostSFTPPort);
session.setPassword(hostPassword);
}
} catch (NumberFormatException ef){
logger.debug(ef);
}
java.util.Properties config = new java.util.Properties();
config.put("StrictHostKeyChecking", "yes");
config.put("PreferredAuthentications", "publickey,keyboard-interactive,password");
session.setConfig(config);
logger.debug("Establishing connection...");
session.connect(120000);
logger.debug("Connection established.");
logger.debug("Creating SFTP Channel.");
channel=session.openChannel("sftp");
logger.debug("Channel assigned. Connecting channel...");
channel.connect(120000);
logger.debug("SFTP Channel created.");
ChannelSftp sftp = (ChannelSftp) channel;
logger.debug("connection:"+sftp.isConnected());
if(sftp.isConnected()) {
result=Constants.CONNECTION_ONLINE;
}
session.disconnect();
channel.disconnect();
break;
} catch (JSchException e) {
logger.debug(e);
logger.debug(session.getHost());
logger.debug(session.getHostKey());
logger.debug("Continuing next loop......");
throw new JSchException("Session.connect failed",e);
} catch (Exception ex) {
logger.debug(ex);
logger.debug("Continuing next loop......");
continue;
}
}
的图片
以下是我遇到问题的键:
这个似乎不适用于 winSCP,并且是在 Linux 环境中创建的
ssh-rsa AAAAB3NzaC1yc2EAAAABIwAAAQEA4R+w9rGUsBNJGZxAdnbnA7FMfGGhx3YaLYZtKf9wzKm8NkZeYIuh1fJ6ViX6RmdO55QxQ3PmBIg8QdhQ8m6SizEt9OGeXU2AnEbX/sbj54oHmiFsv24eDFzr7nrDKnrcllByob3LqjeOy5zg27kJt860oh6BAJfimdqVtETSXR1JHfqUIqGxIqsvyKEotX8gjoGkgsW653f18dW5PJKSEvrq6k1SL0bfgSAA0rN4nUq3JzDvowg5ijkOl91/lj8+FEQ7SjWmguTSx5BoI/CTxatCwNZSdzNED/u5A8I3716JuY7MEiTciPdzspGAXS2mHOtsDPkT7z6jvKQ6hWWv/w== test1@10.70.149.178
这个与 winSCP 一起工作,并且是在 Windows 环境中创建的
---- BEGIN SSH2 PUBLIC KEY ----
Comment: "test"
AAAAB3NzaC1yc2EAAAABJQAAAQEA9a1nnbl/DV2Zo7s1IUifeC5suRmdO2ikSb0ToteO9uvA
gg0zYKA1iH52ysC+4Ni86Ceal4oWGl1dXZRKOaWNH6175uDTI1aBfPBvOddBheTeSQAWOkaM
eL5PDDabLkaKZ1GrtbTeEFOD/Kj/dVREhT5/OcEdFmCbHK6+vr2klrtH2xOd/Qeb89BzDFaj
weNER3fFnHVqy5/Nugo3n7CsiBxuK8KOVN4WpDHzrVe/tjAfVZyH8l4XHlR7bWA5rlAGwt0Y
HILQ+lT1PRmi5PiDq7WuP7NF3QhWjG/D1u/5PC/DzxjTOxwwmXfYj2T2OkE/2/tHSdU4geYr
+1ivdASJ5w==
---- END SSH2 PUBLIC KEY ----
您将帐户密钥对与主机密钥(对)混淆了。
JSchException
"reject HostKey: ..." 表示服务器的 public 密钥(又名主机密钥)与 public 密钥不同您的代码已知或缓存在 known_hosts
文件中。
服务器的主机密钥通常不是由 PuTTYgen 生成的(尽管它可能是可能的)并且绝对与 WinSCP 无关。在 PuTTYgen 中,您通常会生成一个帐户密钥对(然后您可以在 WinSCP 中使用)。
详见我的文章Understanding SSH key pairs。
帐号密钥对和主机密钥对没有任何关系。无论您使用什么帐户密钥,它都不会让 JSch 接受服务器的主机密钥。忘掉这个想法吧。完全错了。
您必须在 known_hosts
文件(或 JSch HostKeyRepository
接口的其他实现)中提供正确的主机密钥。您不能将 .pub
文件用于 known_hosts
文件。 known_hosts
文件的格式如下:
IP_address ssh-rsa public_key
您还可以使用 KnownHosts.add
在运行时设置预期的主机密钥。