案例一:多線程訪問啓用了Kerberos的服務報錯
情景:有一個採用了Kerberos認證的web服務,使用Jmeter對其進行壓測,在web的日誌裏看到如下報錯
錯誤如下:GSSException: Failure unspecified at GSS-API level (Mechanism level: Request is a replay (34)) Caused by: KrbException: Request is a replay (34)
錯誤原因:當有 多個 客戶端使用 同一principal 同時 向KDC請求認證的時候,Kerberos在 同一時間 能且僅能允許 一個 客戶端通過認證!
這樣就導致其他線程的連接是無法通過認證的,因而拋出上面的異常。所以在有大量需授權的任務的時候,最好每臺機器使用不同的principal,避免多線程使用同一principal請求。
案例二: 證書已過期
錯誤如下:GSSException: Failure unspecified at GSS-API level (Mechanism level: Specified version of key is not available (44))
錯誤原因:當前的keytab證書無效,keytab裏存儲的key已過期,這個通常是因爲在KDC裏重新導出過證書,而在導出證書的時候重新生成了密鑰,需要把新的keytab文件拷貝過來重新kinit,或者導出證書的時候加上 -norandkey
案例三:沒有證書
錯誤如下:GSS initiate failed
錯誤原因:運行程序或請求服務時沒有執行kinit操作,或程序裏沒有使用keytab和principal進行login
案例四:服務請求中沒有證書
錯誤如下:GSS initiate failed [Caused by GSSException: No valid credentials provided (Mechanism level: Failed to find any Kerberos tgt)]; Host Details : local host is: "node2.xxx.com/172.21.0.189"; destination host is: "node1.xxx.com":8020;
錯誤原因:這個跟案例三的錯誤是一樣的,都屬於是沒有證書,但是這裏的更詳細,我們需要學會去看到底是哪出了問題。從Host Details可以看出是node2向node3發起請求的時候認證不通過,那麼說明是node2上沒有證書,其次請求的端口是8020,由此可以看出是請求的HDFS服務,因爲可以很快定位出問題在哪
案例五:時間不同步
錯誤如下:GSSException: ClockSkew
,這個錯誤由於當時沒記下來,只記得這個clockskew的關鍵詞,所以不完整
錯誤原因:從關鍵詞可以看出,是時鐘傾斜了,說明客戶端和服務端的時間是不同步的,Kerberos有一個可允許的時間差,機器時間超過這個設定的時間差就會報錯,把時間進行同步就好了
歡迎閱讀轉載,轉載請註明出處:https://my.oschina.net/u/2539801/blog/1511055