问题标签 [gss]

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 回答
1370 浏览

java - GSSManager.createCredential 如何获取 Kerberos 密钥和 TGT?

我有以下场景:我有一个在 Oracle 数据库(使用 Java SE 6)中运行的服务器,它使用 Apache HTTP 客户端(Java 中)连接到 Web 服务。需要使用 Kerberos 保护 Web 服务,即使用 SPNEGO 身份验证。

我的服务器有一个 Kerberos 主体,随机密钥导出到密钥表,然后导入到数据库表中。因此,我有一个 KerberosPrincipal,其中包含许多关联的 KerberosKey 对象(每种加密方法一个),所有这些信息都是我在主题中收集的。

我希望下一步是联系 KDC 以获取 TGT 并将其存储在主题中。我怎么做?我在此找到的所有文档都假设这发生在登录模块中,但在我的场景中没有登录。或者以下人员之一会为我致电 KDC?

现在我需要调用 GSSManager.createCredential 来创建一个 GSSCredential,我可以将它包装到一个 KerberosCredentials 和一个 BasicCredentialsProvider 中,我可以将它们添加到 HttpClientContext 中,这样 HttpClient 就可以进行 SPNEGO 身份验证。

但是如何将我的主题中的信息获取到 GSSCredential 中?

0 投票
1 回答
246 浏览

java - GSS JAAS can't read keystore/tab

I'm attempting to connect to a database using Kerberos, everything works except for two issues. First, when I execute my code I am asked two enter my password not once but twice. Then my query is sent to my database and results are returned.

The above problem stems from what I belive the root cause, or second issue I'm having is, I JDK's inability to read the keytab.

I understand that I haven't disabled keyboard input but this is because as you see from the output above I'm unable to read the keytab or cache.

Server and Client both have matching krb5.conf, I am able to kinit, ktadd, klist all expect principals with correct enc types.

I even went so far as to chmod 777 the keytab just to make sure this wasn't a permissions issue.

0 投票
1 回答
250 浏览

php - 运行 Google 站点搜索时出现 500 内部服务器错误

这是我们第一次使用 GSS 并在我们的应用程序中应用。

如果我们在 GSS 中搜索查询,我们会根据我们添加的要搜索的网站获得良好的结果。但是如果我们在一个 for 循环中一个一个地给 GSS 大约一百个查询,比如,

在这里,我们有一长串的几页,我们将其分成小数组,每组 30 个单词。我们在 FOR 循环中传递了这些数组,为了得到结果(各种链接),我们用 echo 打印了结果。我们还应用了 5 秒的睡眠,以便服务器有时间获取结果并打印它,等待 5 秒,然后再搜索另一个查询。

但是当我们运行这个 for 循环时,我们没有得到结果,而是我们的应用程序挂起,并给我们如下结果:

内部服务器错误

服务器遇到内部错误或配置错误,无法完成您的请求。

请通过 webmaster@checkforplag.com 联系服务器管理员,告知他们此错误发生的时间,以及您在此错误之前执行的操作。

服务器错误日志中可能提供有关此错误的更多信息。此外,在尝试使用 ErrorDocument 处理请求时遇到 500 Internal Server Error 错误。

错误截图

请建议我们需要做什么才能在我们的应用程序中完全应用 GSS。

谢谢你!

0 投票
1 回答
56 浏览

java - 在 GWT 中删除跨 Google 样式表 (GSS) 的重复项

我的大多数样式表 (GSS) 都有相同的@defmixin语句集。我希望能够删除重复。

是否可以以@include某种方式使用通用的 GSS 样式表?还是有其他方法可以简单地做到这一点?(我的意思是没有任何外部脚本来处理文件。)顺便说一句,我正在使用 GWT 2.8 应用程序中的 GSS。

我找到了一个相关的问题,但答案并不适合在 GWT 中使用 GSS。

0 投票
1 回答
1207 浏览

java - Java 在不应该时自动使用 Kerberos ticketCache?

