2014-09-10 152 views
0

我們正在編寫可在Windows和Linux上運行的軟件,並計劃使用Windows Active Directory進行身份驗證。我下面描述的問題掙扎,希望得到任何幫助非常多:GSSAPI - Windows Active Directory互操作性 - 錯誤接受上下文:請求中的主體錯誤

域名:CORP.COMPANY.COM

測試編程的一個Linux機器上運行:host1.corp.company.com

測試程序來自krb5-1.11.3下載文件的gss-sample。

服務器將被命名爲「gssapitest」。

基於「一步分步指南的Kerberos 5(KRB5 1.0)互操作性(微軟) ,

首先創建一個用戶‘中的AD主機1’表示主機 host1.corp。 。company.com(Linux機器)

使用的ktpass生成密鑰表(從Windows上運行): 的ktpass/PRINC host/[email protected]/mapuser主機1 /傳 hostpassword/out file1.keytab

現在在AD中,創建另一個d 「gssapitest」 omain用戶以表示測試服務器程序,和地圖用戶類似地: 的ktpass/PRINC gssapitest/[email protected]/mapuser gssapitest /通行證gssapitestpassword /出file2.keytab

將file1.keytab和file2.keytab複製到Linux機器host1,並將它們合併到/etc/krb5.keytab中,並將它們合併爲 。

在Linux中, 「ktutil」 表示/etc/krb5.keytab的像以下內容:

槽KVNO主 1 4 host/[email protected] 2 5 gssapitest /[email protected]

在windows上,爲Linux服務器程序註冊服務(使用「setspn」),以便 結果看起來像(2個條目,一個帶有映射的主機名,另一個帶有實際的主機名,用於測試目的。如果只有一個入口,不管哪一個入口,結果是相同的):

爲 CN = XXXX註冊ServicePrincipalNames,CN =用戶,DC =公司,DC =公司,DC = COM: gssapitest /主機1:2001 gssapitest/host1.corp.company.com:2001

現在我啓動服務器是這樣的:

GSS-服務器-port 2001 gssapitest

,並開始從另一個終端客戶這樣說:

GSS-客戶-port 2001 - 用戶XXXX -pass xxxxpassword host1.corp .company.com gssapitest 「ABCD」

錯誤顯示了服務器側:

GSS-API錯誤接受上下文:未指定的GSS故障。次要代碼可能提供 提供更多信息 GSS-API錯誤接受上下文:錯誤的請求主體

這可能是什麼原因造成的?我想知道我所概述的關於 的步驟是否都是必需的。以及哪一個根本不需要或不正確。

(注:我試圖登錄到Linux既具有本地用戶帳戶和 在CORP.COMPANY.COM域帳戶,結果顯示了同樣的錯誤 還使用nslookup顯示正確的IP來承載。映射爲Linux機器)。

回答

0

我做了一些測試運行,在我的情況下,問題似乎是這樣的:我對我的映射用戶進行了更改,即gssapitest(在「Active Directory用戶和計算機」中,未選中「使用DES加密類型運行「ktpass」後,將輸出文件合併到Linux機器上的krb5.keytab中,然後單擊「帳戶」下的該帳戶)。 要解決這個問題,我再次從Active Directory中檢查了「爲此帳戶使用DES加密類型」,然後轉到Linux機器上,在啓動我的服務器和客戶端程序之前運行「kdestroy」。然後它工作。 如果任何人有類似的問題,你可能想看看這個可能的原因。謝謝。

+0

當您檢查USE DES選項時,將使用最近MIT Kerberos和Windows默認禁用的非常弱加密。 – 2014-09-15 20:51:59

1

使用setspn時我不會包含端口號;我希望gssapitest不是gssapitest:2001。 另外,在gss-client的調用中使用gssapitest @ host作爲服務名稱;

gss-client -user xxx -pass xxx -port 2001 hostname [email protected] "test message" 

您可以使用KRB5跟蹤,以獲取有關發生了什麼更好的日誌記錄:

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

類似服務器。