找了很久其他博客無法解決的,請認真讀這篇
前提:做結算對賬項目,需要用密鑰登錄工行ftp服務器下載對賬單(密鑰爲linux系統生成,命令ssh-keygen -t rsa),公鑰提供給工行對接人
用xshell-xftp工具,可以登錄服務器,(公私鑰,端口等沒問題)
技術選型:jsch
用java寫完代碼聯調,出問題,報錯如下:
com.jcraft.jsch.JSchException: invalid privatekey: [B@7b98f307
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:406)
at com.jcraft.jsch.JSch.addIdentity(JSch.java:366)
網上有很多這個問題,解決方案:
1 jsch版本低,解析不了高版本的openssh生成的祕鑰
1)升級jsch版本,此時最新爲0.1.55,可自行去官網查看最新版本http://www.jcraft.com/jsch/
<dependency> <groupId>com.jcraft</groupId> <artifactId>jsch</artifactId> <version>0.1.55</version> </dependency>
2)升級jsch解決不了,這種情況只能用低版本的生成密鑰對,再重新配置測試,需要麻煩工行對接人,你懂的。。。)
2 因爲是windows開發環境,但是密鑰對是linux系統生成的,所以無效,
解決辦法:用WinSCP或者putty把私鑰,id_rsa轉換成.ppk類型祕鑰即可(openssh轉成putty格式,用winscp打開選擇linux那個私鑰,它就提示了,或百度其他辦法),部署時還要用id_rsa,要根據環境加載不同格式密鑰
if (os.toLowerCase().startsWith("win")) { PRI_PATH = PullICBCDataImpl.class.getResource("/icbc/id_rsa.ppk").getPath(); System.out.println("=====win======os.name:" + PRI_PATH); } else if (os.toLowerCase().startsWith("linux")) { PRI_PATH = PullICBCDataImpl.class.getClassLoader().getResource("icbc/id_rsa").getPath(); System.out.println("=====linux======os.name:" + PRI_PATH); }