【发布时间】:2020-05-01 22:41:49
【问题描述】:
我想使用 kerberos 身份验证来保护 gemfire(v9.9) 集群。
我相信我必须这样做,
- 使用 JAAS 和 keytab 将客户端和 gemfire 服务器验证到 KDC(在我的例子中是活动目录)
- 在客户端使用
Subject.doAs从Subject获取会话票证(byte []) - 将此字节[] 传递给 gemfire 服务器
- 在 gemfire 服务器上检查收到的票是否正确
我能够成功地执行 LoginContect.login() 并在客户端和 gemfire 服务器上获得 Subject
我的代码:
LoginContext loginCtx = new LoginContext("Client", new TextCallbackHandler());
loginCtx.login();
Subject subject = loginCtx.getSubject();
GSSManager manager = GSSManager.getInstance();
GSSName serverName = manager.createName( servicePrincipalName, GSSName.NT_HOSTBASED_SERVICE);
final GSSContext context = manager.createContext( serverName, new Oid( "1.2.840.113554.1.2.2"), null, GSSContext.DEFAULT_LIFETIME);
byte[] serviceTicket =
Subject.doAs(subject, new PrivilegedExceptionAction<byte[]>() {
@Override
public byte[] run() throws Exception {
byte[] serviceTicket = null;
byte[] token = new byte[0];
// This is a one pass context initialisation.
context.requestMutualAuth(false);
context.requestCredDeleg(false);
serviceTicket = context.initSecContext(token, 0, token.length); //code fails here
/*java.security.PrivilegedActionException:
GSSException: No valid credentials provided
(Mechanism level: Server not found in Kerberos database (7) - UNKNOWN_SERVER)
Caused by: KrbException: Identifier doesn't match expected value (906)
*/
return serviceTicket;
}
});
//send this serviceTicket to gemfire server and then do
//--------------------at the gemfire server level-------------------
String clientContext =
Subject.doAs( serverSubject, new PrivilegedAction<String>() {
public String run() {
try {
String clientName = null;
// Identify the server that communications are being made to.
GSSManager manager = GSSManager.getInstance();
GSSContext context = manager.createContext((GSSCredential) null);
context.acceptSecContext(serviceTicket, 0, serviceTicket.length);
clientName = context.getSrcName().toString();
return clientName;
}
catch ( Exception e) {
e.printStackTrace();
return null;
}
}
}
);
我曾经到达这里的链接
https://github.com/ekoontz/jaas_and_kerberos https://cwiki.apache.org/confluence/display/GEODE/Geode+Security+Framework
我的问题:
- 我的方法正确吗?
- 如何获得 byte[] 会话票
- 在 gemfire 服务器级别验证票证是否正确
【问题讨论】:
标签: java kerberos gemfire java-security geode