com.jcraft.jsch.JSchException: invalid privatekey: [B@7b98f307

找了很久其他博客無法解決的,請認真讀這篇

前提:做結算對賬項目,需要用密鑰登錄工行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);
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章