问题标签 [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 投票
3 回答
1201 浏览

authentication - How do I interact with a kerberos server from my own application

My network has a kerberos server for username/password authentication. Machines that run my application have functioning kerberos clients, so users can use kinit, etc.

How do I interact with the server programatically, from my own custom applications? The preferred language for an example is C.

I want users of my application to authenticate against a kerberos server before access to certain functions. I anticipate having to ask them for their username and password - kinit may not have been called.

The machines hosting the applications run OS X and Debian/Linux.

I believe the answer might well involve GSSAPI. If so, are there good tutorials for this?

0 投票
1 回答
4866 浏览

java - 服务主体名称 (SPN) 是否绑定到特定机器?

目前,我的 GSS 演示应用程序(在服务器端)收到 KrbException:解密字段的完整性检查失败(31)。现在我正在寻找这个的原因。我怀疑,它来自于这样一个事实

  1. 客户端和服务器应用程序在同一台机器 (localhost) 上运行和/或
  2. SPN 是为另一台机器(计算机)生成的

第二个表示服务主体是为机器 xxx0815.domain.net 生成的,所以 SPN 是 HTTP/xxx0815.domain.net@DOMAIN.NET。而且我的机器不是那个,但是我已经拿到了keytab文件,这样服务器的登录方法就成功了。

我怀疑正确还是我犯了另一个错误?

服务器配置及源码:
server.conf

GSSServer.java(省略了样板文件)

客户端配置及源码:
client.conf

GssClient.java(样板省略)

我检查了传出和传入的网络数据 - 两边都是一样的,所以我可以排除那里的问题(我对输出进行了 BASE64 编码,然后通过流发送它。我认为没有什么可以去的那里错了...)。

我得到的例外:

0 投票
2 回答
1925 浏览

jetty - 是否可以将 Kerberos 身份验证集成到 Jetty 6 中?

我们目前有一个运行嵌入式 jetty 6.1.14 服务器的应用程序,我们需要通过 Kerberos 添加身份验证。我是 Kerberos 的新手,这使得这项任务比它应该做的要难大约 100 倍。我搜索了互联网,发现关于它是否可能的相互矛盾的报告,但没有什么可以提供关于如何进行的指导。

我已经设法让服务器基本上能够通过 kerberos 对用户进行身份验证,但无法让客户端自动发送其 kerberos 票证:我必须使用 from auth-method,尽管有提示这可能正在使用过滤器,这些过滤器的文档记录很差。

我的问题——我为它有点含糊而道歉,我已经很长时间没有这么生气了——是请求一些指导以在 Jetty 6 中插入没有登录表单的 kerberos 身份验证?还是我只是运气不好?有没有人将这种类型的身份验证添加到 jetty 6?

0 投票
1 回答
434 浏览

java - Java/C# Kerberos 互操作可能吗?

我已经使用 Java 中的套接字实现了一个 Kerberos 服务器/客户端,客户端将他的 service-TGT 发送到服务器,并且服务器知道客户端是真实的。

我主要担心的是窥探“中间人”攻击。有人可以捕获 TGT,并伪装成客户。

在纯 Java 实现中,这没有问题,因为进一步的通信是使用服务会话密钥 (GSSContext.wrap()/GSSContext.unwrap()) 加密的,而窥探者没有。

但是客户端应用程序需要用 C# 重新编写。

我认为保持通信加密的两个选项是:

  1. 用 C# 编写我自己的 wrap() 和 unwrap() 方法
  2. 使用 SSL/TLS。

在我将 SSL 作为一个选项之前,选项 1 是否可能?

0 投票
1 回答
5538 浏览

java - 为什么从 Microsoft IE 到 Java 服务器使用 Active Directory SSO 时会出现 GSSException?

我正在为 Java Web 应用程序(使用 SPNEGO/Kerberos)构建一个 Active Directory 单点登录身份验证系统,并且在 Firefox 或(据报道)Safari 上一切正常,但 Internet Explorer 会导致异常:

事实上,我认为 IE 在安装 Windows 补丁之前就可以工作。

0 投票
2 回答
2116 浏览

c - 哪些程序使用 GSS-API?有没有像样的示例程序?

我以为我想使用 GSS-API,但现在不太确定,因为我很难为一个简单的客户端/服务器对找到好的示例代码。Sun 有包含示例代码的文档,但它是专门为他们的 GSS API 实现编写的,使用了一些专有功能,例如GNU GSS-API中没有的(而且我还不清楚如何针对 GNU 实现重新实现它们)。另外,它是用 pre-ANSI C 编写的,带有 K&R 函数声明等(我在转换声明时没有问题,但它确实让我认为 Sun 示例代码可能太旧以至于无关紧要)。

在过去十年中,您是否在应用程序中使用过 GSS-API?你知道一些值得一读的带有示例程序的独立教程吗?

或者,也许我走错了路,应该改用 SASL。GNU GSS-API 作者自己也提出了同样的建议

对于它的价值,我在 Linux 上使用 GCC,并且已经为其他目的设置了 Kerberos。

0 投票
1 回答
985 浏览

apache - 为什么 Firefox 一直在协商 kerberos 服务票证?

我对 Kerberos 进行了一些测试,发现了一些与 Firefox 和 Kerberos 相关的奇怪行为。我有一个运行 Apache + mod_auh_kerb 的服务器,它被配置为在服务来自客户端的请求时检查 kerberos 凭据。执行 Kerberos 身份验证并拒绝没有有效凭据的用户。但是,我不明白以下内容:

一旦发出第一个请求,TGS 就会缓存在客户端的 /tmp/krb5ccXXXX 中,但网络捕获显示 firefox 会为每个连接请求一个 TGS。由于我的服务票已被缓存,那么为什么不将其重新用于其他请求?每个连接如下:

client = GET index.html => server
client <= 401 Auth required = server
client = TGS-REQ => KDC
...
client <= TGS-REP = KDC
client = GET index.html + kerberos payload => server
client < = 200 OK = 服务器

这不是配置问题,因为 Konqueror 会按预期执行。

有任何想法吗 ?

提前致谢。

PS:这对于 GET 请求来说不是什么大问题,但考虑到基于表单的上传 (POST) 数据不应该被发送两次到服务器!

0 投票
1 回答
3123 浏览

java - 子错误代码 568 对带有 Active Directory 的 Ldap 错误 49 意味着什么

我正在编写一些使用 SASL GSSAPI 对 Active Directory 进行身份验证的 Java 代码。大多数情况下,这段代码运行良好,但对于一个用户,我得到了响应:

我知道 49 意味着这是一个身份验证失败,并且相关的子代码是 568,但我只知道该数据的以下含义:

  • 525 - 未找到用户
  • 52e - 无效凭据
  • 530 - 此时不允许登录
  • 532 - 密码过期
  • 533 - 帐户已禁用
  • 701 - 帐户已过期
  • 773 - 用户必须重置密码

到目前为止,我无法从 Microsoft 中找到这些错误代码的权威来源(此列表是从论坛帖子中拼凑而成的),并且我找不到该 568 错误的任何内容。

有谁知道这意味着什么?

编辑:看起来这个列表的来源来自 IBM 的这个文档

0 投票
3 回答
5421 浏览

ldap - ldap_sasl_bind_s(GSSAPI) - 应该在凭证 BERVAL 结构中提供什么

我正在尝试使用ldap_sasl_bind_sMicrosoft LDAP C SDK 中的方法,并将GSSAPI作为身份验证机制。ldap_sasl_bind_s期望凭证是一个BERVAL不透明的结构。

给定用户名(或 DN)和密码,我如何获得BERVAL我应该传递给的结构ldap_sasl_bind_s

到目前为止我发现的例子

  • 来自其他 LDAP C SDK - 不是来自 Microsoft
  • 在需要简单身份验证时使用ldap_sasl_bind_s- 但我需要使用 GSSAPI
  • ldap_sasl_interactive_bind_s在需要其他 SASL 身份验证机制时使用。但是,ldap_sasl_interactive_bind_sMicrosoft SDK 中没有。

附带说明一下,目标是能够通过 SASL 绑定到各种 LDAP 服务器;现在:ActiveDirectory 和 OpenLDAP。

任何指针将不胜感激。

0 投票
1 回答
2117 浏览

c# - NegotiateStream 不能与 Kerberos/NTLM/GSSAPI over SASL (POP3/IMAP/SMTP) 一起使用?

我正在尝试获取集成 Windows 身份验证(使用当前登录的 Windows 用户的默认凭据)以登录 Exchange 2007 帐户(SMTP/POP3/IMAP)。

我已经为此实现了工作,但它使用 SSPI 函数,因此需要非托管代码权限(不好)。我试图为此使用 NegotiateStream 类,但它不起作用。

您不能直接将 NegotiateStream 与 POP3/IMAP/SMTP 一起使用,因为整个对话中的每个请求和响应都需要用 base64 包装并包含邮件协议后缀等。所以,我实现了自己的流类,它可以做到这一点,并在 NetworkStream 和 NegotiateStream 之间注入它。但是,我注意到 NegotiateStream 创建的请求和它期望的响应与我成功使用的请求不同(以及由其他能够进行 NTLM/GSSAPI 类型身份验证的邮件客户端创建的请求)。

特别是,NegotiateStream 首先发送一个 5 字节长度的请求,其他实现不发送该请求。此数据包被 Exchange 拒绝并显示“协议错误”消息。

NegotiateStream 创建的第二个请求是正确的(以 NTLMSSP 开头)。因此,我决定忽略 base64 编码中间流中的第一个数据包而不发送它。当 Exchange 获得第二个数据包时,它成功地吃掉了这个数据包并返回正确的继续响应。但是,这一次 NegotiateStream 现在想要接收 5 字节的响应,而服务器返回的响应要大得多。简而言之,NegotiateStream 发送 +1 请求并期望 +1 响应。

我可以避免发送第一个“冗余”5 字节数据包,但我无法发明 NegotiateStream 期望的第一个 5 字节响应数据包。我尝试提供 NegotiateStream 之前尝试发送的相同数据包,但这当然没有用。

我想知道发生了什么以及如何解决这个问题。在 Windows XP SP3 和 Windows Server 2008 上也会发生相同的行为。

我不是 Kerberos/GSSAPI 专家,但从我在文档中发现的内容看来,Kerberos 对话确实应该以 5 字节数据包开始。但是,我在使用其他工作工具时从未见过它,Exchange 也拒绝它。也许,当通过 SASL 协议使用 GSSAPI(用于 POP3/IMAP/SMTP 进行身份验证)时,应该省略第一个数据包?但是,当它期望来自服务器的 5 字节响应时,我如何告诉 NegotiateStream 或者至少应该向它发送什么?

我尝试了不同的 NegotiateStream 模式,我还向 Exchange 发布了 AUTH NTLM 和 AUTH GSSAPI 但这一切都没有区别。其他工作实现(同时支持 GSSAPI 和 NTLM)都以相同的方式工作(GSSAPI 和 NTLM 数据包之间没有太大区别)。所有传入和传出的数据包都远大于 5 个字节。

我还尝试在 Windows XP 上使用 IIS SMTP 服务,结果相同。基于 SSPI 的非 NegotiateStream 实现工作,而 NegotiateStream 由于第一个数据包而不起作用。如果我不发送它,我不知道 NegotiateStream 期望的第一个响应是什么。

我曾经认为应该可以让它工作,因为 SmtpClient 类可以以某种方式管理它并使用默认凭据和 NTLM 进行身份验证。但是我发现 SmtpClient 内部没有使用 NegotiateStream,它只是进行非托管 SSPI 调用,就像我在旧版本的软件中所做的那样。

也尝试使用 Visual Studio 2010 / .NET 4.0。没有运气(也没有新的方法/属性来微调 NegotiateStream 中的东西)。

我完全迷路了:-(