Java实现SSH免密登录

1. 流程概述

在介绍具体步骤之前,我们先来了解一下整个流程。实现Java SSH免密登录的基本思路是通过Java程序生成公钥和私钥,将公钥添加到目标主机上的authorized_keys文件中,然后使用私钥进行登录。下面是整个流程的步骤概述:

步骤 描述
1 生成公钥和私钥
2 将公钥添加到目标主机上
3 使用私钥进行登录

2. 具体步骤及代码实现

步骤1:生成公钥和私钥

首先,我们需要使用Java程序生成公钥和私钥。以下是生成密钥对的代码:

import java.io.FileOutputStream;
import java.security.KeyPair;
import java.security.KeyPairGenerator;
import java.security.NoSuchAlgorithmException;

public class KeyGenerator {
    public static void main(String[] args) {
        KeyPairGenerator keyPairGenerator;
        try {
            // 创建KeyPairGenerator对象,指定密钥算法为RSA
            keyPairGenerator = KeyPairGenerator.getInstance("RSA");
            
            // 初始化KeyPairGenerator,指定密钥长度为2048位
            keyPairGenerator.initialize(2048);
            
            // 生成密钥对
            KeyPair keyPair = keyPairGenerator.generateKeyPair();
            
            // 将公钥和私钥分别保存到文件中
            FileOutputStream publicKeyOut = new FileOutputStream("public.key");
            publicKeyOut.write(keyPair.getPublic().getEncoded());
            publicKeyOut.close();
            
            FileOutputStream privateKeyOut = new FileOutputStream("private.key");
            privateKeyOut.write(keyPair.getPrivate().getEncoded());
            privateKeyOut.close();
            
            System.out.println("密钥对生成成功!");
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
}

步骤2:将公钥添加到目标主机上

接下来,我们需要将生成的公钥添加到目标主机上的authorized_keys文件中。以下是将公钥添加到目标主机的代码:

import com.jcraft.jsch.*;

public class PublicKeyUploader {
    public static void main(String[] args) {
        String user = "username"; // 目标主机的用户名
        String host = "hostname"; // 目标主机的IP地址或域名
        String password = "password"; // 目标主机的登录密码
        
        try {
            JSch jsch = new JSch();
            
            // 创建session连接
            Session session = jsch.getSession(user, host, 22);
            
            // 设置密码
            session.setPassword(password);
            
            // 开启StrictHostKeyChecking选项
            session.setConfig("StrictHostKeyChecking", "no");
            
            // 连接目标主机
            session.connect();
            
            // 打开sftp通道
            ChannelSftp channelSftp = (ChannelSftp) session.openChannel("sftp");
            
            // 进入.ssh目录
            channelSftp.cd(".ssh");
            
            // 上传公钥文件
            channelSftp.put("public.key", "authorized_keys");
            
            // 关闭sftp通道和session连接
            channelSftp.quit();
            session.disconnect();
            
            System.out.println("公钥上传成功!");
        } catch (JSchException | SftpException e) {
            e.printStackTrace();
        }
    }
}

步骤3:使用私钥进行登录

最后,我们可以使用生成的私钥进行SSH免密登录。以下是使用私钥登录的代码:

import com.jcraft.jsch.*;

public class SSHLogin {
    public static void main(String[] args) {
        String user = "username"; // 目标主机的用户名
        String host = "hostname"; // 目标主机的IP地址或域名
        String privateKey = "private.key"; // 私钥文件路径
        
        try {
            JSch jsch = new JSch();
            
            // 添加私钥
            jsch.addIdentity(privateKey);
            
            // 创建session连接
            Session session = jsch.getSession(user, host, 22);
            
            // 开启StrictHostKeyChecking选项
            session.setConfig("StrictHostKeyChecking", "no");
            
            // 连接目标主机
            session.connect();
            
            System.out.println("登录成功!");
            
            // TODO: 执行其他操作
            
            // 关闭session连接
            session.disconnect();
        } catch (JSchException e) {
            e.printStackTrace();
        }