Java Sftp 上传文件报错 invalid privatekey

2025-02-11T16:26:00

资方给了 sdk 和 demo,在 demo 中测试上传和下载都是 OK 的,但是迁移到项目中上传却提示 invalid privatekey

断点跟踪了一下,发现是 ChannelSftp 初始化的过程中报错,具体结合参数分析为 connectKey,由配置项 sftpConnectKey 传入。配置项 sftpConnectKey 在 demo 中是直接定义的:

String sftpConnectKey = "-----BEGIN RSA PRIVATE KEY-----\n" +
            "MIIEpgIBAAKCAQEAy3RFpEH/1p68xW1zhvnqlBArOZBmaj4jFtkQ+AG8u78f7I52\n" +
            "AnNqf/P2RMS1KvHnN/O7uIWr4sV6VOlaENCB3o3mgVPqYdiVVMMM/Vot9MSZ5nkh\n" +
            "6yJ9S65zhtwrbHwHJLvkxqeJIQ4e6g1JOSjm4s6xwCF/O2Lco49c6MMvt2BB3Qp8\n" +
...

项目中将配置都放在 nacos 配置中,通过 @Value 注入。

查看配置项 sftpConnectKey 为一行,当初做的处理是去掉 "+,保留字符串中的 \n,通过删除回车合并到一行。

sftpConnectKey: -----BEGIN RSA PRIVATE KEY-----\nMIIEpgIBAAKCAQEAy3RFpEH/1p68xW1zhvnqlBArOZBmaj4jFtkQ+AG8u78f7I52\nAnNqf/P2RMS1KvHnN/O7uIWr4sV6VOlaENCB3o3mgVPqYdiVVMMM/Vot9MSZ5nkh\n6yJ9S65zhtwrbHwHJLvkxqeJIQ4e6g1JOSjm4s6xwCF/O2Lco49c6MMvt2BB3Qp8\n...

通过断点变量里的视图查看到,配置项显示符合 nacos 中的定义,没有延迟或者配置未同步的情况。但就会出现报错:invalid privatekey

猜测可能和这个换行符 \n有关,代码里是字符串,能够识别出换行符,而 nacos 配置中可能是把转义字符转义处理过了,导致换行符无法生效。

按照猜测修改,去除掉 \n,保留看不见的换行符,即保持原始的换行状态。

  sftpConnectKey: '-----BEGIN RSA PRIVATE KEY-----
MIIEpgIBAAKCAQEAy3RFpEH/1p68xW1zhvnqlBArOZBmaj4jFtkQ+AG8u78f7I52
AnNqf/P2RMS1KvHnN/O7uIWr4sV6VOlaENCB3o3mgVPqYdiVVMMM/Vot9MSZ5nkh
6yJ9S65zhtwrbHwHJLvkxqeJIQ4e6g1JOSjm4s6xwCF/O2Lco49c6MMvt2BB3Qp8
...

再次测试,成功!

——————

2.13 更新

第二天测试发现又不行了,试了 n 多次,最后好到一个 yaml 多行字符串的配置方法:YAML中多行字符串的配置方法

方法一在每行末尾加一个 \ 但测试无效;方法二是在字符串首行增加一个 | 其余开头、密钥内容、结尾分别占一行,测试有效。

  sftpConnectKey: |
    -----BEGIN RSA PRIVATE KEY-----
    MIIEpgIBAAKCAQEAy3RFpEH/1p68xW1zhvnqlBArOZBmaj4jFtkQ+AG8u78f7I52AnNqf/P2RMS1KvHnN/O7uIWr4sV6VOlaENCB3o3mgVPqYdiVV...
    -----END RSA PRIVATE KEY-----
当前页面是本站的「Baidu MIP」版。发表评论请点击:完整版 »