我们有一个可以与外部服务对话的服务器端应用程序。这取决于我们的配置,我们是使用调用我们的用户的凭据、使用预配置的凭据还是根本不使用这些服务对这些服务进行身份验证。

外部服务可以使用 HTTP 协商身份验证。对于我们的自定义 HTTP/WebDAV 请求,我们使用 Apache HttpClient,我们可以在其中控制自己的凭据处理。但是对于 JAX-WS 调用(或由 3rd 方库调用的纯 HTTP URL),Java 的 HttpUrlConnection 自己处理身份验证。这就是事情变得奇怪的地方。

Java 应该总是尝试使用来自当前主题的 Kerberos 凭据进行协商。这很好,并且有效。它还可以使用票证缓存(即 kinit 会话或系统会话,如果可访问),但如果我正确阅读了文档(*),它应该只在两个条件下这样做:

*) https://docs.oracle.com/javase/8/docs/technotes/guides/security/jgss/lab/part6.html

  1. javax.security.auth.useSubjectCredentialsOnly 显式设置为 false
  2. 提供了一个自定义 JAAS 配置,它明确地将 useTicketCache 设置为 true

这不是发生的事情。在我们的可重现测试中,如果主题为空,则默认始终使用系统凭据。更糟糕的是,将 useSubjectCredentialsOnly 显式设置为 true(这应该是默认设置)不会改变这种行为。到目前为止,我们发现的唯一解决方法是显式提供自定义 JAAS 配置,将 useTicketCache 设置为 false(这又应该是默认设置)。

对 Krb5LoginModule 的调试表明,除非我们配置此变通方法,否则登录模块实际上会使用 useTicketCache=true 进行调用。

我们可以在我们所有的 Windows 系统上重现这一点。似乎 Linux 可能表现良好,但我无法详细验证这一点(由于域问题)。

我读错了文档吗?还是Java实现中存在错误?还是我们的 Windows 系统不稳定?

我们应该告诉我们的客户始终配置一种解决方法,以防止 Java 使用服务用户而不是向我们的服务发送请求的用户的凭据秘密调用远程服务,这似乎非常不理想。

0 投票
1 回答
153 浏览

gwt - gwt gss 变亮()和变暗()

我试图在 GSS 中使用 lighten() 和 darken()(我是 gwt 2.8 版本和材料设计 rc4),如下所示:

但结果是

我在任何地方都找不到使用这些功能的任何示例.. https://github.com/google/closure-stylesheets

我期待那些像在 SASS 中一样工作

谢谢。

0 投票
1 回答
124 浏览

swift - 在 Swift 中获取 KRB5/GSS 状态

在 Swift 中,我如何获取用户 kerberos 票的状态?我在https://developer.apple.com/reference/gss看到了 GSS 库,但除了“它与这些函数名称一起存在”之外,绝对没有任何文档。

从名称上看,这似乎func GSSCredentialGetLifetime(_ cred: gss_cred_id_t) -> OM_uint32是我想要使用的,但是我在哪里可以获得类型的变量gss_cred_id_t以传递给该函数?

0 投票
2 回答
303 浏览

css - GWT 在另一个 GSS 文件中覆盖 GSS 样式

由于我的应用程序变大了,我决定我的应用程序的每个“模块”都有自己的资源文件、样式文件和 GSS 文件。此外,例如按钮的样式将在不同的全局 GSS 文件中,因为它更像是一种应用程序样式,通过应用程序使用。

这不是问题,但是当我想做这样的事情时:

在其中一个模块中,它不匹配任何内容。

由于按钮样式(buttonGroup, button, active)和行为(单击时添加“活动”类)是在不同的(全局)GSS 文件中指定的,因此我无法更改“活动”类的样式。

这是一个简化的示例:

样式文件:

模块:

样式文件:

在 GSS 文件中,我尝试使用 @provide 和 @require(没有它就无法编译,因为它会丢失标识符或类)。

