我正在做一个涉及身份验证的项目,我不太了解SASL和gssapi之间的区别。gssapi是否在SASL的保护下使用?我可以在没有SASL的情况下使用gssapi吗?正确的做法是什么?
如果我使用libsasl,是否需要链接libgssapi_ *?
谢谢。
我已经在我们的 apache-active 目录环境中通过 mod_auth_kerb 实现了 SSO,它按预期工作。然而,以下知识困扰着我:
我从两台客户机请求 Kerberos 保护页面,一个用户属于 Kerberos-setup 域,另一个用户属于某个其他域。然后我比较了两台机器上的 HTTP 数据包。在两台机器上,发送对 Kerberos 保护页面的请求后,服务器使用以下 HTTP 数据包进行响应:
HTTP/1.1 401 需要授权日期:2012 年 9 月 5 日星期三 14:25:20 GMT 服务器:Apache WWW-Authenticate : Negotiate WWW-Authenticate: Basic realm="Kerberos Login" Content-Length: 60 Connection: close Content-Type: text/html; 字符集=iso-8859-1
但是,在来自服务器的上述响应之后,属于 Kerberos-setup 域的客户端计算机的浏览器以WWW-Authenticate响应:Negotiate 'token',而其他客户端浏览器(属于某个其他域的用户)根本不响应.
现在我的理解是,属于另一个域的客户端也应该用它自己的 TGT+Session 密钥令牌进行响应,活动目录应该拒绝它。但是为什么这个客户端根本不响应服务器的WWW-Authenticate : Negotiate Challenge 超出了我的逻辑。更令人困惑的是,服务器的 HTTP 响应(上面给出)不包含有关它所链接的域的任何信息。
那么属于正确域的客户端浏览器基于什么决定它必须响应服务器的WWW-Authenticate : Negotiate挑战,而属于其他域的客户端基于什么决定不响应相同的请求?
注意:两台客户端机器都有 Windows 7,活动目录是 Windows 2008 服务器。
我正在尝试了解 mod_auth_kerb 的 SSO 实现,而这一特定知识是关键。
我正在尝试使用 JAVA GSSAPI 执行 NTLM 绑定。
我收到此错误:
javax.naming.AuthenticationException:GSSAPI [根异常是 javax.security.sasl.SaslException:GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:票证请求中的选项设置无效。(101))]]
我认为(不确定)它在过去有效。为了解决其他问题,我尝试了“kinit”。从那时起停止工作。我什至删除了缓存文件(在 Windows 中找不到 kclear),但仍然存在这个问题。
我该如何解决?
注意:我设法取得一些进展,请参阅我当前问题的编辑,谢谢.
我想在Windows上使用libcurl来访问具有Kerberos/GSSAPI身份验证的网站.我首先尝试使用MIT Kerberos,但我还需要使用SSPI进行NTLM身份验证(libcurl不支持同时使用两种不同的实现).所以我希望使用Windows SSPI库在Kerberos中进行身份验证.我设法用SSPI和SPNEGO支持编译libcurl.
现在我的问题是我需要使用提供的凭据连接到任何提供的域(它可能是当前用户的领域或不同的领域).根据我的理解,我需要从secur32.dll/security.dll调用AcquireCredentialsHandle和InitializeSecurityContext来检索Kerberos票证.
但每次我试着让它发挥作用,我:
为了便于调试和测试,您是否知道任何向SSPI缓存添加条目的工具,例如来自MIT Kerberos库的kinit?我正在使用Windows Server 2003资源工具包工具,但我找不到任何此类工具...
任何帮助将不胜感激 !
编辑
好吧,我发现了如何使用libcurl制作我想要的东西.最后我假设我必须事先与SSPI做一些工作,但curl正确支持它.
当使用正确构建的curl版本与SSPI和SPNEGO标志时,curl将对kerberos域进行身份验证并将其存储在LSA缓存中.
使用curl.exe进行测试时,需要指定--negotiate参数以及用户名/密码.但是,使用libcurl时,只需将CURLOPT_HTTPAUTH选项设置为包含CURLAUTH_GSSNEGOTIATE的任何内容(例如CURLAUTH_ANY).在我的测试中,libcurl完成了预期的Kerberos 握手:
但是,这是我的新问题,所有这些握手都是使用当前记录的凭据进行的,比如user1@A.COM.由于A.COM和B.COM之间存在信任,我的用户可以访问,因此可以使用.我更喜欢使用提供的凭据(user2.B.COM)登录?
另外,我不太确定是否可以在与当前登录用户不同的用户的LSA缓存中添加条目?
如何通过模拟用户user2.B.COM来使libcurl能够访问与此用户关联的故障单以对Web服务器进行身份验证的方式来完成此工作?
据我了解,
我完全失去了吗?
试图弄清楚它是如何工作的但是信息太精确或不够.
谢谢
所以我再次遇到一些AD和Kerberos问题.
好吧很酷,我从WWW-Authenticate标题中获得了一个kerberos令牌.现在我想针对AD验证此令牌,但我不知道如何.
我从GSSAPI中找到了一些东西,但没有看到将byte []作为Kerberos令牌或任何其他方式的函数或方法.
我正在运行Java EE Web应用程序.
我可以用这个令牌来获取用户,尤其是AD中的"此令牌和用户是否合法"?
编辑:
正如评论中所说,我真的很接近能够执行SSO.所以我会用你所拥有的东西来更新你们.
我有一台名为ping01的服务器和我的本地机器.作为用户mgmt在Tomcat上运行我有我的应用程序.所以我做了这一切:
在用户mgmt创建了SPN HTTP /ping01.cool.domain@COOL.DOMAIN.
krb5.conf的:
[libdefaults]
default_tkt_enctypes = aes256-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
default_tgs_enctypes = aes256-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
permitted_enctypes = aes256-cts rc4-hmac des3-cbc-sha1 des-cbc-md5 des-cbc-crc
default_realm = COOL.DOMAIN
kdc_timesync = 1
ccache_type = 5
forwardable = true
proxiable = true
[realms]
COOL.DOMAIN = {
kdc = kdc.cool.domain
admin_server = COOL.DOMAIN
default_domain = COOL.DOMAIN
}
[domain_realm]
cool.domain = COOL.DOMAIN
ping01 = COOL.DOMAIN
[login]
krb4_convert = true
krb4_get_tickets = false …Run Code Online (Sandbox Code Playgroud) 我们正面临一个有趣的问题。用户使用 Kerberos 身份验证登录到应用程序。有几次他们成功了,但突然他们的用户登录信息面临锁定,他们在屏幕上看到下面的错误
Login error: com.ibm.security.krb5.KrbException, status code: 24
message: Pre-authentication information was invalid
Stack Trace :
javax.security.auth.login.FailedLoginException: Login error: com.ibm.security.krb5.KrbException, status code: 24
message: Pre-authentication information was invalid
at com.ibm.security.jgss.i18n.I18NException.throwFailedLoginException(I18NException.java:33)
at com.ibm.security.auth.module.Krb5LoginModule.a(Krb5LoginModule.java:457)
at com.ibm.security.auth.module.Krb5LoginModule.b(Krb5LoginModule.java:377)
at com.ibm.security.auth.module.Krb5LoginModule.login(Krb5LoginModule.java:200)
at sun.reflect.GeneratedMethodAccessor36.invoke(Unknown Source)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:56)
at java.lang.reflect.Method.invoke(Method.java:620)
at javax.security.auth.login.LoginContext.invoke(LoginContext.java:781)
at javax.security.auth.login.LoginContext.access$000(LoginContext.java:215)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:706)
at javax.security.auth.login.LoginContext$4.run(LoginContext.java:704)
at java.security.AccessController.doPrivileged(AccessController.java:452)
Run Code Online (Sandbox Code Playgroud)
当我们重新启动 websphere 应用程序服务器时,一切都对相同的用户有效,直到他们再次面临问题。我们试图检查日志并更改密钥表文件,但没有任何效果。有没有人遇到过这个问题?
我的Zookeeper客户端无法连接到Hadoop集群.
这可以从Linux VM中正常工作,但我使用的是Mac.
我-Dsun.security.krb5.debug=true在JVM上设置了标志并获得以下输出:
Found ticket for solr@DDA.MYCO.COM to go to krbtgt/DDA.MYCO.COM@DDA.MYCO.COM expiring on Sat Apr 29 03:15:04 BST 2017
Entered Krb5Context.initSecContext with state=STATE_NEW
Found ticket for solr@DDA.MYCO.COM to go to krbtgt/DDA.MYCO.COM@DDA.MYCO.COM expiring on Sat Apr 29 03:15:04 BST 2017
Service ticket not found in the subject
>>> Credentials acquireServiceCreds: same realm
Using builtin default etypes for default_tgs_enctypes
default etypes for default_tgs_enctypes: 17 16 23.
>>> CksumType: sun.security.krb5.internal.crypto.RsaMd5CksumType
>>> EType: sun.security.krb5.internal.crypto.Aes128CtsHmacSha1EType
>>> KrbKdcReq send: kdc=oc-10-252-132-139.nat-ucfc2z3b.usdv1.mycloud.com UDP:88, timeout=30000, number …Run Code Online (Sandbox Code Playgroud) 我试图在加入域的情况下使Windows客户端通过Linux服务器进行身份验证,我基于PBIS / gssapps和MSDN GSS / SSPI互操作文档的一部分提供的文档创建了服务主体。更新了/etc/krb5.keytab中的相关keytab条目。
确保DNS区域设置正确,并且计算机已加入域
static int server_acquire_creds(
char *service_name,
gss_cred_id_t *server_creds
)
{
int ret = 0;
gss_buffer_desc name_buf = GSS_C_EMPTY_BUFFER;
gss_name_t server_name = GSS_C_NO_NAME;
OM_uint32 maj_stat = 0, min_stat = 0;
name_buf.value = service_name;
name_buf.length = strlen((char *)name_buf.value) + 1;
maj_stat = gss_import_name(&min_stat, &name_buf,
(gss_OID) gss_nt_service_name, &server_name);
if (maj_stat != GSS_S_COMPLETE) {
display_status("importing name", maj_stat, min_stat);
ret = -1;
goto error;
}
maj_stat = gss_acquire_cred(&min_stat, server_name, 0,
GSS_C_NULL_OID_SET, GSS_C_ACCEPT,
server_creds, NULL, NULL); …Run Code Online (Sandbox Code Playgroud) 我已经编写了一些代码来验证服务器上客户的kerberos票证。我还为班级编写了单元测试。通过模拟对GSS库类的调用来编写单元测试。尽管由于模拟了实际的GSS调用,但这并没有给我足够的信心。
从到目前为止的研究中,我已经收集到,为了验证客户端的令牌,我需要使用与KDC共享的密钥对它进行解密,该密钥可以从keytab文件中获得。因此,为了执行验证,我需要做两件事(需要纠正的立场):
现在,如果我在类路径中有这些文件,是否可以在没有任何模拟调用的情况下对令牌进行实际验证?这样做有技术上的挑战吗?如果是的话,那是什么?
看来我还需要设置一些系统属性,以便GSS库选择正确的领域,kdc等。因此,本质上我们需要三件事:
这样,我似乎可以通过验证进行端到端的测试工作,但只能进行5分钟。:)
情况是,如果我捡起由KDC新鲜生成的kerberos令牌并将其放入测试中,则测试可以成功运行,但5分钟后会开始失败,但“时钟偏斜太大”除外。我更改了KDC上的kerberos策略,以生成永不过期的凭单,但错误仍然存在。这里的一线希望是,现在我有了一种方法可行的概念证明。
问题归结为克服了“时钟偏斜太大”错误。
可以通过在krb.conf文件中指定时钟偏斜值来进行修改。那是我需要设置的另一个系统属性。现在,测试可以端到端进行了。现在写一个答案。
时钟偏斜错误的堆栈跟踪:
Caused by: java.security.PrivilegedActionException: GSSException: Failure unspecified at GSS-API level (Mechanism level: Clock skew too great (37))
at java.security.AccessController.doPrivileged(Native Method)
at javax.security.auth.Subject.doAs(Subject.java:422)
at com.example.vidm.eks.request.KerberosTokenValidator.getPrincipalUserName(KerberosTokenValidator.java:91)
at com.example.vidm.eks.request.KerberosTokenValidator.lambda$validateToken$0(KerberosTokenValidator.java:80)
... 7 more
Caused by: GSSException: Failure unspecified at GSS-API level (Mechanism level: Clock skew too great (37))
at sun.security.jgss.krb5.Krb5Context.acceptSecContext(Krb5Context.java:856)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
at sun.security.jgss.spnego.SpNegoContext.GSS_acceptSecContext(SpNegoContext.java:906)
at sun.security.jgss.spnego.SpNegoContext.acceptSecContext(SpNegoContext.java:556)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:342)
at sun.security.jgss.GSSContextImpl.acceptSecContext(GSSContextImpl.java:285)
at com.example.vidm.eks.krb.KerberosValidateAction.run(KerberosValidateAction.java:47)
at com.example.vidm.eks.krb.KerberosValidateAction.run(KerberosValidateAction.java:22)
... 11 more …Run Code Online (Sandbox Code Playgroud)