【问题标题】:J2SSH - Add Key Exchange AlgorithmJ2SSH - 添加密钥交换算法
【发布时间】:2023-11-08 18:56:01
【问题描述】:

我正在尝试使用 j2ssh 将文件从我的应用程序 SCP 到服务器。远程服务器正在运行 TECTIA。

从命令行(部署我的应用程序的 Solaris 机器)使用我们交换的密钥对,scp 可以正常工作。

在我的应用程序中,j2ssh 无法建立连接,抛出异常:

Caused by: com.sshtools.j2ssh.transport.TransportProtocolException: The connection did not complete

来自 j2ssh 的调试日志显示如下:

com.sshtools.j2ssh.transport.TransportProtocolCommon.beginKeyExchange(Unknown Source) | Starting key exchange
com.sshtools.j2ssh.transport.TransportProtocolCommon.determineAlgorithm(Unknown Source) | Determine Algorithm
com.sshtools.j2ssh.transport.TransportProtocolCommon.determineAlgorithm(Unknown Source) | Client Algorithms: [diffie-hellman-group1-sha1]
com.sshtools.j2ssh.transport.TransportProtocolCommon.determineAlgorithm(Unknown Source) | Server Algorithms: [diffie-hellman-group14-sha1, diffie-hellman-group-exchange-sha1]
com.sshtools.j2ssh.transport.TransportProtocolCommon.sendMessage(Unknown Source) | Sending SSH_MSG_DISCONNECT
com.sshtools.j2ssh.transport.TransportProtocolCommon.run(Unknown Source) | The Transport Protocol has been stopped

从上面我可以看到我的应用程序和服务器之间的密钥交换没有匹配算法(调试实际上表明这个问题的根源是AlgorithmNotAgreedException,当没有服务器和客户端算法匹配时,我知道这是根本原因)。

如何向 j2ssh 添加新算法以便它可以找到匹配项? j2ssh 文档非常少。

【问题讨论】:

  • 如果您使用 Runtime 的 exec 和 scp,这似乎会容易得多。
  • 我同意你和@Jeremy*s 的观点,文件传输的不同实现可能是这里的“最佳”解决方案,但此时它不是一个选项。这是一个特定的用例,恰好打破了我们进行 SFTP 传输的方式。我现在不能重写这部分。现在我受 j2ssh 的约束,直到我有时间重写它(看看你的 Apache VFS)

标签: java scp j2ssh


【解决方案1】:

您应该在 j2ssh 发行版中有一个 sshtools.xml 文件。在该文件中,您可以向映射添加额外的 ExtensionAlgorithm 条目

diffie-hellman-group14-sha1 to
com.maverick.ssh.components.jce.DiffieHellmanGroup14Sha1

或到

com.maverick.ssh.components.standalone.DiffieHellmanGroup14Sha1

【讨论】:

  • 实际上我们使用的是 j2ssh-0.2.9,而不是 javassh.com 的 j2ssh。抱歉,我应该指定的。有一个 sshtools.xml 配置文件,但只有 1 个实现 SshKeyExchange 的类,那就是 DhGroup1Sha1,所以虽然我应该能够配置它,但我没有什么可配置的。如果我在这里错了,请纠正我
  • 您使用的是 sourceforge 的版本吗?该版本似乎只有一个 SshKeyExchange 实现。如果您对远程服务器具有管理员访问权限,则可以将 TECTIA 配置为支持 diffie-hellman-group1-sha1(如他们的docs 中所述)
  • 是的,最后这就是我们所做的,将密钥交换添加到 TECTIA 以使其正常工作。根据您对特立独行 j2ssh 的正确答案以及直接将算法添加到 TECTIA 的正确评论响应,将此答案标记为已接受。
  • 建议答案是削弱服务器的安全性是错误的答案。将您的 API 升级到支持最新密钥交换机制的当前版本。 github.com/sshtools/j2ssh-maverick有一个开源版本@
【解决方案2】:

我对你的问题没有确切的答案,但我有一个建议。看看 jsch 库。我在几个应用程序中成功使用了 jsch。

【讨论】: