Java中JSch與jsch.addIdentity()完全詳細(xì)解析
前言
JSch(Java Secure Channel)是 JCraft 提供的純 Java 實(shí)現(xiàn)的 SSH2 協(xié)議庫,核心用于 Java 程序?qū)崿F(xiàn) SSH 遠(yuǎn)程登錄、遠(yuǎn)程命令執(zhí)行、SFTP 文件傳輸?shù)炔僮鳌?code>addIdentity() 是 JSch 中配置 SSH 密鑰認(rèn)證的核心方法,用于替代傳統(tǒng)的密碼登錄,提升認(rèn)證安全性,以下是詳細(xì)解析。
一、JSch 基礎(chǔ)認(rèn)知
1. 核心用途
- SSH 遠(yuǎn)程執(zhí)行命令(如 Linux 服務(wù)器操作);
- SFTP/SCP 文件上傳、下載;
- 端口轉(zhuǎn)發(fā)(SSH 隧道);
- 支持密碼認(rèn)證、公鑰 / 私鑰認(rèn)證(核心場(chǎng)景)。
2. 依賴引入(Maven/Gradle)
使用 JSch 需先引入依賴(最新穩(wěn)定版為 0.1.55):
<!-- Maven -->
<dependency>
<groupId>com.jcraft</groupId>
<artifactId>jsch</artifactId>
<version>0.1.55</version>
</dependency>
<!-- Gradle -->
implementation 'com.jcraft:jsch:0.1.55'二、jsch.addIdentity () 方法詳解
1. 核心作用
addIdentity() 用于向 JSch 實(shí)例添加SSH 私鑰,實(shí)現(xiàn)公鑰認(rèn)證(無需輸入密碼即可登錄 SSH 服務(wù)器),替代不安全的密碼認(rèn)證方式。SSH 公鑰認(rèn)證原理:本地生成公鑰 / 私鑰對(duì),公鑰上傳至服務(wù)器~/.ssh/authorized_keys,本地用私鑰簽名,服務(wù)器用公鑰驗(yàn)簽完成認(rèn)證。
2. 常用重載方法
JSch 提供多個(gè)重載的addIdentity(),覆蓋不同私鑰存儲(chǔ)形式(文件、字節(jié)數(shù)組),以下是最常用的 3 種:
| ||||||||
參數(shù)說明:
privateKeyPath:私鑰文件路徑(如/home/user/.ssh/id_rsa);passphrase:私鑰的加密密碼(若私鑰未加密,傳null);name:身份標(biāo)識(shí)(自定義,如 "ssh-key-1");privateKey/publicKey:私鑰 / 公鑰的字節(jié)數(shù)組;
3. 基礎(chǔ)使用示例(私鑰文件認(rèn)證)
場(chǎng)景 1:未加密的私鑰文件
import com.jcraft.jsch.*;
import java.util.Properties;
public class JSchDemo {
public static void main(String[] args) {
JSch jsch = new JSch();
String host = "192.168.1.100"; // 遠(yuǎn)程服務(wù)器IP
String user = "root"; // 登錄用戶名
int port = 22; // SSH端口
try {
// 1. 添加私鑰(無密碼加密)
jsch.addIdentity("/home/user/.ssh/id_rsa"); // 本地私鑰文件路徑
// 2. 創(chuàng)建SSH會(huì)話
Session session = jsch.getSession(user, host, port);
// 跳過主機(jī)密鑰驗(yàn)證(生產(chǎn)環(huán)境不建議,可配置known_hosts)
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
// 3. 連接會(huì)話(無需密碼,通過私鑰認(rèn)證)
session.connect();
System.out.println("SSH連接成功:" + session.isConnected());
// 4. 后續(xù)操作(如執(zhí)行命令、SFTP傳輸)...
// 5. 釋放資源
session.disconnect();
} catch (JSchException e) {
e.printStackTrace();
}
}
}場(chǎng)景 2:加密的私鑰文件
若私鑰生成時(shí)設(shè)置了密碼(如ssh-keygen -t rsa時(shí)輸入了 passphrase),需傳入解密密碼:
// 替換addIdentity行,傳入私鑰路徑+解密密碼
jsch.addIdentity("/home/user/.ssh/id_rsa", "my-key-pass123");4. 進(jìn)階示例(字節(jié)數(shù)組形式的私鑰)
適用于私鑰存儲(chǔ)在配置中心(如 Nacos、Apollo),以字符串 / 字節(jié)數(shù)組獲取的場(chǎng)景:
public static void connectWithKeyBytes() throws JSchException {
JSch jsch = new JSch();
String host = "192.168.1.100";
String user = "root";
// 從配置中心讀取的私鑰字符串(需去除換行/空格,或保留原始格式)
String privateKeyStr = "-----BEGIN RSA PRIVATE KEY-----\n" +
"MIIEpAIBAAKCAQEAxX...(省略私鑰內(nèi)容)...\n" +
"-----END RSA PRIVATE KEY-----";
byte[] privateKey = privateKeyStr.getBytes();
String passphrase = "my-key-pass123"; // 私鑰密碼(無則傳null)
// 添加字節(jié)數(shù)組形式的私鑰
jsch.addIdentity("ssh-key-1", privateKey, null, passphrase.getBytes());
// 創(chuàng)建會(huì)話并連接(同基礎(chǔ)示例)
Session session = jsch.getSession(user, host, 22);
Properties config = new Properties();
config.put("StrictHostKeyChecking", "no");
session.setConfig(config);
session.connect();
System.out.println("字節(jié)數(shù)組私鑰認(rèn)證成功");
session.disconnect();
}三、關(guān)鍵注意事項(xiàng)
1. 私鑰格式要求
- JSch 支持OpenSSH 格式的私鑰(如
id_rsa,PEM 格式),不支持 PKCS#8 格式(需轉(zhuǎn)換); - 轉(zhuǎn)換命令(PKCS#8→OpenSSH):
ssh-keygen -p -m PEM -f id_rsa;
2. 服務(wù)器端配置
- 公鑰需上傳至服務(wù)器
~/.ssh/authorized_keys(權(quán)限需為 600); - 服務(wù)器
sshd_config需開啟公鑰認(rèn)證:PubkeyAuthentication yes; - 服務(wù)器
~/.ssh目錄權(quán)限需為 700,否則會(huì)觸發(fā)認(rèn)證失敗。
3. 生產(chǎn)環(huán)境最佳實(shí)踐
- 禁止跳過主機(jī)密鑰驗(yàn)證(
StrictHostKeyChecking=no):需將服務(wù)器公鑰加入本地known_hosts文件; - 私鑰加密存儲(chǔ):避免明文寫在代碼中,通過配置中心 / 環(huán)境變量獲?。?/li>
- 資源釋放:Session、Channel(SFTP/Exec)使用后必須
disconnect()/disconnect(),避免資源泄漏; - 異常處理:捕獲
JSchException(如認(rèn)證失敗、連接超時(shí)、私鑰錯(cuò)誤),區(qū)分不同錯(cuò)誤碼(如AUTH_FAILED)。
4. 常見問題排查
異?,F(xiàn)象 | 原因 | 解決方案 |
|---|---|---|
Auth fail | 私鑰不匹配 / 權(quán)限錯(cuò)誤 / 服務(wù)器公鑰未配置 | 1. 核對(duì)私鑰路徑;2. 檢查服務(wù)器 authorized_keys 權(quán)限;3. 驗(yàn)證私鑰密碼 |
invalid privatekey | 私鑰格式錯(cuò)誤(如 PKCS#8) | 轉(zhuǎn)換為 OpenSSH 格式(PEM) |
Connection refused | 端口錯(cuò)誤 / SSH 服務(wù)未啟動(dòng) | 核對(duì)端口(默認(rèn) 22);檢查服務(wù)器 sshd 服務(wù)狀態(tài) |
四、擴(kuò)展場(chǎng)景:結(jié)合 SFTP 使用
添加身份認(rèn)證后,可快速實(shí)現(xiàn) SFTP 文件傳輸:
// 連接成功后,創(chuàng)建SFTP通道
ChannelSftp sftpChannel = (ChannelSftp) session.openChannel("sftp");
sftpChannel.connect();
// 上傳文件
sftpChannel.put("/本地文件路徑/test.txt", "/遠(yuǎn)程服務(wù)器路徑/test.txt");
// 下載文件
sftpChannel.get("/遠(yuǎn)程服務(wù)器路徑/test.txt", "/本地文件路徑/test.txt");
// 關(guān)閉通道
sftpChannel.disconnect();
總結(jié)
到此這篇關(guān)于Java中JSch與jsch.addIdentity()完全詳細(xì)解析的文章就介紹到這了,更多相關(guān)Java JSch與jsch.addIdentity()內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
springboot動(dòng)態(tài)加載jar包動(dòng)態(tài)配置實(shí)例詳解
這篇文章主要給大家介紹了關(guān)于springboot動(dòng)態(tài)加載jar包動(dòng)態(tài)配置的相關(guān)資料,在項(xiàng)目開發(fā)的過程中,有時(shí)候需要?jiǎng)討B(tài)靈活的加載某個(gè)jar包并執(zhí)行其里面的方法的時(shí)候,需要的朋友可以參考下2023-11-11
SpringBoot實(shí)現(xiàn)消息推送功能的示例代碼
項(xiàng)目開發(fā)中,實(shí)時(shí)消息推送已成為提升用戶體驗(yàn)的關(guān)鍵技術(shù),無論是聊天應(yīng)用、通知系統(tǒng)、實(shí)時(shí)數(shù)據(jù)展示,還是協(xié)同辦公場(chǎng)景,都需要服務(wù)器能夠主動(dòng)向客戶端推送消息,本文將詳細(xì)介紹SpringBoot實(shí)現(xiàn)消息推送功能的具體指南,需要的朋友可以參考下2025-12-12
SpringBoot項(xiàng)目啟動(dòng)失?。篈PPLICATION FAILED TO START的
文章介紹了在使用Spring Boot 4.0.0版本時(shí)遇到的Mapper文件找不到的問題,并通過將依賴版本切換到3.5.7來解決問題,此外,文章還提供了關(guān)于Spring Boot新版本使用注意事項(xiàng)的總結(jié),包括版本兼容性、配置變更、新特性、遷移建議和常見問題,需要的朋友可以參考下2025-11-11
JAVA?ServLet創(chuàng)建一個(gè)項(xiàng)目的基本步驟
Servlet是Server Applet的簡(jiǎn)稱,是運(yùn)行在服務(wù)器上的小程序,用于編寫Java的服務(wù)器端程序,它的主要作用是接收并響應(yīng)來自Web客戶端的請(qǐng)求,下面這篇文章主要給大家介紹了關(guān)于JAVA?ServLet創(chuàng)建一個(gè)項(xiàng)目的基本步驟,需要的朋友可以參考下2024-03-03
Spring?AOP通知類型與實(shí)戰(zhàn)示例講解
Spring?AOP提供了五種通知類型:@Before、@After、@AfterReturning、@AfterThrowing和@Around,每種通知類型都有其特定的使用場(chǎng)景和實(shí)現(xiàn)方式,通過合理使用這些通知類型,可以實(shí)現(xiàn)各種橫切關(guān)注點(diǎn)的模塊化和解耦,感興趣的朋友跟隨小編一起看看吧2024-11-11
Spring?Boot?使用觀察者模式實(shí)現(xiàn)實(shí)時(shí)庫存管理的步驟
在現(xiàn)代軟件開發(fā)中,實(shí)時(shí)數(shù)據(jù)處理非常關(guān)鍵,本文提供了一個(gè)使用SpringBoot和觀察者模式開發(fā)實(shí)時(shí)庫存管理系統(tǒng)的詳細(xì)教程,步驟包括創(chuàng)建項(xiàng)目、定義實(shí)體類、實(shí)現(xiàn)觀察者模式、集成Spring框架、創(chuàng)建RESTful?API端點(diǎn)和測(cè)試應(yīng)用等,這將有助于開發(fā)者構(gòu)建能夠即時(shí)響應(yīng)庫存變化的系統(tǒng)2024-09-09
springboot解決使用localhost或127.0.01模擬CORS失效
CORS允許不同源的網(wǎng)頁請(qǐng)求訪問另一個(gè)源服務(wù)器上的某些資源,本文主要介紹了springboot解決使用localhost或127.0.01模擬CORS失效,文中通過示例代碼介紹的非常詳細(xì),需要的朋友們下面隨著小編來一起學(xué)習(xí)學(xué)習(xí)吧2024-07-07