然后它编译得很好,但是 buttonGroup、button 甚至活动类都被视为属于 AppStyle,因此使用 style.gss 样式和规则:

在 module.gss 中没有匹配任何东西,因为它可能正在寻找.hash-ModuleStyle-buttonGroup.hash-ModuleStyle-button.hash-ModuleStyle-active类,而按钮上的实际样式是.hash-AppStyle-buttonGroup等等

0 投票
2 回答
16527 浏览

kerberos - linux docker容器中的Windows身份验证

我正在尝试在 kubernetes 下的 linux docker 容器中使用 windows 身份验证。

我正在关注此设置:https ://docs.microsoft.com/en-us/aspnet/core/security/authentication/windowsauth?view=aspnetcore-3.1&tabs=visual-studio#kestrel

应用程序位于 .net core3 中,使用 nuget Microsoft.AspNetCore.Authentication.Negotiate 并在 kestrel 中运行

我添加了

并将我的 devbase 映像设置为

tfs 管道中的构建创建从上面派生的应用程序 docker 映像并添加以下环境变量,还将构建复制到 /app

该应用程序由 run.sh 运行

klist 列出已将 SPN 分配给机器的主体

在 ie 和 firefox 中,我已将 network.negotiate-auth.trusted-uris 添加到我的应用程序中

但是我得到了登录对话框,但没有成功登录

所以问题是:

如何使用 Microsoft.AspNetCore.Authentication.Negotiate 包启用调试日志?

我的假设是这个包不能正确地与 kerberos 通信,也许某些包丢失了,没有运行或什么的。

另请注意,容器和 .net 应用程序已成功连接到域,因为我使用集成安全性连接到有效的数据库。

**** 编辑 > 回答第一部分

要启用日志,应该在 kestrel 中启用日志:在 appsettings.json 中:

在 program.cs 中:

在 Startup.cs 中可以跟踪协商事件:

**** 编辑

同时,根据我在 .net core docker web 应用程序中允许 windows 身份验证的目标,我正在浏览 .net core 和 corefx 的源代码,并将身份验证代码压缩到这个示例控制台应用程序中:

所以我发现该库与 System.Net.NTAuthentication 通信,后者与 System.Net.Security.NegotiateStreamPal通信, 后者与 unix 版本的 Interop.NetSecurityNative.InitSecContext通信

这应该以某种方式触发操作系统中的 GSSAPI

在 dotnet runtime git 中,他们告诉我们 gss-ntlmssp 需要它才能工作,即使在 aspnet 核心文档中无论如何都没有提到它。

https://github.com/dotnet/runtime/issues?utf8=%E2%9C%93&q=gss-ntlmssp

尽管如此,我已经编译了 gss-ntlmssp 并发现如果没有这个库,它会抛出错误“请求了不支持的机制。 ”。对于我的库,它会抛出错误“没有提供凭据,或者凭据不可用或无法访问。 ”,但永远不会访问任何 gss_* 方法。

我通过将日志条目添加到从未发生过的文件中测试了 gss 方法的使用.. fe:

所以.net调用gssapi,而gssapi不调用机制。

我在 centos7 vm、ubuntu windows 子系统和 debian docker 映像(自定义 mcr.microsoft.com/dotnet/core/sdk:3.1-buster)中观察到了相同的行为

所以现在的问题是,我该如何调试 gssapi ?

我假设我当前的 gssapi 由这个库管理:

到目前为止,我已经从 mit 源编译了新的最新 gssapi,发现它向我抛出了错误“请求了不受支持的机制”。因为 gssapi 需要未提供的 gss 解释器。在 centos7 中,我遇到了另一个问题,即 openssl 库正在使用不兼容的共享 kerberos 库,因此 yum 停止工作。

*** 编辑

