在骆驼中使用公钥身份验证配置 SCP 路由的正确方法是什么?

What is the correct way to configure an SCP route with publickey authentication in Camel?

我目前正在利用 Apache Camel(撰写本文时为 2.20.2 版)作为更大 ETL 流程的一部分,将已处理的文件从 Camel box 复制到另一台机器。

但是,我在处理 SCP 配置方面遇到了麻烦。这样做的目的是为了让我不必在私钥所在的位置和已知主机所在的位置之外提供太多信息。

以下是示例路线。样例路线仅供交流;它可能不准确,但这里的目的不是将上游部分显示为 "working"。由于我为它编写了 upstream 测试,我确信文件生成部分正在运行。


有效方法

如果我指定我的用户名和密码 禁用严格的主机密钥检查,我的路由有效。

from("direct:init")
    .to("file:///tmp")
    .to("scp://my.server.local?username=makoto&password=XXXXXX" + 
                              "&preferredAuthentications=password" +
                              "&strictHostKeyChecking=no");

当然,由于政策原因,不进行严格的主机检查是绝对不可能的

什么不起作用


不用说,这里的错误消息并没有给我太多可以解决的问题,因为:


考虑到这一点,正确的配置方法是什么? Camel 邮件列表上的零散文档不会产生任何具体内容,the SCP documentation 对这些情况几乎没有实际帮助。

其他一些环境注意事项:

这感觉非常倒退和错误,但我相信我已经解决了我自己的问题。

执行摘要:

  • JSch 正在查找与您的散列主机名匹配的内容。
  • 如果它无法通过您计算机上的所有身份找到匹配项,它将把存储库标记为 "not included"。
  • 如果存储库未标记为 "OK" 并且启用了严格的主机密钥检查,它将注册为失败。

执行方案:

  • 必须将主机密钥添加到您的系统(通过使用 ssh-keyscan -t rsa -H <hostname>。仅在目标机器上拥有主机密钥是不够的。
  • 如果您的私钥有密码,您仍然有义务提供它。

有趣的是,Camel 似乎使用自己的用户和身份连接到服务器这一事实有点确凿。这让我从异常的角度去观察代码流程。

我观察到的第一个是散列主机无处在JSch迭代的身份向量中找不到。这意味着,尽管我之前已经通过 SSH 连接到这台机器,但 JSch 拥有它 none 并且没有注意到它的存在。

所以我从 this Server Fault question 中找到了一些灵​​感,因为我需要将一个新的哈希主机添加到我自己的身份文件中。

实际上,我使用了 this answer,因为它似乎是最实用和最安全的方法:

  • ssh-keyscan -t rsa -H my.server.local
  • 从该命令的输出中明确复制 RSA-only 哈希(我相信最多可以有 3 行)并将其附加到我的 known_hosts 文件
  • 的末尾

不过,我确实发现身份验证仍然莫名其妙地失败了。为了调试和诊断正在发生的事情,我选择保留私钥的路径,并将私钥的密码添加到系统中,以便 JSch 可以使用它。

我可以承认所需的密码是我的疏忽,但它无法选择一个合理的私钥来使用这一事实让我感到惊讶,特别是考虑到普通的 SSH 将遍历它们。

现已完成,完整路线如下所示:

from("direct:init")
    .to("file:///tmp")
    .to("scp://my.server.local?username=makoto&privateKeyFilePassphrase=XXXXXX" + 
                          "&preferredAuthentications=publickey" +
                          "&privateKeyFile=/path/to/.ssh/id_rsa");