【问题标题】:What is the correct way to configure an SCP route with publickey authentication in Camel?在 Camel 中配置带有公钥身份验证的 SCP 路由的正确方法是什么?
【发布时间】:2018-02-19 17:17:43
【问题描述】:

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

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

以下是示例路线。示例路线仅用于交谈;它可能不准确,但这里的目的不是将上游部分显示为“工作”。由于我为它编写了 upstream 的测试,我确信文件生成部分正在工作。


什么有效:

如果我指定我的用户名和密码并且禁用严格的主机密钥检查,我的路由可以工作。

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

当然,由于政策原因,没有严格的主机检查是绝对不行的。

什么不起作用:

  • 如果我指定我的用户名和密码并不禁用严格的主机密钥检查,我会收到以下错误:

    com.jcraft.jsch.JSchException: reject HostKey: my.server.local
        at com.jcraft.jsch.Session.checkHost(Session.java:789) ~[jsch-0.1.54.jar:na]
        at com.jcraft.jsch.Session.connect(Session.java:345) ~[jsch-0.1.54.jar:na]
        at org.apache.camel.component.scp.ScpOperations.createSession(ScpOperations.java:284) [camel-jsch-2.20.2.jar:2.20.2]
        at org.apache.camel.component.scp.ScpOperations.connect(ScpOperations.java:179) [camel-jsch-2.20.2.jar:2.20.2]
    
  • 如果我指定了我的用户名和密码,请不禁用严格的主机密钥检查并不 将我的首选身份验证类型指定为“密码”,我得到与上述相同的错误。

  • 如果我省略我的密码以支持指定我的私钥的路径,并且我禁用严格的主机密钥检查,我得到这个错误:

    com.jcraft.jsch.JSchException: Auth cancel
        at com.jcraft.jsch.Session.connect(Session.java:518) ~[jsch-0.1.54.jar:na]
        at org.apache.camel.component.scp.ScpOperations.createSession(ScpOperations.java:284) [camel-jsch-2.20.2.jar:2.20.2]
    
  • 如果我执行上述所有操作并且将 publickey 作为我的首选身份验证,我会收到以下错误:

    com.jcraft.jsch.JSchException: Auth fail
        at com.jcraft.jsch.Session.connect(Session.java:519) ~[jsch-0.1.54.jar:na]
        at org.apache.camel.component.scp.ScpOperations.createSession(ScpOperations.java:284) [camel-jsch-2.20.2.jar:2.20.2]
        at org.apache.camel.component.scp.ScpOperations.connect(ScpOperations.java:179) [camel-jsch-2.20.2.jar:2.20.2]
    

    在这种情况下,Camel 似乎完全无视我的用户,并选择使用自己的用户:

    2018-02-19 10:46:15.142 DEBUG 23940 --- [obfuscated-route] o.a.camel.component.scp.ScpOperations    : Passphrase for camel-jsch
    2018-02-19 10:46:15.142  WARN 23940 --- [obfuscated-route] o.a.camel.component.scp.ScpOperations    : Private Key authentication not supported
    2018-02-19 10:46:15.142 DEBUG 23940 --- [obfuscated-route] o.a.camel.component.scp.ScpOperations    : Passphrase for camel-jsch
    2018-02-19 10:46:15.142  WARN 23940 --- [obfuscated-route] o.a.camel.component.scp.ScpOperations    : Private Key authentication not supported
    

不用说,这里的错误消息并没有给我太多的东西,因为:

  • 它们因情况而异
  • 它们是特定于配置的;就好像每一个配置都缺少一些东西

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

其他一些需要注意的环境事项:

  • 我既不“控制” Camel 所在的机器,也不“控制”接收文件的机器。
  • 我正在我的机器上进行本地测试,我的公钥绝对包含在主机的 authorized_keys 文件中。
  • 我机器上的 known_hosts 条目被散列/混淆。

【问题讨论】:

    标签: java apache-camel jsch


    【解决方案1】:

    这感觉令人难以置信的倒退和错误,但我相信我已经解决了自己的问题。

    执行摘要:

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

    执行解决方案:

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

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

    我观察到的第一件事是散列主机在 JSch 迭代的身份向量中无处。这意味着,尽管我之前已经通过 SSH 连接到这台机器,但 JSch 却一无所获,并且忘记了它的存在。

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

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

    • ssh-keyscan -t rsa -H my.server.local
    • 从该命令的输出中显式复制仅限 RSA 的哈希(我相信最多可以有 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");
    

    【讨论】:

    • Nit:OpenSSH 在 known_hosts 中使用并由 ssh-keyscan 输出的 pubkey 行(和在 authorized_keys 中使用的几乎相同)是一行,但取决于密钥类型和大小有时是一个非常long 行,当显示在典型的终端窗口上时,它会换行成多条物理行。使用复制和粘贴或刮擦等可能会或可能不会正确处理此问题,具体取决于您使用的软件和有时选项;显然你很幸运。
    • @dave_thompson_085:我还有一个 34" 显示器和一个可以进行正确文本换行的终端(在 Linux 上,不少于)。我明白你的意思,但服务器故障的答案中的价值仍然存在; 如果可以的话,只取你需要的公钥,不要全部取走。
    猜你喜欢
    • 1970-01-01
    • 2018-02-08
    • 2019-04-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2023-02-15
    • 1970-01-01
    • 2017-12-05
    相关资源
    最近更新 更多