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

Linux GSSAPI-Windows Active Directory互操作性-错误接受上下文:请求中的主体错误,linux,windows,active-directory,kerberos,gssapi,Linux,Windows,Active Directory,Kerberos,Gssapi,我们正在编写同时在Windows和Linux上运行的软件,并计划使用Windows Active Directory进行身份验证。我正在努力解决以下问题,非常感谢您的帮助: 域名:CORP.COMPANY.COM 在一台Linux机器上运行的测试编程:host1.corp.company.com 测试程序来自krb5-1.11.3下载文件中的gss示例 服务器将命名为“gssapitest” 基于“Kerberos 5(krb5 1.0)互操作性分步指南”(来自Microsoft) , 首先在A

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

域名:CORP.COMPANY.COM

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

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

服务器将命名为“gssapitest”

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

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

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

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

ktpass /princ gssapitest/host1.corp.company.com@CORP.COMPANY.COM /mapuser
gssapitest /pass gssapitestpassword /out file2.keytab
将file1.keytab和file2.keytab复制到Linux机器host1,并将它们合并到/etc/krb5.keytab

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

slot KVNO Principal
1 4 host/host1.corp.company.com@CORP.COMPANY.COM
2 5 gssapitest/host1.corp.company.com@CORP.COMPANY.COM
在windows上,为Linux服务器程序注册服务(使用“setspn”),使结果看起来像(2个条目,一个带有映射主机名,另一个带有实际主机名,用于测试目的。如果只有一个条目,无论是哪一个条目,结果都是相同的):

现在,我通过以下方式启动服务器:

gss-server -port 2001 gssapitest
gss-client -port 2001 -user xxxx -pass xxxxpassword host1.corp.company.com
gssapitest "abcd"
并通过以下方式从另一个终端启动客户端:

gss-server -port 2001 gssapitest
gss-client -port 2001 -user xxxx -pass xxxxpassword host1.corp.company.com
gssapitest "abcd"
错误显示在服务器端:

GSS-API error accepting context: Unspecified GSS failure. Minor code may
provide more information
GSS-API error accepting context: Wrong principal in request
可能的原因是什么?我想知道我概述的步骤 都是必需的。哪些是根本不需要的,哪些是不正确的

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

我做了一些测试运行,在我的情况下,问题似乎是:我对映射的用户进行了更改,即gssapitest(在“Active Directory用户和计算机”中,我在运行“帐户”选项卡下取消选中了“此帐户使用DES加密类型”ktpass”,并将输出文件合并到Linux机器中的krb5.keytab。 为了解决这个问题,我在Active Directory中再次检查了“使用DES EncryptiionTypes for this account”,然后转到Linux机器,在启动服务器和客户端程序之前运行“kdestroy”。然后它就工作了。
如果有人遇到类似的问题,您可能需要调查这一可能的原因。谢谢。

在使用setspn时,我不会包括端口号;我希望gssapitest不是gssapitest:2001。 此外,使用gssapitest@host作为对gss客户端的调用中的服务名称

gss-client -user xxx -pass xxx -port 2001 hostname gssapitest@hostname "test message"
您可以使用krb5跟踪来更好地记录正在发生的事情:

export KRB5_TRACE=/tmp/trace.client # and run client

与服务器类似。

当您选中使用DES选项时,将使用非常弱的加密,在最近的MIT Kerberos和Windows中默认禁用。