Apache Camel+JSch+SpringBoot连Windows SFTP失败,报JSchException认证次数过多错误
我之前也踩过这个坑!用Apache Camel+JSch搭SFTP功能,连Linux服务器顺得不行,一到Windows SFTP就报「com.jcraft.jsch.JSchException: SSH_MSG_DISCONNECT: 2 认证失败次数过多」,但WinSCP连两边都没问题,折腾了好一阵才找到几个关键原因,给你梳理下:
1. 特殊字符用户名的编码问题
你用的用户名是ABC+FTPAPPUI,带了+特殊字符。WinSCP会自动适配Windows SFTP服务器的字符处理逻辑,但JSch默认按标准URL规则解析,+会被识别成空格,导致用户名不匹配,反复认证失败触发次数限制。
解决办法很简单:把用户名里的+做URL编码,改成ABC%2BFTPAPPUI,再放到Camel的SFTP URI里。比如你的路由可以写成:
from("sftp://ABC%2BFTPAPPUI@your-windows-sftp-host:22/share/APP_Migration?password=你的密码&其他配置项")
如果你的用户是域用户,记得加上域名前缀(比如DOMAIN\\ABC+FTPAPPUI),同样要把反斜杠编码成%5C,也就是DOMAIN%5CABC%2BFTPAPPUI。
2. 强制指定密码认证方式
JSch默认会依次尝试多种认证方式(公钥、密码、键盘交互等),而有些Windows SFTP服务器(比如OpenSSH for Windows)对认证尝试次数限制很严,可能还没轮到密码认证就被判定为多次失败踢下线了。但WinSCP一般会直接用密码认证,所以不会触发这个问题。
你可以在Camel配置里强制只使用密码认证,避免多余的尝试:
- 代码里配置:
from("sftp://你的SFTP地址") .setHeader("CamelSftpPreferredAuthentications", constant("password")) // 其他路由逻辑
- 或者在Spring Boot配置文件里全局设置:
camel.component.sftp.preferred-authentications=password
3. 路径映射的坑
你提到默认主目录是/home/FTPAPPUI,访问路径是/home/FTPAPPUI/share/APP_Migration,但Windows SFTP服务器的路径规则可能和Linux不一样。比如OpenSSH for Windows会把Linux风格的路径映射到本地Windows目录,有时候主目录已经包含了前缀,你再写全路径会导致切换目录失败,服务器可能把这种异常操作也算作认证失败。
试试简化路径:如果主目录已经是/home/FTPAPPUI,那只需要写share/APP_Migration作为访问路径就行,不用带前面的主目录前缀。或者用WinSCP连接后看实际显示的路径结构,再对应到Camel的配置里。
4. 升级JSch版本
有些旧版本的JSch和新版OpenSSH for Windows兼容性不好,认证过程中会出现隐性错误,被服务器误认为多次认证失败。建议你把JSch依赖升级到最新稳定版(比如0.1.55及以上),同时确保Apache Camel的版本和JSch版本兼容。
最后,开启DEBUG日志能帮你更快定位问题,在application.properties里加这两行:
logging.level.org.apache.camel.component.sftp=DEBUG logging.level.com.jcraft.jsch=DEBUG
日志里会详细输出认证的每一步,能清楚看到是哪一步出了问题。
内容的提问来源于stack exchange,提问作者Jericho

