在JBoss下,我使用spnego ( http://spnego.sourceforge.net )进行kerberos身份验证。
我需要解密kerberos票证才能访问包含PAC数据的授权数据。需要PAC数据来决定将哪些角色授予用户。
如何访问和解密kerberos票证?我在网上搜索过一些例子,但并不费力。
发布于 2011-01-08 02:26:33
这些人有一个完整的PAC解码实现:
http://jaaslounge.sourceforge.net/
您可以像这样使用令牌解析器:
HttpServletRequest request = (HttpServletRequest) req;
String header = request.getHeader("Authorization");
byte[] base64Token = header.substring(10).getBytes("UTF-8");
byte[] spnegoHeader = Base64.decode(base64Token);
SpnegoInitToken spnegoToken = new SpnegoInitToken(spnegoHeader);如果您想要解密底层的Kerberos票证,您将需要跳过一些障碍。不确定你是否需要这个。
格兰特
发布于 2012-04-10 23:22:14
我已经成功地将来自http://spnego.sourceforge.net的servlet过滤器与来自http://jaaslounge.sourceforge.net/的PAC解析器结合使用,而无需显式地使用DER/ASN.1解析器:
/**
* Retrieve LogonInfo (for example, Group SID) from the PAC Authorization Data
* from a Kerberos Ticket that was issued by Active Directory.
*/
byte[] kerberosTokenData = gssapiData;
try {
SpnegoToken token = SpnegoToken.parse(gssapiData);
kerberosTokenData = token.getMechanismToken();
} catch (DecodingException dex) {
// Chromium bug: sends a Kerberos response instead of an spnego response
// with a Kerberos mechanism
} catch (Exception ex) {
log.error("", ex);
}
try {
Object[] keyObjs = IteratorUtils.toArray(loginContext.getSubject()
.getPrivateCredentials(KerberosKey.class).iterator());
KerberosKey[] keys = new KerberosKey[keyObjs.length];
System.arraycopy(keyObjs, 0, keys, 0, keyObjs.length);
KerberosToken token = new KerberosToken(kerberosTokenData, keys);
log.info("Authorizations: ");
for (KerberosAuthData authData : token.getTicket().getEncData()
.getUserAuthorizations()) {
if (authData instanceof KerberosPacAuthData) {
PacSid[] groupSIDs = ((KerberosPacAuthData) authData)
.getPac().getLogonInfo().getGroupSids();
log.info("GroupSids: " + Arrays.toString(groupSIDs));
response.getWriter().println("Found group SIDs: " +
Arrays.toString(groupSIDs));
} else {
log.info("AuthData without PAC: " + authData.toString());
}
}
} catch (Exception ex) {
log.error("", ex);
} 我还编写了一个新的HttpFilter (从spnego.sf.net派生而来):spnego-pac,它通过getUserPrincipal()公开LogonInfo。
可以在这里找到完整演示上述代码的示例项目:
https://github.com/EleotleCram/jetty-spnego-demo
spnego-pac筛选器(在上面的示例中使用)可以在以下位置找到:
https://github.com/EleotleCram/spnego.sf.net-fork
希望这对任何人都有帮助。
__
马塞尔
发布于 2011-01-18 06:40:25
如果您像这样从spnegoToken获取机制令牌:
byte[] mechanismToken = spnegoToken.getMechanismToken(); 机制令牌通常是KerberosApRequest。有一个接受KerberosApRequest参数的KerberosToken构造函数。只需传入mechanismToken字节数组和密钥即可解密内容。
https://stackoverflow.com/questions/4508555
复制相似问题