Grid Security Infrastructure (GSI) 是 Java GSS-API 的實作,提供安全訊息交換機制。核心概念包括:
建立 Client 與 Server 兩個 Java 程式,使用 CoG (Commodity Grid) Kit 提供的 GSI 實作。核心流程:
GSSCredentialGSSContext)wrap/getMIC)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);
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();
}
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);
}
// 發送加密訊息
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 產生代理憑證Mutual authentication took place!Expired credentials)、GSI/GSS API 混用導致上下文無效GSI 透過代理憑證與自適應垃圾收集機制(停止-複製/標記-清除),在分散式網格環境中實現高效、安全的相互驗證與委派。本文提供的完整骨架代碼可作為 Grid 應用開發的起點。