我正在用Anypoint Studio创建一个简单的Mule流-它会定期轮询目录,当文件放在目录中时,它会将其发送到SFTP服务器。但是,当应用程序开始与服务器协商安全连接时,它将失败并显示以下错误:
java.io.IOException:登录到username @ host时出错: Session.connect:java.security.InvalidAlgorithmParameterException:DH 密钥大小必须是64的倍数,并且只能在512到8192之间 (包括的)。不支持特定的密钥大小2047
堆栈跟踪引用了jsch库中的几个文件。前面问题中的解决方案建议使用其他版本的jsch或自己编辑jsch jar升级到Java 8。我的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代码。
答案 0 :(得分:1)
改变提供者似乎是解决问题的方法。不幸的是,使用Mule连接器无法做到这一点,因此我们不得不用纯Java重新编写sftp连接器。下载bouncycastle .jars之后,将它们放在src / main / app / lib中,然后将它们添加到构建路径中。您应该能够导入它们(由于某些原因,我不得不导入org.python.bouncycastle.jce.provider而不是org.bouncycastle.jce.provider)。我在代码的顶部放了:
Security.insertProviderAt(new BouncyCastleProvider(), 1);
并且在流运行时,正确协商了dh键,并且不会引发任何错误。