ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

使用Camel中的publickey认证配置SCP路由的正确方法是什么?

2019-05-22 16:48:54  阅读:271  来源: 互联网

标签:java jsch apache-camel


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

但是,我有一段时间处理SCP配置.其目的是使其不必在私钥所在的位置以及已知主机所在的位置之外提供更多内容.

以下是示例路线.样本路由仅用于交谈;它可能不准确,但这里的意图不是将上游部分显示为“工作”.我确信文件生成部分正在运行,因为我已经为它编写了上游测试.

什么有效:

如果我指定用户名和密码并禁用严格的主机密钥检查,我的路由可行.

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条目经过哈希/混淆.

解决方法:

这感觉非常落后,但我相信我已经解决了自己的问题.

执行摘要:

> 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 -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");

标签:java,jsch,apache-camel
来源: https://codeday.me/bug/20190522/1153172.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有