问题标签 [gssapi]

For questions regarding programming in ECMAScript (JavaScript/JS) and its various dialects/implementations (excluding ActionScript). Note JavaScript is NOT the same as Java! Please include all relevant tags on your question; e.g., [node.js], [jquery], [json], [reactjs], [angular], [ember.js], [vue.js], [typescript], [svelte], etc.

0 投票
1 回答
1330 浏览

kerberos - 使用 SSPI,应该如何将 Kerberos 令牌发送到启用 GSSAPI 的 HTTP 代理服务器?

我有一个简单的客户端套接字应用程序,我想通过它访问网站。为了访问 Internet,我的客户端必须通过 HTTP 代理服务器(我使用的是 Microsoft Forefront 威胁管理网关)。代理服务器需要身份验证,并且被配置为通过 GSSAPI 接受 Kerberos。

在我的客户端中,我使用 Microsoft 的 SSPI:

首先,我调用AcquireCredentialsHandle成功并返回SEC_E_OK

接下来,我调用InitializeSecurityContext也成功并返回SEC_E_OK

到目前为止,一切都很好。但是现在,我需要将令牌提交给代理服务器进行授权,这是给我带来问题的部分。

如果我使用 Internet Explorer 连接到我的代理服务器,我可以通过 Wireshark 观看数据包交换。IE 与 Kerberos 协商票证,并似乎通过 Proxy-Authorization 标头提交票证。标头内容似乎是 base64 编码的。

如果我只是获取从返回的令牌InitializeSecurityContext,base64 对其进行编码并通过类似的标头将结果发送到代理服务器Proxy-Authorization: Negotiate <base64Data>,则身份验证失败。

