我们正在编写在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生成keytab(从Windows运行): ktpass / princ host/host1.corp.company.com@CORP.COMPANY.COM / mapuser host1 / pass hostpassword / out file1.keytab
现在在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的内容,如下所示:
插槽KVNO校长 1 4 host/host1.corp.company.com@CORP.COMPANY.COM 2 5 gssapitest/host1.corp.company.com@CORP.COMPANY.COM
在Windows上,为Linux服务器程序注册服务(使用“setspn”),以便 结果看起来像(2个条目,一个带有映射的主机名,另一个带有实际的主机名,用于测试目的。如果只有一个条目,无论哪个条目,结果都相同):
注册的ServicePrincipalNames为 CN = XXXX,CN =用户,DC =公司,DC =公司,DC = COM: gssapitest /主机1:2001 gssapitest / host1.corp.company.com:2001
现在我以这种方式启动服务器:
gss-server -port 2001 gssapitest
以这种方式从另一个终端启动客户端:
gss-client -port 2001 -user xxxx -pass xxxxpassword host1.corp.company.com gssapitest“abcd”
错误显示在服务器端:
接受上下文的GSS-API错误:未指定的GSS失败。次要代码可能 提供更多信息 接受上下文的GSS-API错误:请求中的主体错误
可能的原因是什么?我想知道我概述的步骤是否正确 都是必要的。哪一个根本不需要或不正确。
(注意:我尝试使用本地用户帐户登录Linux CORP.COMPANY.COM中的域帐户,结果显示相同的错误。 另外nslookup显示了正确的IP到主机映射的linux机器。)
答案 0 :(得分:1)
使用setspn时我不会包含端口号;我希望gssapitest不是gssapitest:2001。 另外,在调用gss-client时使用gssapitest @ host作为服务名称;
gss-client -user xxx -pass xxx -port 2001 hostname gssapitest@hostname "test message"
您可以使用krb5跟踪来更好地记录正在发生的事情:
export KRB5_TRACE=/tmp/trace.client # and run client
类似于服务器。
答案 1 :(得分:0)
我做了一些测试运行,在我的情况下,问题似乎是这样:我对我的映射用户进行了更改,即gssapitest(在" Active Directory用户和计算机",我取消选中& #34;在运行" ktpass"之后,为此帐户使用DES加密类型"在"此用户的帐户"标签下)并将输出文件合并到Linux机器中的krb5.keytab。 为了解决这个问题,我检查了这个帐户"使用DES加密类型"再次从Active Directory内部,然后转到Linux机器,运行" kdestroy"在启动我的服务器和客户端程序之前然后它奏效了。 如果有人遇到类似的问题,你可能想看看这个可能的原因。感谢。