首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> Java 程式設計 >> Java 相關知識

GT4 開發實戰:從零建構 GSI 相互驗證客戶端-伺服器應用

     編輯:Java 相關知識

背景知識:GSI 與代理憑證

Grid Security Infrastructure (GSI) 是 Java GSS-API 的實作,提供安全訊息交換機制。核心概念包括:

  • 相互驗證:雙方持有數位憑證並信任同一 CA,透過憑證交換與隨機挑戰驗證身分。
  • 代理憑證:模仿原始憑證,擁有獨立金鑰對、有限生命週期、未加密私鑰,支援單點登入與委派。

應用程式架構

建立 Client 與 Server 兩個 Java 程式,使用 CoG (Commodity Grid) Kit 提供的 GSI 實作。核心流程:

  1. 解析命令列參數
  2. 建立 Socket 連線
  3. 載入代理憑證並轉為 GSSCredential
  4. 建立安全上下文 (GSSContext)
  5. 安全交換訊息 (wrap/getMIC)
  6. 清理資源

關鍵代碼片段

1. 載入代理憑證

CoGProperties cog = CoGProperties.getDefault();
byte[] proxyBytes = readBinFile(cog.getProxyFile());
ExtendedGSSManager manager = (ExtendedGSSManager) ExtendedGSSManager.getInstance();
GSSCredential credential = manager.createCredential(
    proxyBytes, ExtendedGSSCredential.IMPEXP_OPAQUE,
    GSSCredential.DEFAULT_LIFETIME, null,
    GSSCredential.INITIATE_AND_ACCEPT);

2. Client 端建立安全上下文

GSSContext context = manager.createContext(null, null, credential, GSSContext.DEFAULT_LIFETIME);
context.requestMutualAuth(true); // 要求相互驗證
context.requestConf(true);       // 要求機密性

GSIGssOutputStream gssOut = new GSIGssOutputStream(outStream, context);
GSIGssInputStream gssIn = new GSIGssInputStream(inStream, context);

byte[] inToken = new byte[0];
while (!context.isEstablished()) {
    byte[] outToken = context.initSecContext(inToken, 0, inToken.length);
    if (outToken != null) gssOut.writeToken(outToken);
    if (!context.isEstablished()) inToken = gssIn.readHandshakeToken();
}

3. Server 端接受上下文

GSSContext context = manager.createContext(credential);
GSIGssOutputStream gssOut = new GSIGssOutputStream(outStream, context);
GSIGssInputStream gssIn = new GSIGssInputStream(inStream, context);

byte[] token;
while (!context.isEstablished()) {
    token = gssIn.readHandshakeToken();
    token = context.acceptSecContext(token, 0, token.length);
    if (token != null) gssOut.writeToken(token);
}

4. 安全訊息交換與清理


// 發送加密訊息
MessageProp msgProp = new MessageProp(0, true); // QOP=0, 加密
byte[] wrapped = context.wrap(messageBytes, 0, messageBytes.length, msgProp);
gssOut.writeToken(wrapped);

// 清理
if (context.getMutualAuthState()) System.out.println("相互驗證成功!");
context.dispose();
socket.close();

測試與除錯

  • 先執行 grid-proxy-init 產生代理憑證
  • 啟動 Server,再啟動 Client
  • 觀察雙向主控台輸出確認 Mutual authentication took place!
  • 常見錯誤:憑證過期 (Expired credentials)、GSI/GSS API 混用導致上下文無效

總結

GSI 透過代理憑證與自適應垃圾收集機制(停止-複製/標記-清除),在分散式網格環境中實現高效、安全的相互驗證與委派。本文提供的完整骨架代碼可作為 Grid 應用開發的起點。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved