最新国产好看的视频,伊人天堂AV在线,国产Aaaaaa视频,蜜臀视频在线观看一区,人妻av色图,密臀久久久精品影片,青青视频免费观看毛片,久草在线观看视,国产三级精品色情在线

Java中JSch與jsch.addIdentity()完全詳細(xì)解析

 更新時(shí)間:2026年01月22日 09:54:18   作者:qq_39927227  
JSch是SSH2的一個(gè)純Java實(shí)現(xiàn),它允許你連接到一個(gè)sshd服務(wù)器,使用端口轉(zhuǎn)發(fā),X11轉(zhuǎn)發(fā),文件傳輸?shù)鹊?這篇文章主要介紹了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 種:

方法簽名適用場(chǎng)景
addIdentity(String privateKeyPath)私鑰以文件形式存儲(chǔ)(無密碼加密)
addIdentity(String privateKeyPath, String passphrase)私鑰文件被密碼加密(需傳入解密密碼)
addIdentity(String name, byte[] privateKey, byte[] publicKey, byte[] passphrase)私鑰以字節(jié)數(shù)組存儲(chǔ)(如配置中心讀取)

參數(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í)例詳解

    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)消息推送功能的示例代碼

    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整合Mail發(fā)送郵件功能

    SpringBoot整合Mail發(fā)送郵件功能

    我們?cè)诰W(wǎng)站上注冊(cè)賬號(hào)的時(shí)候一般需要獲取驗(yàn)證碼,而這個(gè)驗(yàn)證碼一般發(fā)送在你的手機(jī)號(hào)上還有的是發(fā)送在你的郵箱中,注冊(cè),賬號(hào)密碼…都需要用到驗(yàn)證,今天就演示一下如何用SpringBoot整合Mail發(fā)送郵箱
    2021-11-11
  • SpringBoot項(xiàng)目啟動(dòng)失敗:APPLICATION FAILED TO START的解決方法

    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)目的基本步驟

    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通知類型與實(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í)庫存管理的步驟

    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失效

    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
  • Maven?Repository?使用方法

    Maven?Repository?使用方法

    對(duì)于Java開發(fā)者來說,Maven?Repository是個(gè)必須掌握的網(wǎng)站,它可以讓開發(fā)者更加方便地管理和維護(hù)?Java?項(xiàng)目的依賴項(xiàng),同時(shí)簡(jiǎn)化了項(xiàng)目開發(fā)的過程,這篇文章主要介紹了Maven?Repository?使用方法,需要的朋友可以參考下
    2024-02-02
  • java迷宮算法的理解(遞歸分割,遞歸回溯,深搜,廣搜)

    java迷宮算法的理解(遞歸分割,遞歸回溯,深搜,廣搜)

    本文主要使用的算法(自動(dòng)生成地圖:遞歸分割法、遞歸回溯法;尋找路徑:深度優(yōu)先、廣度優(yōu)先算法),非常具有實(shí)用價(jià)值,需要的朋友可以參考下
    2021-06-06

最新評(píng)論

三河市| 平武县| 大新县| 苗栗县| 南郑县| SHOW| 长武县| 当阳市| 泰州市| 通渭县| 潮安县| 广宗县| 团风县| 喀喇沁旗| 寿阳县| 九龙城区| 涪陵区| 左贡县| 苏尼特右旗| 石林| 鸡西市| 凌云县| 得荣县| 罗山县| 罗江县| 莫力| 宜兰市| 溧阳市| 南安市| 聂荣县| 海口市| 东平县| 仪征市| 尚义县| 横山县| 遵义县| 桐柏县| 抚顺市| 米脂县| 徐州市| 惠东县|