Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/391.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/typo3/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何将id_rsa.pub文件与JSch一起使用_Java_Ssh_Sftp_Jsch_Private Key - Fatal编程技术网

Java 如何将id_rsa.pub文件与JSch一起使用

Java 如何将id_rsa.pub文件与JSch一起使用,java,ssh,sftp,jsch,private-key,Java,Ssh,Sftp,Jsch,Private Key,使用JSch()连接远程SFTP服务器时遇到问题。除了id\u rsa.pub文件和主机名以及主机ip地址之外,我没有任何要连接的远程服务器的访问权限或信息。并且该文件中的密钥在远程服务器中注册为授权密钥。因为我能够从shell登录到远程服务器 sftp -o BindAddress=SOME_IP_ADDRRESS myUserName@HOST_IP_ADDR 工作正常。但是当我用JSch做同样的尝试时,它不起作用。我所做的是: 我已经使用ssh-keygen从id_rsa.pub文件中可

使用JSch()连接远程SFTP服务器时遇到问题。除了id\u rsa.pub文件和主机名以及主机ip地址之外,我没有任何要连接的远程服务器的访问权限或信息。并且该文件中的密钥在远程服务器中注册为授权密钥。因为我能够从shell登录到远程服务器

sftp -o BindAddress=SOME_IP_ADDRRESS myUserName@HOST_IP_ADDR
工作正常。但是当我用JSch做同样的尝试时,它不起作用。我所做的是:

  • 我已经使用ssh-keygen从id_rsa.pub文件中可用的公钥创建了一个私钥

  • 公钥格式为

    ssh rsa AA..=someuser@something.com

  • 我从keygen生成的私钥如下

  • -----开始RSA私钥-----

    -----结束RSA私钥-----

    我正在将此私钥文件与我的
    session.addIdentity(私钥文件路径)一起使用

    但它给了auth_失败一个例外,我做错什么了吗

    代码是:

    /* KEY_FILE_NAME = is a file with rsa public key */
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource(KEY_FILE_NAME).getFile());
    JSch jsch = new JSch();
    jsch.addIdentity(file.getAbsolutePath());
    Properties hash = new Properties();
    hash.put("StrictHostKeyChecking", "no");
    logger.debug("SSh Server Host name >>" + SSH_SERVER_HOST_NAME + " || User Name >>" +  SSH_SERVER_USER_NAME);
    
    session = jsch.getSession(SSH_SERVER_USER_NAME, SSH_SERVER_HOST_NAME);
    UserInfo ui = new MyUserInfo();
    session.setUserInfo(ui);
    session.setConfig(hash);
    session.setPort(22);
    session.setTimeout(45000);
    session.setSocketFactory(new SocketFactory() 
    {
        InputStream in = null;
        OutputStream out = null;
    
        public InputStream getInputStream(Socket socket) throws IOException 
        {
            if (in == null)
                in = socket.getInputStream();
            return in;
        }
    
        public OutputStream getOutputStream(Socket socket) throws IOException 
        {
            if (out == null)
                out = socket.getOutputStream();
            return out;
        }
    
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException 
        {
           // The IP Addresses are changed ....
           // using the original IP in my code
            byte[] remoteIpAddr = new byte[] { (byte) 11,(byte) 11, 11, 11 }; 
            byte[] localIpAddr = new byte[] { 55, 55, 55, 55 };
    
            InetAddress remoteIp = InetAddress.getByAddress(remoteIpAddr);
            InetAddress localIp = InetAddress.getByAddress(localIpAddr);
    
            logger.debug("remoteIp >>" + remoteIp.toString());
            logger.debug("localIp >>" + localIp.toString());
            Socket socket = new Socket(remoteIp, 22, localIp, 0);
            logger.debug("socket created >> " + socket.toString());
            return socket;
        }
    });
    session.connect();
    

    请帮助,我做错了什么…

    如何在命令行
    ssh
    中使用密钥?您是如何“从公钥创建私钥”的?马丁:非常感谢你的帮助,现在我的代码运行得很好。。我犯的错误是使用了错误的私钥文件。前面的代码工作正常。只需更改密钥内容并将私钥文件名从id_rsa.pub更改为id_rsa.OK,然后请删除此问题。@arpanda您是从公钥创建私钥的吗?怎么会?应该是相反的。
    /* KEY_FILE_NAME = is a file with rsa public key */
    ClassLoader classLoader = getClass().getClassLoader();
    File file = new File(classLoader.getResource(KEY_FILE_NAME).getFile());
    JSch jsch = new JSch();
    jsch.addIdentity(file.getAbsolutePath());
    Properties hash = new Properties();
    hash.put("StrictHostKeyChecking", "no");
    logger.debug("SSh Server Host name >>" + SSH_SERVER_HOST_NAME + " || User Name >>" +  SSH_SERVER_USER_NAME);
    
    session = jsch.getSession(SSH_SERVER_USER_NAME, SSH_SERVER_HOST_NAME);
    UserInfo ui = new MyUserInfo();
    session.setUserInfo(ui);
    session.setConfig(hash);
    session.setPort(22);
    session.setTimeout(45000);
    session.setSocketFactory(new SocketFactory() 
    {
        InputStream in = null;
        OutputStream out = null;
    
        public InputStream getInputStream(Socket socket) throws IOException 
        {
            if (in == null)
                in = socket.getInputStream();
            return in;
        }
    
        public OutputStream getOutputStream(Socket socket) throws IOException 
        {
            if (out == null)
                out = socket.getOutputStream();
            return out;
        }
    
        public Socket createSocket(String host, int port) throws IOException, UnknownHostException 
        {
           // The IP Addresses are changed ....
           // using the original IP in my code
            byte[] remoteIpAddr = new byte[] { (byte) 11,(byte) 11, 11, 11 }; 
            byte[] localIpAddr = new byte[] { 55, 55, 55, 55 };
    
            InetAddress remoteIp = InetAddress.getByAddress(remoteIpAddr);
            InetAddress localIp = InetAddress.getByAddress(localIpAddr);
    
            logger.debug("remoteIp >>" + remoteIp.toString());
            logger.debug("localIp >>" + localIp.toString());
            Socket socket = new Socket(remoteIp, 22, localIp, 0);
            logger.debug("socket created >> " + socket.toString());
            return socket;
        }
    });
    session.connect();