【问题标题】:gss_acquire_cred failing with No key table entry foundgss_acquire_cred 失败,未找到密钥表条目
【发布时间】:2017-11-09 12:53:51
【问题描述】:

我正在尝试让 Windows 客户端在加入域的场景中通过 Linux 服务器进行身份验证,我已根据 PBIS/gssappsMSDN GSS/SSPI interop documentation 中提供的文档创建了一个服务主体。更新了 /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);
    if (maj_stat != GSS_S_COMPLETE) {
        display_status("acquiring credentials", maj_stat, min_stat);
        ret = -1;
        goto error;
    }

error:
    (void) gss_release_name(&min_stat, &server_name);

    return ret;
}

我遇到的错误:

GSS-API error acquiring credentials: Unspecified GSS failure.  Minor code may provide more information (851968, 851968, 0x000d0000)

GSS-API error acquiring credentials: No key table entry found matching gss\/dell-vostro-155.domain.in/domain.in@ (39756033, 39756033, 0x025ea101)

传递的service_name"gss/dell-vostro-155.domain.in@domain.in"

我确实在 ktutil/list 中看到了主体

主要是在寻找有关如何进行调试的建议。

编辑:

ktutil: list -e

...

114 2 gss/dell-vostro-155.domain.in@domain.in (des-cbc-crc)

~/work/gss$ hostname -A
dell-vostro-155.domain.in 

这发生在服务器端,它将执行 gss_ASC,

sudo ./gss-server gss/dell-vostro-155.domain.in@domain.in

所以 gss-server 充当主体名称中的“gss”部分。

编辑

krb5.conf 有点大,我想粘贴一些东西,因为它添加了一个 Pastebin 链接krb5.conf

【问题讨论】:

  • 你有一个名为“gss”的服务在Linux服务器上运行吗?我们可以看到您用于更新 /etc/krb5.keytab 中相关 keytab 条目的命令语法吗?我们还能看到 klist 的输出吗?
  • 谢谢@T-Heron,我已经更新了相关细节,如果有意义请告诉我。
  • 当您自己执行 sudo ./gss-server gss/dell-vostro-155.domain.in 时会发生什么? (没有“@domain.in”后缀部分)请用结果更新您的问题。
  • 好的。请将您的 krb5.conf 文件添加到问题中,这是一个非常相关的文件,并且不会那么长。
  • @T-Heron 非常感谢我已经完成了必要的工作。还逐步通过 gss_acquire_cred,在 krb5_gss_acquire_cred_from 我看到传递的名称无效并且 gssalloc 失败。这就是查找失败的原因。我需要进入 gssint_import_internal_name 并了解等效的 KRb5 实现,看看那里发生了什么。

标签: kerberos gssapi


【解决方案1】:

我实际上给 kerberos@mit.edu 发了一封邮件来帮助我,这是他们推荐的。

此代码正在导入 krb5 主体名称,但带有 名称类型,指示基于 GSS 主机的服务名称。 (gss_nt_service 名称拼写更正确 GSS_C_NT_HOSTBASED_SERVICE;我不知道 为什么 Microsoft 文档使用过时的标识符。)

我们可以执行以下操作之一:

  1. 不要导入名称或获取信誉。将 GSS_C_NO_CREDENTIAL 传递给 gss_accept_sec_context() 作为验证者凭据句柄。客户将 能够对密钥表中的任何密钥进行身份验证,因此请确保 keytab 不包含无关条目。这是方法 大多数 Kerberos 开发人员推荐。

  2. 使用 GSS_KRB5_NT_PRINCIPAL_NAME 名称类型而不是 gss_nt_service_name,以便将导入的名称视为 krb5 校长姓名。

  3. 使用基于 GSS 主机的服务名称而不是主体名称。这 基于主机的服务名称可能类似于“gss@dell-vostro-155.domain.com” 对于这个键(虽然“gss”并不是真正的第一个组件,因为它 没有命名服务协议)。使用 MIT krb5 1.10+,您还可以 只需指定第一个组件(在本例中为“gss”),允许 客户端对与第一个组件匹配的任何 keytab 条目进行身份验证。

有关更多信息,请参阅 http://web.mit.edu/kerberos/krb5-latest/doc/appdev/gssapi.html 特别是“名称类型”和“接受者名称”部分。

我使用 GSS_KRB5_NT_PRINCIPAL_NAME 使事情正常进行。

【讨论】:

  • 您使用的名称格式是什么? “gss/dell-vostro-155.domain.in”?
  • 我认为是“gss/dell-vostro-155.domain.in@domain.in”。如果对您不起作用,我会尝试挖掘细节。
猜你喜欢
  • 2021-01-04
  • 1970-01-01
  • 2013-01-04
  • 2018-12-01
  • 2012-10-13
  • 2022-09-22
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多