Apache Camel SFTP: "JSchException: invalid privatekey: [B@7c033a39" with OpenSSH private k
Posted
技术标签:
【中文标题】Apache Camel SFTP: "JSchException: invalid privatekey: [B@7c033a39" with OpenSSH private key【英文标题】: 【发布时间】:2021-08-28 10:53:29 【问题描述】:我正在尝试使用以 BEGIN OPENSSH PRIVATE KEY
开头的“新”私钥(“旧”版本以 BEGIN RSA PRIVATE KEY
开头)连接到 sftp 服务器。
-----BEGIN OPENSSH PRIVATE KEY-----
...
-----END OPENSSH PRIVATE KEY-----
使用 Camel SFTP(3.10 版)连接时出现错误
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://username1@localhost:55040
...
Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@7c033a39
如果我在命令行上连接,它会按预期工作 - 密钥很好。
我从this answer 发现该错误是由过时的 Jsch 版本引起的——但这应该在 3.10 https://issues.apache.org/jira/browse/CAMEL-16554 中为 Camel SSH 修复,但我想这不会影响 sftp?
如何连接?
sftp config 可以设置“密码”和“密钥交换协议” - 这些是否相关?
堆栈跟踪
org.apache.camel.component.file.GenericFileOperationFailedException: Cannot connect to sftp://username1@localhost:55040
at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:158) ~[camel-ftp-3.10.0.jar:3.10.0]
at org.apache.camel.component.file.remote.RemoteFileConsumer.connectIfNecessary(RemoteFileConsumer.java:235) ~[camel-ftp-3.10.0.jar:3.10.0]
at org.apache.camel.component.file.remote.RemoteFileConsumer.prePollCheck(RemoteFileConsumer.java:77) ~[camel-ftp-3.10.0.jar:3.10.0]
at org.apache.camel.component.file.GenericFileConsumer.poll(GenericFileConsumer.java:128) ~[camel-file-3.10.0.jar:3.10.0]
at org.apache.camel.support.ScheduledPollConsumer.doRun(ScheduledPollConsumer.java:190) [camel-support-3.10.0.jar:3.10.0]
at org.apache.camel.support.ScheduledPollConsumer.run(ScheduledPollConsumer.java:107) [camel-support-3.10.0.jar:3.10.0]
at org.apache.camel.pollconsumer.quartz.QuartzScheduledPollConsumerJob.execute(QuartzScheduledPollConsumerJob.java:61) [camel-quartz-3.10.0.jar:3.10.0]
at org.quartz.core.JobRunShell.run(JobRunShell.java:202) [quartz-2.3.2.jar:?]
at org.quartz.simpl.SimpleThreadPool$WorkerThread.run(SimpleThreadPool.java:573) [quartz-2.3.2.jar:?]
Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@7c033a39
at com.jcraft.jsch.KeyPair.load(KeyPair.java:664) ~[jsch-0.1.55.jar:?]
at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:46) ~[jsch-0.1.55.jar:?]
at com.jcraft.jsch.JSch.addIdentity(JSch.java:441) ~[jsch-0.1.55.jar:?]
at org.apache.camel.component.file.remote.SftpOperations.createSession(SftpOperations.java:233) ~[camel-ftp-3.10.0.jar:3.10.0]
at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:125) ~[camel-ftp-3.10.0.jar:3.10.0]
... 8 more
依赖关系
在我的项目 pom 中
org.apache.camel.springboot:camel-ftp-starter com.github.mwiede:jsch:0.1.63mvn dependency:tree -Dincludes=com.jcraft:jsch
[INFO] Scanning for projects...
[INFO]
[INFO] --------< com.project >---------
[INFO] Building com.project
[INFO] --------------------------------[ jar ]---------------------------------
[INFO]
[INFO] --- maven-dependency-plugin:3.1.2:tree (default-cli) @ com.project ---
[INFO] com.project:jar:$sha1
[INFO] \- org.apache.camel.springboot:camel-ftp-starter:jar:3.10.0:compile
[INFO] \- org.apache.camel:camel-ftp:jar:3.10.0:compile
[INFO] \- com.jcraft:jsch:jar:0.1.55:compile
【问题讨论】:
您所指的票证谈论的是与 Jsch 不同的 ssh 实现,所以我不确定它们是否相关。请检查您的类路径中的 Jsch 包版本。原 Jsch 不支持 Openssh 密钥格式,只支持来自github.com/mwiede/jsch的jsch fork 我对 jsch 没有直接依赖。我已经在 pom 中添加了 mwiede 的版本,但这不能覆盖 camel-sftp 使用的版本,可以吗? 是的,您可以使用 maven 替换工件。首先将您想要的一个作为新的依赖项,然后从它拉入的所有工件中排除一个(在您的情况下为 camel-ftp-starter) 【参考方案1】:要替换camel-ftp-starter引入的Jsch库,可以使用exclude标签,如下:
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter</artifactId>
</dependency>
<!-- First define the library of jsch fork -->
<dependency>
<groupId>com.github.mwiede</groupId>
<artifactId>jsch</artifactId>
<version>0.1.63</version>
</dependency>
<dependency>
<groupId>org.apache.camel.springboot</groupId>
<artifactId>camel-ftp-starter</artifactId>
<version>3.9.0</version>
<!-- exclude original jsch -->
<exclusions>
<exclusion>
<artifactId>jsch</artifactId>
<groupId>com.jcraft</groupId>
</exclusion>
</exclusions>
</dependency>
</dependencies>
确保没有其他依赖项拉动 jcraft.jsch 工件。
【讨论】:
非常感谢!这有助于 RSA 密钥。我现在可以使用camel-sftp 连接到带有BEGIN RSA PRIVATE KEY
和BEGIN OPENSSH PRIVATE KEY
文件的sftp 服务器。但它不适用于 ed25519 键 - com.jcraft.jsch.JSchException: Auth cancel
。我会尝试获取更多信息。
好的,请注意 com.github.mwiede:jsch 使用 JEP 339 来支持 ed25519。这意味着,它仅受最低 Java 15 的支持。
你好@aSemy 我也有同样的问题!您找到 ed25519 密钥的解决方案了吗?非常感谢!
嗨@altd - 添加手动排除 com.jsch:jsch
并添加 mwiede 作为替代解决了一些问题。我无法从 jdk11 升级到 jdk15+,所以我无法让 ed25519 密钥工作。我现在转到另一个项目。
感谢@aSemy 的回答!以上是关于Apache Camel SFTP: "JSchException: invalid privatekey: [B@7c033a39" with OpenSSH private k的主要内容,如果未能解决你的问题,请参考以下文章
Apache Camel:“direct:start”端点——这是啥意思?
Apache Camel端点注入直接路由“端点上没有可用的消费者”