使用公钥的sftp不起作用

时间:2017-03-14 14:19:50

标签: java sftp jsch public-key

使用ssh-keygen生成RSA公钥。

尝试通过sftp:

连接远程服务器
 JSch jsch = new JSch();
        try {

            String publicKey = "/home/testuser/.ssh/id_rsa.pub";
            jsch.addIdentity(publicKey);
            session = jsch.getSession(sftpUsername, sftpHostname, sftpPort);
            session.setConfig("PreferredAuthentications", "publickey,keyboard-interactive,password");
        } catch (JSchException e) {
            logger.error("Unable to obtain session", e);
        }

低于错误:

com.jcraft.jsch.JSchException: invalid privatekey: /home/testuser/.ssh/id_rsa.pub
        at com.jcraft.jsch.IdentityFile.<init>(IdentityFile.java:261)
        at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:135)
        at com.jcraft.jsch.IdentityFile.newInstance(IdentityFile.java:130)
        at com.jcraft.jsch.JSch.addIdentity(JSch.java:206)
        at com.jcraft.jsch.JSch.addIdentity(JSch.java:192)

有什么建议吗?

1 个答案:

答案 0 :(得分:2)

你有:

jsch.addIdentity(publicKey);

JSch javadoc说:

  

public void addIdentity(String prvkey) throws JSchException;

     

添加用于公钥验证的标识。在将其注册到identityRepository之前,它将使用密码短语进行解密。

     

参数:

     
      
  • prvkey - 私钥文件的文件名。这也用作密钥的标识名称。假定相应的公钥位于具有后缀.pub。
  • 的同名文件中   

当JSch需要私钥时,您已提供公钥。

如果你考虑一下,这是有道理的。关于公钥,没有任何秘密。 JSch想要一个秘密,所以它可以证明你是谁。

您的私钥可能在~/.ssh/id_rsa(没有.pub扩展名)。

您可能需要使用addIdentity的双参数版本,以便提供密码来解密私钥。