Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java客户端和Kerberos/SSO-Krb5LoginModule-不重新使用票证_Java_Authentication_Kerberos_Jaas_Gssapi - Fatal编程技术网

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

Java客户端和Kerberos/SSO-Krb5LoginModule-不重新使用票证,java,authentication,kerberos,jaas,gssapi,Java,Authentication,Kerberos,Jaas,Gssapi,我正在运行JMeter,它依赖于jdk1.8的Krb5LoginModule 在我看来,Krb5LoginModule无法跨多个请求维护kerberos会话。这将导致在每次请求之前进行http401和重新握手 我试图重现一个有严重间歇性性能问题的生产环境,我希望在测试中包括Kerberos/SSO身份验证,但我无法将其设置为像使用REST服务器的Windows客户端一样运行 REST服务器向数百个Excel加载项客户端提供数据,这些客户端被设置为使用Kerberos进行身份验证。在访问日志中,我

我正在运行JMeter,它依赖于jdk1.8的Krb5LoginModule

在我看来,
Krb5LoginModule
无法跨多个请求维护kerberos会话。这将导致在每次请求之前进行
http401
和重新握手

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

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

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

当我的测试运行时,我看到每个请求都被来自服务器的401拒绝,Java转到Kerberos KDC获取另一个票证,然后重新提交它。虽然这样做有效,但我的KDC服务器每秒不能处理超过两个请求并超时请求,因此我无法大幅提升负载测试

那么,为什么Krb5LoginModule不能像Excel那样保留从KDC获得的kerberos票据并预验证每个调用呢

这是我为配置所做的尝试:

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;
};
我尝试过使用键控标签和不使用键控标签,使用票证缓存和不使用键控标签。我希望我只是做错了配置,但我不知道怎么做

这就是我假设的基础:

及空气污染指数:

  • 我认为路径周围不需要引号,这个
    文件:
    位也不是必需的,比如:

    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)

    参考资料:


    Jaas不会将票据持久保存到缓存中,它只能获取已保存的票据。 更多信息请参见我的问题/答案

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


    但是,我认为Adam工作流中有一些问题,在我对GSS的理解中,对于同一会话,服务器和客户端都必须始终引用在初始化期间创建的相同的
    GSSContext
    对象

    “…向数百个Excel加载项客户端提供数据,这些客户端被设置为使用Kerberos进行身份验证…”-如果客户端关闭连接,并且在新请求中客户端不提供授权标头,则会重新开始。客户端需要缓存连接和/或保持连接打开。我有一种不好的感觉,JMeter会在每次请求后关闭连接,这是在linux上的。该注册表设置的等效配置是什么?“允许目标会话密钥”做什么?@gusto2当然,保持连接活动或关闭连接是不相关的,重要的是带有auth票证的头。Krb5LoginModule只在401之后的第一个请求中提供它,然后下次它再次忘记它。我想我可以在JMeter中使用keep alive,但这样我就不会真正复制prod环境。我们使用JMeter进行一些IAM测试,但据我所知,JMeter只是在后续请求中重新发送授权标头:(
    HKEY_LOCAL_MACHINE\System\CurrentControlSet\Control\Lsa\Kerberos\Parameters
    Value Name: allowtgtsessionkey
    Value Type: REG_DWORD
    Value: 0x01  ( default is 0 )