java - java Kerberos - unix kinit 有效,java 无效 - 需要额外的预认证
问题描述
我在使用 Kerberos 身份验证进行连接时遇到问题。如果我将 linux kinit 与我的自定义 KRB5.conf(连接到 Windows kerberos AD)一起使用,一切都会顺利进行。
kinit -kVt <MYKEYTAB> <MY_PRINC> -v
keytab specified, forcing -k
Using default cache: /tmp/krb5cc_11574
Using principal: HTTP/<MY_PRINC>@MBID.CZ
Using keytab: <MYKEYTAB>
Authenticated to Kerberos v5
之后,我可以顺利地使用 curl 对注册了我的用户名的 Web 应用程序进行身份验证:
curl -kLv -i --negotiate -u: "https://someserver/someapi/someoperation"
我得到了想要的回应。
但是如果我使用 jdk 中的 java kinit 工具(代码中出现同样的问题),它说我有问题
kinit -J-Dsun.security.krb5.debug=true -J-D"java.security.krb5.conf=<KRB5_CONF_LOCATION>" -t <MYKEYTAB> <MY_PRINC>
问题是:
>>>KRBError:
sTime is Thu Feb 27 07:14:38 CET 2020 1582784078000
suSec is 280585
error code is 25
error Message is Additional pre-authentication required
sname is krbtgt/<DOMAIN>@<DOMAIN>
eData provided.
msgType is 30
>>>Pre-Authentication Data:
PA-DATA type = 19
PA-ETYPE-INFO2 etype = 18, salt = SALT_FROM_PRINC, s2kparams = null
当我尝试对服务器“ https://someserver/someapi/someoperation ”进行身份验证时,这会导致 401 未经授权
两种 kinit 使用完全相同的 keytab、principal 和 krb5.config 文件,只有 unix 有效。
非常感谢!
解决方案
推荐阅读
- html - 我想在标题部分的背景中添加一个视频,但视频是静态的,不会自动播放,这是为什么呢?
- ruby - 如何解决 AWS 问题 route not found Nginx Ruby?
- azure - 如何使用带有 az ad 应用程序的过滤器进行批量删除
- python - 如何在给定单词映射的情况下检查两组语句是否具有传递性和自反性
- java - 如何使用每个循环将二维数组转换为整数
- c# - 如何在协程中暂停生成,直到所有生成的对象都被销毁?
- java - 我可以自动装配适配器类吗?
- c# - 使用隐式运算符(或有更好的方法)时,如何使泛型仍然可观察?
- scala - Spark Structured Streaming 无法将 parquet 数据写入 HDFS
- python - Nuitka 编译具有包含所需文件的子目录的 python 项目