关于如何在Windows本地安装配置Kerberos客户端,以及进行相关的配置,网上有很多现成的文档可以参考,其中: https://841809077.github.io/2018/12/19/Windows%E6%9C%AC%E5%9C%B0%E5%AE%89%E8%A3%85%E9%85%8D%E7%BD%AEKerberos%E5%AE%A2%E6%88%B7%E7%AB%AF.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)=182019-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

Java应用/JDBC/Squirrel在Kerberos认证时报Unable to obtain Principal Name for authentication的解决方法相关推荐

  1. fastjson转换包含date类型属性的对象时报错com.alibaba.fastjson.JSONException: For input string 解决方法

    fastjson转换包含date类型属性的对象时报错com.alibaba.fastjson.JSONException: For input string 解决方法 pojo里面的date属性上要加 ...

  2. java动态加载jar时,jar中还有第三方jar无法加载的解决方法

    java动态加载jar时,jar中还有第三方jar无法加载的解决方法 当java插件化开发时,即一个java程序在运行的情况下动态加载另一个jar,网上大多数的方法如下 public static v ...

  3. 通过java api操作hdfs(kerberos认证)

    参考代码如下 import java.net.URI; import org.apache.hadoop.conf.Configuration; import org.apache.hadoop.fs ...

  4. java maven程序包不存在_Maven install 报错程序包不存在问题的解决方法

    概述 在mvn clean install时,控制台各种报错,大概有: java:[8,52] 程序包com.xxx不存在 java:[98,27] 找不到符号 符号: 类 XXX 位置: 类XXX ...

  5. 错误/异常:java.io.FileNotFoundException: .\src\db.properties (系统找不到指定的路径。);的解决方法...

    1.异常视图 2.解决方法 与之相关的部分代码: 1 static{ 2 try { 3 //读取db.properties 4 Properties props = new Properties() ...

  6. java+oracle数据库锁,数据库学习之Oracle数据库\记录被另一个用户锁住\解决方法...

    1.先来看看为什么会出锁住: 数据库是一个多用户使用的共享资源.当多个用户并发地存取数据时,在数据库中就会产生多个事务同时存取同一数据的情况.若对并发操作不加控制就可能会读取和存储不正确的数据,破坏数 ...

  7. vue打包时报错 Error: No PostCSS Config found in 的解决方法

    1.报错 vue 项目打包时报了如下错误:Error: No PostCSS Config found in... 2.解决方法: 没有PostCSS配置,因此需要添加一个 postcss.confi ...

  8. Java中double类型精度丢失的问题_double类型数据加减操作精度丢失解决方法_BigDecimal取整

    BigDecimal在用double做入参的时候,二进制无法精确地表示十进制小数,编译器读到字符串"0.0000002"和"1.0000002"之后,必须把它转 ...

  9. java.security.cert.Certificate:No subject alternative DNS name matching api.exmail.qq.com found.解决方法

    工作中使用https请求,本地调用正常,放到服务器端运行失败,报错为java.security.cert.Certificate:No subject alternative DNS name mat ...

最新文章

  1. 简洁送货单打印软件的使用意义
  2. 延迟加载图片并监听图片加载完成
  3. 记录 之 Argparse 中的 可选参数 action 用法
  4. lg空调代码大全解决_LG空调故障代码大全
  5. oracle的insert语句clob,.Net 操作 Oracle CLOB类型字段 INSERT 超长数据
  6. 微信小程序引入npm
  7. Pandas to_datetime
  8. 5 种编程语言可能注定失败!
  9. 环形电流计算公式_圆环电流的电流密度
  10. PHP写一个登录表单,并实现注册+登录功能
  11. 梯度向量与梯度下降法
  12. 吴式太极拳的特点-和基础要求
  13. win10 python3.6安装numpy路径报错_Python3.6的组件numpy的安装 猪悟能
  14. Pointnet++中tf_ops三个.so文件的生成
  15. SwiftUI3 新组件教程之 TimelineView 制作一闪一闪星耀效果(中文教程)
  16. AWGN信道下卷积编码、viterbe译码、分别采用软硬判决,进行误码率分析
  17. 数据库--------代数运算和关系运算
  18. php redis中set、setex、setnx、getSet的区别
  19. 对某班学生成绩排序。从键盘依次输入某班学生的姓名和成绩(一个班级人数最多不超过50人)并保存,然后分别按学生成绩由高到低顺序输出学生姓名和成绩,成绩相同时,则按输入次序排序。
  20. 熊猫关闭服务器微信,熊猫直播开始关闭服务器:App已在苹果应用商店下架

热门文章

  1. vue-企业微信绑定和解绑
  2. oracle ssd加速,评测 | Intel Optane SSD 加速 SmartX 超融合在 Oracle 等场景下的系统性能...
  3. 又一国产开源项目走向世界,百度RPC框架Apache bRPC正式成为ASF顶级项目
  4. 手游传奇代理一个版本大概多少
  5. 基于lucene的案例开发:纵横小说数据库操作
  6. App个人开发者已末路穷途
  7. Scratch与物理·天文:模拟中国嫦娥探月工程,探索月球的背面!
  8. LS1028 使用serdes mode 99BB软件修改方案
  9. 1.16 使用JTAppleCalendar制作漂亮的日历 [iOS开发中的神兵利器]
  10. python并发测试脚本语言_python并发测试脚本