首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >使用Spnego解密kerberos票证

使用Spnego解密kerberos票证
EN

Stack Overflow用户
提问于 2010-12-22 19:11:47
回答 5查看 18.1K关注 0票数 14

在JBoss下,我使用spnego ( http://spnego.sourceforge.net )进行kerberos身份验证。

我需要解密kerberos票证才能访问包含PAC数据的授权数据。需要PAC数据来决定将哪些角色授予用户。

如何访问和解密kerberos票证?我在网上搜索过一些例子,但并不费力。

EN

回答 5

Stack Overflow用户

回答已采纳

发布于 2011-01-08 02:26:33

这些人有一个完整的PAC解码实现:

http://jaaslounge.sourceforge.net/

您可以像这样使用令牌解析器:

代码语言:javascript
复制
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票证,您将需要跳过一些障碍。不确定你是否需要这个。

格兰特

票数 8
EN

Stack Overflow用户

发布于 2012-04-10 23:22:14

我已经成功地将来自http://spnego.sourceforge.net的servlet过滤器与来自http://jaaslounge.sourceforge.net/的PAC解析器结合使用,而无需显式地使用DER/ASN.1解析器:

代码语言:javascript
复制
/** 
 * 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

希望这对任何人都有帮助。

__

马塞尔

票数 8
EN

Stack Overflow用户

发布于 2011-01-18 06:40:25

如果您像这样从spnegoToken获取机制令牌:

代码语言:javascript
复制
byte[] mechanismToken = spnegoToken.getMechanismToken(); 

机制令牌通常是KerberosApRequest。有一个接受KerberosApRequest参数的KerberosToken构造函数。只需传入mechanismToken字节数组和密钥即可解密内容。

票数 5
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/4508555

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档