NiFi ListSFTP处理器无法连接SFTP服务器的问题求助
从你提供的报错日志和配置细节来看,这个问题的核心原因几乎可以确定是SSH私钥格式不兼容——NiFi底层依赖的JSch库对OpenSSH新格式的私钥支持有限,而你命令行能正常使用的密钥大概率是这种新格式。
问题分析
你命令行能成功连接,但NiFi报错com.jcraft.jsch.JSchException: invalid privatekey,本质原因是:
- OpenSSH 7.8及以上版本默认生成的私钥是
OPENSSH PRIVATE KEY格式(开头是-----BEGIN OPENSSH PRIVATE KEY-----) - JSch库(NiFi使用的版本通常对这种新格式支持不佳)只能识别传统的PEM格式私钥(比如
-----BEGIN RSA PRIVATE KEY-----)
解决方案
1. 转换私钥为JSch兼容的PEM格式
在NiFi服务器上执行以下命令,把你的私钥转换成传统格式:
ssh-keygen -p -f /path/to/your/private/key -m PEM
执行后会提示你输入原密钥的密码短语,之后可以设置新密码(或者和原密码一致),完成后密钥就会变成JSch能识别的格式。
2. 确保NiFi用户对私钥有正确权限
NiFi的运行用户(通常是nifi)需要能读取私钥文件,同时私钥权限必须严格设为600(否则JSch会拒绝加载):
chown nifi:nifi /path/to/your/private/key chmod 600 /path/to/your/private/key
3. 验证Host Key File的正确性
确认你用ssh-keyscan生成的主机密钥文件没有格式错误,正确生成命令是:
ssh-keyscan your-sftp-host-ip >> /path/to/host/key/file
不要手动修改文件内容,避免出现换行或格式异常。
额外排查点
- 检查
Private Key Phrase是否输入正确,注意大小写、特殊字符的拼写 - 确认
Strict Host Key Checking配置为false(NiFi的配置项取值是布尔值,不要写成字符串)
附你提供的报错日志:
2020-03-19 15:43:19,736 ERROR [Timer-Driven Process Thread-2] o.a.nifi.processors.standard.ListSFTP ListSFTP[id=d343fa19-0170-1000-3352-999829a448cc] Failed to perform listing on remote host due to java.io.IOException: Failed to obtain connection to remote host due to com.jcraft.jsch.JSchException: invalid privatekey: [B@6d9b662: {}
java.io.IOException: Failed to obtain connection to remote host due to com.jcraft.jsch.JSchException: invalid privatekey: [B@6d9b662
at org.apache.nifi.processors.standard.util.SFTPTransfer.getChannel(SFTPTransfer.java:515)
at org.apache.nifi.processors.standard.util.SFTPTransfer.getListing(SFTPTransfer.java:212)
at org.apache.nifi.processors.standard.util.SFTPTransfer.getListing(SFTPTransfer.java:175)
at org.apache.nifi.processors.standard.ListFileTransfer.performListing(ListFileTransfer.java:106)
at org.apache.nifi.processors.standard.ListSFTP.performListing(ListSFTP.java:146)
at org.apache.nifi.processor.util.list.AbstractListProcessor.listByTrackingTimestamps(AbstractListProcessor.java:472)
at org.apache.nifi.processor.util.list.AbstractListProcessor.onTrigger(AbstractListProcessor.java:414)
at org.apache.nifi.processor.AbstractProcessor.onTrigger(AbstractProcessor.java:27)
at org.apache.nifi.controller.StandardProcessorNode.onTrigger(StandardProcessorNode.java:1162)
at org.apache.nifi.controller.tasks.ConnectableTask.invoke(ConnectableTask.java:209)
at org.apache.nifi.controller.scheduling.TimerDrivenSchedulingAgent$1.run(TimerDrivenSchedulingAgent.java:117)
at org.apache.nifi.engine.FlowEngine$2.run(FlowEngine.java:110)
at java.util.concurrent.Executors$RunnableAdapter.call(Executors.java:511)
at java.util.concurrent.FutureTask.runAndReset(FutureTask.java:308)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.access$301(ScheduledThreadPoolExecutor.java:180)
at java.util.concurrent.ScheduledThreadPoolExecutor$ScheduledFutureTask.run(ScheduledThreadPoolExecutor.java:294)
at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
at java.lang.Thread.run(Thread.java:748)
Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [B@6d9b662
at com.jcraft.jsch.KeyPair.load(KeyPair.java:664)
at com.jcraft.jsch.KeyPair.load(KeyPair.java:561)
at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:40)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:407)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:388)
at org.apache.nifi.processors.standard.util.SFTPTransfer.getChannel(SFTPTransfer.java:485)
... 18 common frames omitted
内容的提问来源于stack exchange,提问作者Peter Zandbergen

