标签: gssapi

SASL与gssapi

我正在做一个涉及身份验证的项目,我不太了解SASL和gssapi之间的区别。gssapi是否在SASL的保护下使用?我可以在没有SASL的情况下使用gssapi吗?正确的做法是什么?

如果我使用libsasl,是否需要链接libgssapi_ *?

谢谢。

sasl gssapi

5
推荐指数
1
解决办法
3884
查看次数

为什么不同域中的浏览器根本不响应 mod_auth_kerb 发送的“WWW Authenticate : Negotiate”标头?

我已经在我们的 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 实现,而这一特定知识是关键。

apache kerberos spnego gssapi single-sign-on

5
推荐指数
1
解决办法
1739
查看次数

GSSAPI 中的 javax.naming.AuthenticationException

我正在尝试使用 JAVA GSSAPI 执行 NTLM 绑定。

我收到此错误:

javax.naming.AuthenticationException:GSSAPI [根异常是 javax.security.sasl.SaslException:GSS 启动失败 [由 GSSException 引起:未提供有效凭据(机制级别:票证请求中的选项设置无效。(101))]]

我认为(不确定)它在过去有效。为了解决其他问题,我尝试了“kinit”。从那时起停止工作。我什至删除了缓存文件(在 Windows 中找不到 kclear),但仍然存在这个问题。

我该如何解决?

java security ntlm kerberos gssapi

5
推荐指数
1
解决办法
4002
查看次数

使用SSPI进行Kerberos身份验证

注意:我设法取得一些进展,请参阅我当前问题的编辑,谢谢.


我想在Windows上使用libcurl来访问具有Kerberos/GSSAPI身份验证的网站.我首先尝试使用MIT Kerberos,但我还需要使用SSPI进行NTLM身份验证(libcurl不支持同时使用两种不同的实现).所以我希望使用Windows SSPI库在Kerberos中进行身份验证.我设法用SSPI和SPNEGO支持编译libcurl.

现在我的问题是我需要使用提供的凭据连接到任何提供的域(它可能是当前用户的领域或不同的领域).根据我的理解,我需要从secur32.dll/security.dll调用AcquireCredentialsHandle和InitializeSecurityContext来检索Kerberos票证.

但每次我试着让它发挥作用,我:

  1. 不要从SSPI缓存中提供的凭据/域的DC获取任何票证(我使用kerbtray.exe查看条目).
    • 使用这些方法时,我应该在此缓存中看到票证吗?
  2. 在使用InitializeSecurityContext/AcceptSecurityContext的客户端/服务器环回调用ImpersonateSecurityContext并查看Wireshark中的数据包之后使用libcurl,我发现libcurl不使用任何提供的凭据而是回退到NTLM(这只会导致身份验证失败) )
    • 环回客户端/服务器是否正确行为(我在Web上找不到任何其他实现的示例)?
    • 如果假冒成功,libcurl应该使用线程的模拟凭据吗?
    • libcurl是否支持使用SSPI的所有NTLM + 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 握手:

  1. 联系Web服务器(web.b.com,其中B.COM是Web服务器的kerberos领域)
  2. 收到未经授权的答复,WWW-Authenticate参数设置为Negotiate
  3. Libcurl/SSPI将TGS-REQ发送到当前用户域的域控制器(DC)(比如A.COM)
  4. 不知何故,下一个TGS-REQ被发送到Web服务器的域控制器(B.COM)
  5. 收到域B.COM的Kerberos票证,并在LSA缓存中添加一个条目(可通过klist.exe或kerbtray.exe查看)
  6. Libcurl使用授权信息(WebS服务器)向Web服务器发送HTTP请求

但是,这是我的新问题,所有这些握手都是使用当前记录的凭据进行的,比如user1@A.COM.由于A.COM和B.COM之间存在信任,我的用户可以访问,因此可以使用.我更喜欢使用提供的凭据(user2.B.COM)登录?

另外,我不太确定是否可以在与当前登录用户不同的用户的LSA缓存中添加条目?

如何通过模拟用户user2.B.COM来使libcurl能够访问与此用户关联的故障单以对Web服务器进行身份验证的方式来完成此工作?

curl kerberos sspi gssapi

5
推荐指数
1
解决办法
7879
查看次数

SPN如何与Kerberos一起工作

据我了解,

  • SPN是Windows服务的身份验证工具.
  • Kerberos是一种用户身份验证服务
  • SPNEGO-GSSAPI是能够使用这些服务的第三方API.
  • SSPI:是从SPNEGO向SPN服务发送请求的中性层.

我完全失去了吗?

试图弄清楚它是如何工作的但是信息太精确或不够.

谢谢

kerberos sspi windows-authentication spnego gssapi

5
推荐指数
1
解决办法
2万
查看次数

如何验证kerberos令牌?

所以我再次遇到一些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)

java kerberos active-directory spnego gssapi

5
推荐指数
1
解决办法
5998
查看次数

使用 Kerberos 进行身份验证时登录错误

我们正面临一个有趣的问题。用户使用 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 应用程序服务器时,一切都对相同的用户有效,直到他们再次面临问题。我们试图检查日志并更改密钥表文件,但没有任何效果。有没有人遇到过这个问题?

websphere kerberos active-directory spnego gssapi

5
推荐指数
1
解决办法
1万
查看次数

使用Zookeeper客户端连接到Hadoop集群的KrbException - UNKNOWN_SERVER

我的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)

hadoop kerberos gssapi apache-zookeeper

5
推荐指数
1
解决办法
1209
查看次数

gss_acquire_cred失败,找不到密钥表条目

我试图在加入域的情况下使Windows客户端通过Linux服务器进行身份验证,我基于PBIS / gssappsMSDN 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 gssapi

5
推荐指数
1
解决办法
3086
查看次数

Kerberos票证验证功能测试

我已经编写了一些代码来验证服务器上客户的kerberos票证。我还为班级编写了单元测试。通过模拟对GSS库类的调用来编写单元测试。尽管由于模拟了实际的GSS调用,但这并没有给我足够的信心。

从到目前为止的研究中,我已经收集到,为了验证客户端的令牌,我需要使用与KDC共享的密钥对它进行解密,该密钥可以从keytab文件中获得。因此,为了执行验证,我需要做两件事(需要纠正的立场):

  1. 客户的代币
  2. 服务器上的Keytab文件

现在,如果我在类路径中有这些文件,是否可以在没有任何模拟调用的情况下对令牌进行实际验证?这样做有技术上的挑战吗?如果是的话,那是什么?

更新1:

看来我还需要设置一些系统属性,以便GSS库选择正确的领域,kdc等。因此,本质上我们需要三件事:

  1. 一张非洲球票
  2. 密钥表文件
  3. 与keytab文件和票证相对应的系统属性。

这样,我似乎可以通过验证进行端到端的测试工作,但只能进行5分钟。:)

情况是,如果我捡起由KDC新鲜生成的kerberos令牌并将其放入测试中,则测试可以成功运行,但5分钟后会开始失败,但“时钟偏斜太大”除外。我更改了KDC上的kerberos策略,以生成永不过期的凭单,但错误仍然存​​在。这里的一线希望是,现在我有了一种方法可行的概念证明。

问题归结为克服了“时钟偏斜太大”错误。

更新2:

可以通过在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)

java kerberos gssapi

5
推荐指数
1
解决办法
285
查看次数