【发布时间】:2018-06-19 18:59:11
【问题描述】:
我正在 Anypoint Studio 中创建一个简单的 Mule 流程 - 它会定期轮询目录,当文件放入目录中时,它会将其发送到 SFTP 服务器。但是,当应用程序开始与服务器协商安全连接时,它会失败并出现以下错误:
java.io.IOException: 登录 username@host 时出错: Session.connect:java.security.InvalidAlgorithmParameterException:DH 密钥大小必须是 64 的倍数,范围只能是 512 到 8192 (包括的)。不支持具体密钥大小2047
堆栈跟踪引用了 jsch 库中的几个文件。之前问题中的解决方案建议升级到 Java 8,使用不同版本的 jsch,或者自己编辑 jsch jar。我的 Mule 服务器(版本 3.9.0 EE)已经在 Java 8 上,我尝试了几个不同版本的 jsch,编辑 jars 是不切实际的,因为这个应用程序将部署到几个不同的环境中。
我可以通过 WinSCP 使用与应用程序相同的凭据登录到 sftp 服务器。一位同事尝试修改工作流程以使用相同的凭据来移动相同的文件,但他们得到了相同的错误。这是我的流程的 XML:
<flow name="ClCoFlow">
<file:inbound-endpoint path="${file.from}"
moveToDirectory="${file.backup}" responseTimeout="10000"
doc:name="Get File to Transfer" />
<logger
message="#[flowVars.originalFilename] being moved to #[flowVars.moveToDirectory]"
level="INFO" doc:name="File In" />
<sftp:outbound-endpoint exchange-pattern="one-way"
host="${sftp.host}" port="${sftp.port}" path="${sftp.path}" user="${sftp.user}"
password="${sftp.password}" responseTimeout="10000" doc:name="SFTP" />
<logger message="#[flowVars.originalFilename] sent to sftp service"
level="INFO" doc:name="File sent" />
</flow>
提前感谢您提供的任何帮助
编辑
尽管 Mule 是基于 Java 构建的,并且 Mule 应用程序是使用 Java 和 Spring 在幕后构建的,但在创建 Mule 流时不需要编写实际的 Java 代码。
【问题讨论】:
-
更改提供者列表应该在您的代码中在调用jsch之前完成。如果你不能这样做,你也可以通过 j8 在文件 JRE/lib/security/java.security 或 j9 中的 JRE/conf/security/java.security 中配置它(我预计是 10 个),但需要注意的是适用于在该 JRE 中运行的所有程序。 PS:WinSCP 之所以有效,是因为它使用了完全不同的协议实现,即 putty 的 C 语言实现。