我正在运行JMeter,它依赖于JDK 1.8的Krb5LoginMoules。
在我看来,Krb5LoginMoules
不能跨多个请求维护kerberos会话。这将导致HTTP 401和每次请求前重新握手。
我正试图重现一个有严重间歇性性能问题的生产环境,我希望在测试中包括Kerberos/SSO身份验证,但我无法将其设置为像使用REST服务器的Windows客户端那样运行。
REST服务器向数百个Excel加载项客户端提供数据,这些客户端被设置为使用Kerberos进行身份验证。在访问日志中,我看到每个客户机最初都会触发HTTP status 401响应,然后是200,在客户机活动的持续时间内再触发200。
为了避免混淆,服务器正在处理Kerberos握手,并且没有使用servlet容器会话。
当我的测试运行时,我看到每个请求都被服务器的401拒绝,Java去KerberosKDC获取另一个票证,然后重新提交。在这种情况下,我的KDC服务器每秒钟不能处理超过几个请求,并且会超时,所以我不能很好地提高我的负载测试。
那么,为什么Krb5LoginMoules不保留它从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;
};
我试过键盘和没有键盘,票缓存和没有。我希望我只是配置错了,但我看不出是怎么回事。
这就是我的假设基础:Oracle:使用Kerberos的单点登录
以及API:Krb5LoginModule-Oracle JDK 1.8 API文档
你必须把你的问题分成两部分。
>
无限TGT。如果使用本机jaas,则此模块忽略Linux或Windows gss库,并尝试使用jaas.conf.For KDC中定义的keytab重新启动,这意味着DDoS。如果您在用户和目标服务之间使用像网关这样的应用程序,那么您的服务将成为中间发起者,它需要为TGS重新发起自己的TGT。它可以通过添加useTicketCache来解决jaas.conf.但是它不能解决TGS DDoS-
无限TGS。Oracle为自己的生态系统编写了本机库,他们对您的优化不感兴趣。如果你想要每天一张票,请向甲骨文支付开发独家图书馆的费用。然而,有一种经典的lifehack可以像Oracle doc网站上那样破坏Oracle的天气。它被称为外部MIT/MS Kerberos gss库上的本机JGSS。
只需在java命令后添加2-D参数或使用java_OPTS即可
https://docs.oracle.com/en/java/javase/15/security/jaas-authentication.html#GUID-EF86E769-AFAF-4341-B9B0-4E122A0BFCEC
Jaas不会将票据持久保存到缓存中,它只能获取已经保存的票据。更多信息请参见我的问题/答案
您需要使用kinit
工具(与Java发行版或Linux工具捆绑在一起)才能将票证保存到缓存文件中,您也可以重写自己的Krb5LoginManger
以执行这(艰难的方式)。
但是我想在Adam的工作流程中,在我对GSS的低估中,对于同一个会话,服务器和客户端,必须始终引用他们在初始化期间创建的相同的GSSContext对象。
>
我认为路径周围不需要引号,这个文件:
位也不是必需的,比如:
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 )
参考资料:
我们已经实现了Kerberos java客户端,它运行良好。然而,当kerberos票证过期时,Java客户端应用程序会在控制台中请求用户名,这反过来会使应用程序挂起。在SoapUI等工具中,我们观察到当Kerberos票证过期时,系统抛出未经授权的错误。我们希望实现类似的行为,即如果Kerberos票证过期,则应抛出未经授权的错误,而不是等待用户输入凭据。请帮忙。 为Kerberos测试设置客户
我已经编写了一个在Windows下运行的简单JavaHTTP客户端。客户端与需要通过SPNego进行Kerberos身份验证的Web服务器进行通信。 我遇到了两个问题: > 服务票证没有存储在我的凭据缓存中。执行请求后,我希望看到一个Kerberos服务票存储在我的凭据缓存下的
我在W12服务器上运行了以下命令:- setspn-A HTTP/krbspn ktpass/princ HTTP/@/crypto ALL/ptype krb5\u nt\u principal/mapuser krbspn c:\ticket\krbspn。按键-kvno 0/pass Pa$$w0rd kinit-krbspn给出了正确的结果,但kinit-HTTP/返回:- KrbExce
问题内容: Google的Chrome和IE等应用程序可以透明地处理Kerberos身份验证;但是我找不到适合这种透明度的“简单” Java解决方案。我发现的所有解决方案都需要存在一个krb5.conf文件和一个login.conf文件,以上应用似乎还需要这些文件。 用有效的Kerberos SSO功能构建Java应用程序的最佳方法是什么? [更新]:明确地说,我需要一个 CLIENT 端解决方案
我们有一个内部开发的基于客户机/服务器的应用程序。客户端和服务器通过TCP/IP连接与特定于应用程序的协议进行通信。客户端在Windows上运行,服务器在Linux上运行。所有计算机都位于相同的Active Directory/Kerberos域/领域中。 目前,用户在启动应用程序时输入用户名和密码。服务器检查用户名和密码(身份验证)。服务器还根据用户名确定对资源的访问(授权)。 我们希望向应用程
问题内容: 我正在使用spnego(http://spnego.sourceforge.net)在JBoss下进行kerberos身份验证。 我需要解密kerberos票证才能访问包含PAC数据的授权数据。需要PAC数据来决定要授予用户哪些角色。 如何访问和解密kerberos票?我在网上搜索了示例,但没有任何努力。 问题答案: 这些家伙具有完整的PAC解码实现: http://jaasloung