Camel SFTP组件- SSH私钥URI可与privateKeyFile配合使用,但不能与privateKey配合使用

bksxznpy  于 2022-11-07  发布在  Apache
关注(0)|答案(1)|浏览(157)

我有一条 Camel 路线,看起来像下一条:

from("direct:download")
        .pollEnrich()
        .simple("sftp://my.host:22/folder/?username=foo&fileName=${header.CamelFileName}
        &privateKeyFile=src/main/resources/privateSSHKey")
        .to("file://state/downloaded");

src/main/resources/privateSSHKey文件是一个RSA私钥,它可以正常工作:JSCH(Camel用于SFTP端点的库)管理连接和下载所需的文件。
前面的设置在开发过程中是可以的,因为我可以在本地拥有包含密钥的文件。但是,对于prod,我们有其他系统,在其中我可以获得包含密钥内容的字节数组。为此,我将路径更改为如下所示:

from("direct:download")
        .pollEnrich()
        .simple("sftp://my.host:22/folder/?username=foo&fileName=${header.CamelFileName}
     &privateKey=" + URLEncoder.encode(new String(sshPrivateKey), "UTF-8"))
        .to("file://state/downloaded");

... sshPrivateKey是字节数组。不幸的是,我总是从JSCH得到“auth_cancel”,调试时我可以看到,当试图与SFTP服务器握手时会发生这种情况。
我是不是遗漏了什么?我很确定对sshPrivateKey byte[]进行编码是正确的方法(如果我不这样做,JSCH会抱怨错误的键),但我不确定我遗漏了什么?

0vvn1miw

0vvn1miw1#

问题的根源是编码,URLEncoding,byteString可能会丢失一些字符,如+\\。我设法使它与privateKey方法Java DSL的Byte[]参数一起工作。
示例:

String privateKeyString = Files.readString(Path.of("/.ssh/private_key_rsa"), StandardCharsets.UTF_8);

getCamelContext().getRegistry().bind("myPrivateKey", privateKeyString.toByteArray())

from("file://tmp")
.to(sftp("localhost")
        .username("test")
        .privateKey("#myPrivateKey"));

相关问题