[JAVA] com.jcraft.jsch.JSchException: invalid privatekey

อันนี้จดไว้ก่อนเป็นเคสแปลกที่เจอช่วยน้องในทีมลองในบ้านตัว Spring Boot App + SFTP ผ่าน แต่พอไปที่ Site ลูกค้าพังซะงั้น ทีมที่เป็น Deploy แจ้ง Error มาเต็มๆ ตามนี้ครับ

Caused by: com.jcraft.jsch.JSchException: invalid privatekey: [xxxx@95adcf19b425
   at com.jcraft.jsch.KeyPair.load(KeyPair.java:747)
   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.camel.component.file.remote.SftpOperations.createSession(SftpOperations.java:184)
   at org.apache.camel.component.file.remote.SftpOperations.connect(SftpOperations.java:113 ...

ที่นี้ก็งงสิครับว่าเปิดอะไรขึ้น แต่หลังจากไปค้นข้อมูลมา อ่อ เป็นเรื่องของ Version OpenSSH ที่ใช้ Generate Public Private Key ครับ

  • ก่อน OpenSSH (7.8)
-----BEGIN RSA PRIVATE KEY-----
your-data
-----END RSA PRIVATE KEY-----
  • key มาถูกสร้างโดย OpenSSH (7.8) ขึ้นไป  
-----BEGIN OPENSSH PRIVATE KEY-----
your-data
-----END OPENSSH PRIVATE KEY-----

ที่นี้กลับมาที่ Code บ้าง ตัว lib spring ใช้ lib jsch ซึ่งตอนนี้ปี 2025 code ทีแก้ล่าสุด 8-9 ปีเลย น่าจะราวๆ 2016-2017 ในขณะที่ OpenSSH (7.8) มีการเปลี่ยนแปลงเรื่องเยอะ โดยส่วนนึงเรื่อง Format PRIVATE KEY ลองถาม Google มัน

ถ้าตรวจเทียบ openssh-release-7.8 กับ What's new in OpenSSH 7.8(Packt) ก็ตรงนะ

ใช้แล้วครับ ตัว Code jsch มันไม่ขยับตามครับ จบเลย

ทางแก้

📌 ใช้ OpenSSH < 7.8 Generate Key มาให้ก่อน
📌 หรือ แก้ Code ขยับ Lib ไปใช้ตัวอื่น ที่ผมดูๆมามีของ

ส่วน dotnet ผมใช้ตัว https://github.com/sshnet/SSH.NET รอดครับ ไม่เกิดปัญหา

Reference


Discover more from naiwaen@DebuggingSoft

Subscribe to get the latest posts sent to your email.