JSch打开SSH隧道时出现无效的私钥错误。

3

使用 JSch,我调用 addIdentity() 添加私钥,然后使用 getSession() 打开 SSH 隧道。

当在我的 Windows 本地运行此代码时,隧道打开正常。

但是,在我们的 CI 上使用相同的私钥运行相同的代码时,会出现以下错误:

2016-12-07 01:01:32 ERROR SSHConnector:25 - invalid privatekey: [B@4bb4de6a
com.jcraft.jsch.JSchException: invalid privatekey: [B@4bb4de6a
    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:408)
    at com.jcraft.jsch.JSch.addIdentity(JSch.java:389)

私钥看起来像这样:
PuTTY-User-Key-File-2: ssh-rsa
Encryption: none
Comment: imported-openssh-key
Public-Lines: 6
XXXXXXXXXXXXXXXXXXX
Private-Lines: 14
XXXXXXXXXXXXXXXXXX
Private-MAC: XXXXXXXXXXXXXXXX

这里可能出现什么错误?

已经过去两年了。问题:您能否“接受”其中一个回复?请随意编辑回复或添加自己的回复。 - paulsm4
@paulsm4 老实说,我不记得正确答案是什么了——如果有的话。 - Harold L. Brown
这是由于密钥文件格式引起的。请参考此答案:https://dev59.com/mlQJ5IYBdhLWcg3wx40V - Dimitar II
2个回答

3

通过使用 pem 文件来解决了我的问题,而不是使用 ppk 文件。

pem 文件是OpenSSH格式的,这是 com.jcraft.jsch.JSch jar所需的格式。


2

我猜测 jSCh 不支持 PuTTY 密钥格式,而是标准的 PEM 或 OpenSSH 格式。您可以在 PuTTYgen 中将 PPK 转换为 PEM,这应该可以解决您的问题。


3
至少在版本0.1.53中(我怀疑这将不会被删除),它确实读取PPK格式的文件(除了OpenSSL PEM格式,还包括非新格式的OpenSSH和其他几种格式),但是只能使用Windows类型的EOL换行符(CR LF)。Harold:您将PPK文件复制到受影响的系统上时是否使用了可能更改换行符的方法,例如粘贴到编辑器或FTP TYPE A? - dave_thompson_085
2
jsch确实支持PPK文件,但正如@dave_thompson_085指出的那样,它们必须标记有CRLF行结束符。 Dave,请将您的评论转换为答案,以便我可以将其选为正确答案。 - Harold L. Brown

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接