我发现 gss-ntlmssp 具有标志 GSS_C_MA_NOT_DFLT_MECH 因此失败并显示消息“未提供凭据,或者凭据不可用或无法访问。”。解决方案是构建没有此属性的自定义 gss-ntlmssp,因为我希望将其用作默认身份验证机制。

我的用于检查凭据的示例控制台应用程序现在可以正常工作,我现在将尝试将其放入 docker 容器中。

*** 编辑

我能够在 kubernetes 中成功运行我的 ConsoleApp:

在此处输入图像描述

但是,我现在收到此错误:

*** 编辑现在它在这里失败了:gssntlm_init_sec_context.. gssntlm_acquire_cred.. gssntlm_acquire_cred_from..

get_user_file_creds() 返回错误,因为我没有特定的文件设置,因为我想从广告中验证用户

external_get_creds() 在这里失败:

external_get_creds 尝试使用 winbind 库进行身份验证,显然在凭据缓存中没有用户存在

我设法用 samba 提供的 winbind 库编译它

所以现在的问题是: 如何设置 winbind 库与 AD 通信?

*** 编辑

我曾尝试在 github 上使用 .net 5,有人告诉我 NTLM 在 .net 5 中工作。但是我得到的结果与使用 .net 3.1 相同。

我尝试过的Docker镜像:

在 docker 容器中:

在此处输入图像描述

在此处输入图像描述

我已将自己的调试信息放入 gssntlmssp 库中,并将其放入文件中

在此处输入图像描述

这与我完成 .net core 3.1 的结果完全相同。

wbcCredentialCache (samba lib) 在找不到缓存的凭据时失败

这是我的 krb5.conf:

和 samba 文件的一部分:

在我看来,我更希望拥有 NTLM 然后协商,因为据我所知,浏览器不支持协商。例如,在 Firefox 中,该人必须为协商服务器设置 about:config。不支持通配符,...

尽管如此,我似乎无法使用 ntlm 运行 .net core 5 Web 应用程序,所以我现在将尝试在没有 gssntlmssp 库的情况下使用一些默认的 kerberos 机制来设置它。知道我的 krb5.conf 设置有什么问题吗?

****编辑所以我现在尝试两种不同的方法:

  1. NTLM - 我认为这是更可取的方式,因为我已经看到 ntlm 在 iis express 中验证用户,例如没有对话框,并且不需要在 firefox 中或通过组策略进行任何特殊配置(如果我错了,请纠正我)
  2. 谈判

关于谈判,我设法取得了一些进展。

使用这个 docker 容器,我能够绕过不受支持的机制:

但是现在我有其他问题: Request ticket server HTTP/is.k01.mydomain.com@MYDOMAIN.com kvno 3 found in keytab but not with enctype rc4-hmac

在我看来,keytab 不是 rc4-hmac,这是真的,因为 keytab 是用

正如 .net 文档所说。

我无法禁止使用 rc4-hmac 并且只允许使用较新的编码,所以我要求我的基础设施部门使用旧的 rc4-hmac 编码生成新的密钥表。

这一步让我更进一步,我得到了这个错误:Request ticket server HTTP/is.k01.mydomain.com@MYDOMAIN.COM kvno 4 not found in keytab; keytab 可能已过时*

这很奇怪,因为 keytabs 不能过期,密码没有更改,并且在一小时前生成 keytab 时 100% 有效,并且网络上没有信息 - “kvno 4 not found in keytab”仅获取 4结果在谷歌。

**** 编辑

所以最后我设法让它工作了:)

“kvno 4 not found in keytab”的问题是在 krb5.conf 文件中,我赞成强制 aes 加密我已经添加了行

在我将它们注释掉之后,使用 Negotiate 的身份验证就开始起作用了。我已经用 .net 5 测试了 NTLM,但它仍然无法正常工作。

krb5.conf 文件在 docker 容器中进行协商,如上述构建工作:

所以现在的问题是:有什么方法可以让许多服务运行协商协议而不将每个服务添加到 spn 并手动设置浏览器?

