【发布时间】: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.63
mvn 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)
标签: apache-camel sftp jsch openssh