Java應用/JDBC/Squirrel在Kerberos認證時報Unable to obtain Principal Name for authentication的解決方法

Java應用/JDBC/Squirrel在Kerberos認證時報Unable to obtain Principal Name for authentication的解決方法

關於如何在Windows本地安裝配置Kerberos客戶端,以及進行相關的配置,網上有很多現成的文檔可以參考,其中: https://841809077.github.io/2018/12/19/Windows本地安裝配置Kerberos客戶端.html 這篇文章比較詳實,可以拿來參考,此外,還有以下兩篇文章也可以作爲補充:

https://www.simba.com/products/Impala/doc/JDBC_InstallGuide/content/jdbc/hi/kerberos.htm
https://justnumbersandthings.com/post/2017-05-06-dbeaver-hive/

但是,當我們按這些文章進行完所有的操作時,在啓動某些基於java的應用時,例如:Squirrel,並不能成功的通過Kerberos認證,而是報:Unable to obtain Principal Name for authentication 錯誤! 這個問題很讓人困惑。

我們要通過Squirrel(實際上任何使用JDBC的數據庫客戶端都是一樣的)來連接受Kerberos保護的Hive數據庫,爲了找出錯誤原因, 我們特意打開了Kerberos相關的debug日誌,具體作法是:打開squirrel-sql.bat文件,在原啓動命令行中添加-Dsun.security.krb5.debug=true, 內容如下:

start "SQuirreL SQL Client" /B "%LOCAL_JAVA%" -Dsun.security.krb5.debug=true -Dsun.awt.nopixfmt=true -Dsun.java2d.noddraw=true -cp %CP% -splash:"%SQUIRREL_SQL_HOME%/icons/splash.jpg" net.sourceforge.squirrel_sql.client.Main %TMP_PARMS%

然後啓動squirrel, 查看日誌文件%USERPROFILE%\.squirrel-sql\logs\squirrel-sql.log,發現如下內容:

2019-07-12 10:44:55,370 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - >>>KinitOptions cache name is C:\Users\YOUR-USERNAME\krb5cc_YOUR-USERNAME
2019-07-12 10:44:55,374 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - >> Acquire default native Credentials
2019-07-12 10:44:55,375 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - Java config name: null
2019-07-12 10:44:55,376 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - Native config name: C:\windows\krb5.ini
2019-07-12 10:44:55,377 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - Loaded from native config
2019-07-12 10:44:55,465 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - default etypes for default_tkt_enctypes: 18.
2019-07-12 10:44:55,467 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - >>> Found no TGT's in LSA

最後一行表明:squirrel並沒有得到TGT,而Native config name: C:\windows\krb5.ini給了我們一個暗示!就是當前的squirrel正在通過JDK自帶的krb工具來讀取keytab文件以及與KDC進行通信,而不是在使用MIT kerberos for windows客戶端,這樣,通過MIT kerberos for windows客戶端的kinit來創建的憑證就不會被使用!這纔是問題的關鍵!至於爲什麼在我的機器上會出現這個問題讓人很費解,因爲團隊中的其他人在安裝了MIT kerberos for windows客戶端之後都沒有出現這個問題!

原因找到之後,解題思路也就出來了,既然無法糾正squirrel或者說java應用程序使用MIT kerberos for windows客戶端,那就還是回到JDK自帶的kinit工具來重新獲取憑證!具體做法說就是:

  1. 先將‪C:\ProgramData\MIT\Kerberos5\krb5.ini複製到C:\Windows,這是 java默認的讀取krb5.ini的地方

  2. 使用JDK的kinit工具重新獲取憑證:

cd %JAVA_HOME%\bin\
kinit.exe -k -t C:\KrbConfig\hive.keytab hive@YOUR-KRB-REALM
New ticket is stored in cache file C:\Users\YOUR-USERNAME\krb5cc_YOUR-USERNAME

hive@YOUR-KRB-REALM是我們要獲取的憑證,我們需要通過JDBC訪問Hive。這個命令行成功之後,會有一個很重要的輸出信息:New ticket is stored in cache file C:\Users\YOUR-USERNAME\krb5cc_YOUR-USERNAME, 這說明JDK的kinit生成的cache文件是放在C:\Users\YOUR-USERNAME\krb5cc_YOUR-USERNAME這個位置上的,這和前面日誌第一行去取的cache文件名完全一致, 也從側面印證了squirrel就是在使用JDK的krb工具在工作。

完成這個操作之後,重啓squirrel就可以連上hive了!squirrel日誌的內容也顯示連接成功:

2019-07-12 10:59:13,635 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - >>> KrbCreds found the default ticket granting ticket in credential cache.

2019-07-12 10:59:13,636 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - >>> Obtained TGT from LSA: Credentials:
2019-07-12 10:59:13,636 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -       client=hive@YOUR-KRB-REALM
2019-07-12 10:59:13,637 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -       server=krbtgt/YOUR-KRB-REALM@YOUR-KRB-REALM
2019-07-12 10:59:13,637 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -     authTime=20190712025341Z
2019-07-12 10:59:13,637 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -      endTime=20190713025341Z
2019-07-12 10:59:13,638 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -    renewTill=null
2019-07-12 10:59:13,638 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -        flags=INITIAL
2019-07-12 10:59:13,638 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - EType (skey)=18
2019-07-12 10:59:13,639 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  -    (tkt key)=18

2019-07-12 10:59:13,642 [pool-3-thread-1] INFO  net.sourceforge.squirrel_sql.fw.util.log.SystemOutToLog  - Found ticket for hive@YOUR-KRB-REALM to go to krbtgt/YOUR-KRB-REALM@YOUR-KRB-REALM expiring on Sat Jul 13 10:53:41 CST 2019
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章