SFTP 连接器 DH 密钥错误
SFTP Connector DH Key Error
我正在 Anypoint Studio 中创建一个简单的 Mule 流 - 它会定期轮询一个目录,当一个文件被放置在该目录中时,它会将它发送到一个 SFTP 服务器。但是,当应用程序开始与服务器协商安全连接时,它失败并出现以下错误:
java.io.IOException: Error during login to username@host:
Session.connect: java.security.InvalidAlgorithmParameterException: DH
key size must be multiple of 64, and can only range from 512 to 8192
(inclusive). The specific key size 2047 is not supported
堆栈跟踪引用了 jsch 库中的多个文件。前面问题中的解决方案建议升级到 Java 8,使用不同版本的 jsch,或者自己编辑 jsch jar。我的 Mule 服务器(版本 3.9.0 EE)已经在 Java8 上,我尝试了几个不同版本的 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 构建的,但没有编写实际的 Java 代码在创建 Mule 流时。
更换提供者似乎是解决问题的方法。不幸的是,Mule 连接器无法做到这一点,所以我们不得不重写 sftp 连接器 Java。下载 bouncycastle .jars 后,将它们放在 src/main/app/lib 中,然后将它们添加到构建路径中。您应该能够导入它们(出于某种原因我不得不导入 org.python.bouncycastle.jce.provider 而不是 org.bouncycastle.jce.provider)。在我的代码顶部,我输入了:
Security.insertProviderAt(new BouncyCastleProvider(), 1);
并且当流程运行时,dh 密钥被正确协商并且没有抛出任何错误。
我正在 Anypoint Studio 中创建一个简单的 Mule 流 - 它会定期轮询一个目录,当一个文件被放置在该目录中时,它会将它发送到一个 SFTP 服务器。但是,当应用程序开始与服务器协商安全连接时,它失败并出现以下错误:
java.io.IOException: Error during login to username@host: Session.connect: java.security.InvalidAlgorithmParameterException: DH key size must be multiple of 64, and can only range from 512 to 8192 (inclusive). The specific key size 2047 is not supported
堆栈跟踪引用了 jsch 库中的多个文件。前面问题中的解决方案建议升级到 Java 8,使用不同版本的 jsch,或者自己编辑 jsch jar。我的 Mule 服务器(版本 3.9.0 EE)已经在 Java8 上,我尝试了几个不同版本的 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 构建的,但没有编写实际的 Java 代码在创建 Mule 流时。
更换提供者似乎是解决问题的方法。不幸的是,Mule 连接器无法做到这一点,所以我们不得不重写 sftp 连接器 Java。下载 bouncycastle .jars 后,将它们放在 src/main/app/lib 中,然后将它们添加到构建路径中。您应该能够导入它们(出于某种原因我不得不导入 org.python.bouncycastle.jce.provider 而不是 org.bouncycastle.jce.provider)。在我的代码顶部,我输入了:
Security.insertProviderAt(new BouncyCastleProvider(), 1);
并且当流程运行时,dh 密钥被正确协商并且没有抛出任何错误。