首页 文章

Java客户端和Kerberos / SSO - Krb5LoginModule - 不重用票证

提问于
浏览
0

我正在运行JMeter,这取决于 JDK 1.8Krb5LoginModule .

在我看来, Krb5LoginModule 无法跨多个请求维护kerberos会话 . 这会导致 HTTP 401 并在每次请求之前重新进行握手 .

我正在尝试重现具有严重间歇性性能问题的 生产环境 环境,我想在我的测试中包含Kerberos / SSO身份验证,但我无法将其设置为像使用我的REST服务器的Windows客户端一样运行 .

REST服务器向数百个Excel加载项客户端提供数据,这些客户端设置为使用Kerberos进行身份验证 . 在访问日志中,我看到每个客户端最初触发HTTP状态401响应,然后是200,并且在客户端活动期间再触发200秒 .

为了避免混淆,服务器正在处理Kerberos握手并且不使用servlet容器会话 .

当我的测试运行时,我看到服务器上的401拒绝了每个请求,Java转到Kerberos KDC获取另一个票证,然后重新提交 . 虽然这很有效,但我的KDC服务器每秒都不能处理多个请求并超出请求次数,所以我无法提升负载测试 .

那么为什么Krb5LoginModule不保留从KDC获得的kerberos票并预先验证每次调用,就像Excel一样?

这是我为配置尝试过的:

JMeter {
    com.sun.security.auth.module.Krb5LoginModule required
        useTicketCache=true
        ticketCache="FILE:krb.cache"
        useKeyTab=true
        keyTab="FILE:krb.keytab"
        storeKey=true
        principal="-tsk-thing-ldap-dev@DO.AD.DUM.COM"
        debug=true;
};

我已经尝试过使用keytabs而没有使用票证缓存而没有 . 我希望我只是错误地配置,但我看不出如何 .

这就是我所依据的假设:Oracle: Single sign-on using Kerberos

和API:Krb5LoginModule - Oracle JDK 1.8 API docs

2 回答

  • 0
    • 我认为你不需要路径周围的引号,这也不需要 FILE: 位,例如:
    ticketCache=/path/to/your/krb.cache
    
    • 为什么你同时使用票证缓存和键盘,一个就足够了(除非你需要测试后备场景)

    • 您使用的是哪种操作系统?

    我记得用以下方法解决问题:

    com.sun.security.jgss.krb5.initiate {
        com.sun.security.auth.module.Krb5LoginModule required
        debug=true
        doNotPrompt=true
        useTicketCache=true        
    };
    

    并设置以下注册表项(Windows 7)

    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
    Value Name: allowtgtsessionkey
    Value Type: REG_DWORD
    Value: 0x01  ( default is 0 )
    

    参考文献:

  • 0

    Jaas不会将票证持久存储到缓存中,它只能获取已保存的票证 . 更多信息在我的问题/答案here

    您需要使用 kinit 工具(与Java发行版或Linux工具捆绑在一起)才能将票证持久保存到缓存文件中,您也可以重写自己的 Krb5LoginManger 以执行此操作(艰难的方式) .

    但是我想在亚当工作流程中存在一些问题,在我对GSS的不足之处,因为同一个会话,服务器和客户端,必须始终引用它们在初始化期间创建的相同的 GSSContext 对象 .

相关问题