因此,目前每个新的 Web 服务都必须具备:

并且必须在 Internet Explorer > 设置 > 安全 > 网络 > 详细信息 > 域中列出

我认为互联网浏览器设置应该可以通过域组策略以某种方式更新..有人知道怎么做吗?

**** 编辑我已经在域中测试了通配符以在浏览器中进行协商设置,结果如下:

  • :支持 *.k01.mydomain.com
  • :支持 *.k01.mydomain.com
  • firefox(73.0.1(64 位)):不支持 *.k01.mydomain.com - 仅支持完整域,例如 is.k01.mydomain.com
  • 边缘44.18362.449.0 - 不知道为什么,但没有一个 ie 设置被传播.. 不适用于 *.k01.mydomain.com 和 is.k01.mydomain.com

**** 编辑我已经开始使用带有协商的win auth,但是我现在在.net core中遇到了一些问题

IIS express 下的这段代码以 MYDOMAIN\myuser 的形式显示用户:

在 linux 中显示为 myuser@mydomain.com

IIS express下的User.Indentities.First()是WindowsIdentity,我可以列出用户的所有组

Linux下的User.Indentities.First()是没有组信息的ClaimsIdentity

当我尝试在 IIS Express 中使用组限制它时,我得到:

Linux kestrel 与协商:

因此,kestrel 中的协商似乎没有正确列出组。所以我现在要调查,如何在 kestrel 中获取 WindowsIdentity

0 投票
2 回答
791 浏览

java - 将 Kerberos 与委派一起使用时,GSS API 和 SSPI API 有什么区别?

将 Kerberos 与委派一起使用时,GSS API 和 SSPI API 有什么区别?

我有中间件在 Tomcat 服务器中运行 Java 代码。中间件使用 Kerberos (GSS API) 对用户进行身份验证。如果授权标头中不存在 Kerberos 令牌,则中间件返回 401 并附加 WWW-Authenticate:Negotiate 响应标头以初始化 SPNEGO 身份验证。

使用 GSSContext.acceptSecContext 检查传入的服务票证工作正常。

但是,我在委托案中遇到了一些问题。

正如名称“中间件”所示,我的 java 服务必须调用后端服务,使用 Kerberos 身份验证和原始用户主体。为此,我实现了 Kerberos Java GSS API 委托机制。此外,AD 配置正确,并且 tomcat 作为具有特定服务帐户的服务运行。

为了测试这个实现,我编写了一个 Java 测试客户端,利用 GS​​S API 来获取中间件的票证。使用管理员权限运行 Java 测试客户端或使用 kinit -f 获取可转发票证 客户端和中间件组合工作正常:客户端获得票证,中间件接受票证,GSSContext.getCredDelegState() 返回 true,使用 GSSContext.getDelegCred( ) 中间件获取委托凭证,并且后端的登录工作正常。

此外,我使用浏览器和一个小型 C# 测试客户端测试了中间件实现。两者都使用 SPNEGO。在这种情况下,授权也有效。我收到身份验证成功的消息,并且我得到了用户 Principal。使用浏览器或我的 C# 测试客户端,我在中间件中得到以下调试打印:

使用 Java 客户端,我在中间件中得到了这个调试打印:

然而,这里的主要问题是,在 Java 客户端的情况下,委派工作,而在浏览器和 C# 客户端的情况下,委派不起作用。请注意,浏览器已配置为将域列入白名单以进行委派。

附加信息: 我配置了约束委派。带有中间件的 Tomcat 作为具有 AD 服务帐户的服务在 Windows 2016 服务器上运行。

我比较了已发送到中间件的服务票:

Java(可转发),委托工作:10980 字节

C#(委托不起作用):8572 字节

浏览器(委托不起作用):8572 字节

为了比较,我使用不带 -f 选项的 kinit 来获得一个不可转发的 tgt 并测量大小:

Java(不可转发,委托不起作用):8174 字节

顺便说一句,这会产生相同的错误。