我觉得我很接近,但仍然缺少一些东西。一个站点讨论了在发送之前在令牌上使用 EncryptMessage。另一个讨论了使用相互身份验证(我不认为 IE 正在使用相互身份验证,因为客户端似乎只发送一次授权,并且没有来自服务器的反馈数据(InitializeSecurityContext第二次调用)另一个站点概述了将令牌与不同的SEC_BUFFER类型(填充、数据等)和加密。我怀疑这是我需要做的,因为我没有找到太多关于如何做的文档。

您可能有任何见解或建议将不胜感激。

2014 年 7 月 19 日更新:为了清楚起见,我在问如何使用 SSPI 来计算“base64Data”字段(如上所述)。虽然计算 SECBUFFER_TOKEN 缓冲区中包含的内容的 base64 编码是我最初的猜测,但服务器不接受结果,因此它显然是无效的。

进一步的研究表明,令牌必须“包装”(又名“EncryptMessage”通过 SSPI)并以与 GSSAPI 兼容的方式加密,必须使用三个缓冲区(按顺序:SECBUFFER_TOKEN、SECBUFFER_DATA 和 SECBUFFER_PADDING)我试过这个昨天,但没有找到成功。

http://msdn.microsoft.com/en-us/library/ms995352.aspx

http://msdn.microsoft.com/en-us/magazine/cc301890.aspx

0 投票
3 回答
14109 浏览

java - 使用 GSSManager 验证 Kerberos 票证

我有以下代码:

当然失败了。这是一个例外:

GSSException: Defective token detected (Mechanism level: GSSHeader did not find the right tag)

我不知道我该怎么做才能解决这个问题。老实说,我不太了解 Kerberos。

WWW-Authenticate我通过发送带有“协商”作为值的适当标题的 401 得到了这张票。authorization浏览器立即再次使用包含此票证的标头再次发出相同的请求。

我希望我可以验证票并确定用户是谁。

我需要密钥表文件吗?如果是这样,我将在什么凭据下运行它?我正在尝试将 Kerberos 票证用于网站的身份验证。凭据会是来自 IIS 的凭据吗?

我错过了什么?


更新 1 从 Michael-O 的回复中,我进行了更多的谷歌搜索并找到了这篇文章,这导致了我这篇文章

table 3,我发现1.3.6.1.5.5.2 SPNEGO

我现在按照第一篇文章中的示例将其添加到我的凭据中。这是我的代码:

但现在代码createCredential因此错误而失败:


这是整个门票:YIGCBgYrBgEFBQKgeDB2oDAwLgYKKwYBBAGCNwICCgYJKoZIgvcSAQICBgkqhkiG9xIBAgIGCisGAQQBgjcCAh6iQgRATlRMTVNTUAABAAAAl7II4g4ADgAyAAAACgAKACgAAAAGAbEdAAAAD0xBUFRPUC0yNDVMSUZFQUNDT1VOVExMQw==

0 投票
1 回答
5789 浏览

java - 在 Java 中使用 GSSAPI 身份验证时,来自 Active Directory 的搜索结果中的 LDAP 继续引用错误

更新:根据下面@Michael-O 的评论,如果 LDAP JNDI 提供程序或 SASL 实现通过在问题中进行转发然后反向 DNS 查找来规范化主机名,这似乎是处理此问题的正确方法KRN 服务票证请求。我将尝试联系 Open JDK 安全列表,看看是否有任何答案来自那里。

我正在尝试使用会话在根 DN 上针对 Active Directory 服务器执行递归 LDAP 搜索,该会话使用Kerberos LoginContext中的主题通过 GSSAPI 进行身份验证。

我能够使用 URL 成功绑定到服务器ldap://dc1.example.comInitidalDirContextjava.naming.referral设置为follow

(&(objectClass=user)(userPrincipalName=sample_user@EXAMPLE.COM))当我对 的根 DN执行搜索时dc=example,dc=com,我会返回一个SearchResult

和几个继续参考:

我可以很好地遍历SearchResult,但是一旦遇到延续,我就会得到PartialResultsException。我检查了 DNS,所有上述主机名都正确解析。我得到的异常如下所示:

查看 Kerberos 跟踪,这个错误是有道理的。尝试继续时,LDAP 库尝试绑定到ldap://example.com. 由于我们使用 GSSAPI 进行身份验证,这会触发ldap/example.com. 我在日志中看到的响应是:

我检查了 Active Directory,果然在任何域控制器上都没有任何带有值的servicePrincipalName属性。ldap/example.com我尝试手动为ldap/example.comSAVANT-DC1 域控制器的机器帐户添加 SPN。这暂时有效,但 Active Directory 似乎会在几分钟后自动清除 SPN 条目。

似乎解决方案是执行以下操作之一

  1. 获取 Active Directory 以返回包含域控制器名称而不是域的延续。我们知道我们能够以ldap/dc1.example.com.
  2. ldap://example.com以某种方式在要重定向到的事物的 java 端映射延续ldap://dc1.example.com

我无法弄清楚该怎么做(1)。

我尝试使用JNDI 手动推荐处理示例(2)作为指南。我将java.naming.referral属性切换为throw并编写了一个自定义引用处理程序,该处理程序手动覆盖了引用上下文中的java.naming.provider.url属性。但是LdapReferralException.getReferralContext()似乎忽略了java.naming.provider.url环境属性。查看LdapReferralContext.java的 OpenJDK 代码似乎证实了这一点(第 105 行)。

这就是我所在的位置:我无法在 Java 端拦截和操作引用,因为它们被 JNDI API 视为黑匣子。我无法在 AD 端手动创建 LDAP SPN,因为它不会在目录中保持持久性。还有什么我想念的吗?


这是我正在运行的代码


这是我的 krb5.conf:


这是上面代码的输出

0 投票
2 回答
1376 浏览

linux - GSSAPI - Windows Active Directory 互操作性 - 错误接受上下文:请求中的主体错误

我们正在编写可在 Windows 和 Linux 上运行的软件,并计划使用 Windows Active Directory 进行身份验证。我正在努力解决下面描述的问题,非常感谢任何帮助:

域名:CORP.COMPANY.COM

在一台 Linux 机器上运行测试编程:host1.corp.company.com

测试程序来自krb5-1.11.3下载文件中的gss-sample。

服务器将被命名为“gssapitest”。

基于“Kerberos 5(krb5 1.0) 互操作性分步指南(来自 Microsoft),

首先在 AD 中创建一个用户“host1”,代表主机 host1.corp.company.com(linux 机器)。

使用 ktpass 生成密钥表(从 Windows 运行):

现在在 AD 中,创建另一个域用户“gssapitest”来表示测试服务器程序,并类似地映射用户:

将file1.keytab和file2.keytab复制到Linux机器host1,合并到/etc/krb5.keytab。

在 Linux 中,“ktutil”显示 /etc/krb5.keytab 的内容,如下所示:

在 Windows 上,为 Linux 服务器程序注册服务(使用“setspn”),以便结果看起来像(2 个条目,一个带有映射主机名,另一个带有实际主机名,用于测试目的。如果只有一个条目,则没有不管哪一个,结果都是一样的):

现在我以这种方式启动服务器:

并以这种方式从另一个终端启动客户端:

错误显示在服务器端:

这可能是什么原因?我想知道我概述的步骤是否都是必要的。哪个根本不需要或不正确。

(注意:我尝试在 CORP.COMPANY.COM 中使用本地用户帐户和域帐户登录 Linux,结果显示相同的错误。nslookup 也显示了正确的 IP 到 linux 机器的主机映射) .

0 投票
0 回答
809 浏览

linux - FreeIPA LDAP 超时可能是由于 kerberos

我们目前使用 FreeIPA,因此支持我们的 SSH 公钥的集中存储库,这是唯一允许用于登录我们服务器的东西。我们已经安装了带有 IPA 3.3.3(来自默认 repo)的 Centos 7 机器(最新),安装后,webui 非常慢。

添加用户和主机后,缓慢仍然存在。有时,当使用 sudo 命令(sudo 规则实际上在本地机器上)时,会发生 ldap 超时。Web gui 几乎无法使用。

我们决定尝试使用 ipa 4.0.1 安装最新的 Fedora 2x。安装后,我们注意到 webgui 的速度同样缓慢,并且所有其他问题都符合我们之前的经验。我们中的几个人在 Centos 6.5 上使用 IPA 3.0 没有问题。我们想避免回到那样远的地方,因为解决方案肯定是修复我们搞砸的东西。

这是输出$ KRB5_TRACE=/dev/stderr kinit admin

0 投票
1 回答
169 浏览

api - gss_import_name API 上的 GSS_S_FAILURE

所以这是我的代码:

知道我是否正确使用 C 结构已经很有帮助。

我接GSS_S_FAILURE了那个简单的电话。文档说这是一个一般错误,次要状态应该包含更多信息。但是会返回次要状态,因为在此列表2529639135中找不到。

这应该是一个简单的任务,但是要么我的 C 编程技能还不够好,要么我对 GSS API 或 AS/400 上的实现缺乏一些基本的了解。

0 投票
2 回答
2906 浏览

macos - SSH/Kerberos 无法在 OSX 上运行

因此,我尝试并尝试让我的 ssh 与 Mavericks 上的 kerberos 一起使用,但无济于事。这是我的版本:

我也尝试了内置的 ssh,但也没有任何效果。这是我的配置:

我已经检查过了,我的用户配置中没有覆盖设置

毕竟,当我通过 ssh 连接到与 linux 客户端一起工作的 linux 主机时,仍然会提示我输入密码。(我能够成功地 kinit 并且我确实得到了一张票)

任何线索我错过了什么?以前有没有人遇到过这个问题。

这里是 ssh 连接日志的链接。它似乎只是放弃 gssapi 甚至没有尝试它......为什么??

0 投票
0 回答
331 浏览

python-2.7 - python和azure服务总线需要什么认证机制

我想在 linux 下使用 python 来连接 azure 服务总线。为此,我正在使用 qpid-proton 和 amqp 协议。

但是,当我尝试连接到服务总线时,出现以下错误:

qpid.messaging.exceptions.AuthenticationFailure:sasl 协商失败:没有同意机制

我了解服务总线支持 SASL 用户名/密码方案,但还需要什么?我对使用 GSSAPI 有一些模糊的概念。

0 投票
0 回答
1670 浏览

python - javax.security.auth.useSubjectCredsOnly 等价于 Python

有人可以告诉我,如果我使用 python 会是什么等价物?在 Java 中,我将以下设置为 FALSE 以允许使用底层 Kerberos 机制而不是 SPNEGO。

javax.security.auth.useSubjectCredsOnly = false

0 投票
1 回答
262 浏览

c - 如何在使用客户端发送的令牌接受安全上下文之前获取用户名?

我正在使用充当服务器并使用 GSSAPI 进行 kerberos 身份验证的应用程序。

应用程序工作
在启动应用程序时,当客户端发送协商时获取凭据
:令牌
接受上下文使用 gss_accept_sec_context
调用显示名称以获取用户名,如 MyName@DOMAIN

当前应用程序正在为每个会话执行身份验证。

带缓存的 SSO 身份验证

但是我想修改应用程序以对第一个会话执行一次身份验证并缓存某些内容以使用某些内容重新验证用户。在这里,我无法缓存用户名 (MyName@DOMAIN),因为要再次获取用户名应用程序接受上下文并调用显示名称。

有没有办法通过缓存执行 SSO 身份验证?