kerberos客户端使用报错

转自:https://www.jianshu.com/p/d79876c6a931

错误现象

报错信息如下,关键是:
“Cannot find any provider supporting AES/CBC/NoPadding”

Caused by: KrbException: Cannot find any provider supporting AES/CBC/NoPadding 
    at sun.security.krb5.internal.crypto.Aes128CtsHmacSha1EType.decrypt(Aes128CtsHmacSha1EType.java:102) 
    at sun.security.krb5.internal.crypto.Aes128CtsHmacSha1EType.decrypt(Aes128CtsHmacSha1EType.java:94) 
    at sun.security.krb5.EncryptedData.decrypt(EncryptedData.java:175) 
    at sun.security.krb5.KrbAsRep.decrypt(KrbAsRep.java:149) 
    at sun.security.krb5.KrbAsRep.decryptUsingKeyTab(KrbAsRep.java:121) 
    at sun.security.krb5.KrbAsReqBuilder.resolve(KrbAsReqBuilder.java:285) 
    at sun.security.krb5.KrbAsReqBuilder.action(KrbAsReqBuilder.java:361)

分析了下,我们首先验证了在集群本身上用这个principal登录是正常的.

登录测试

1、kerberos登陆

    kinit -k -t xxx.keytab username

2、hadoop命令验证

    hadoop dfs -ls

应用配置信息检查

coresitePath= core-site.xml
hdfssitePath= hdfs-site.xml
principal=jiakuan
keytab=jiakuan.keytab
krb5ConfFile=krb5.conf
该有的都有了。

库的检查

又根据同事的建议,添加了两个jar,具体下载地址为jar下载地址
jar的名字为:local_policy.jar 和US_export_policy.jar
是JCE的两个jar包,设置好后仍然有问题。(经测试此步骤可跳过)

问题原因

最终找到的是因为我们一个选项造成的:-Djava.ext.dirs=
我们覆盖了这个选项,导致一些java的功能无法使用。
写上同事的当时的总结:

    生产环境下的启动指令属性-Djava.ext.dirs出现了问题。-Djava.ext.dirs会覆盖java本身的ext设置,java.ext.dirs指定的目录由ExtClassLoader加载器加载,如果程序没有指定该系统属性,那么该加载器默认加载$JAVA_HOME/jre/lib/ext目录下的所有jar文件。但如果你手动指定系统属性且忘了把$JAVA_HOME/jre/lib/ext路径给加上,那么ExtClassLoader就不会把$JAVA_HOME/jre/lib/ext目录下的jar文件给加载上去,这意味着你将失去一些功能,例如java自带的加解密算法实现。

解决办法

-Djava.ext.dirs=./lib:$JAVA_HOME/jre/lib/ext




  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
要在 Python 中实现 Kerberos 认证并避免使用 Kerberos 客户端,需要使用 Python 的 `gssapi` 库。这个库提供了一个 Python 接口,可以使用 GSSAPI 协议进行 Kerberos 认证。 以下是一个简单的 Python 程序,演示如何使用 `gssapi` 库进行 Kerberos 认证: ```python import gssapi # 定义 Kerberos 服务的主机名和服务名 host = "hostname" service = "HTTP" # 创建 GSSAPI 上下文 ctx = gssapi.SecurityContext(usage="initiate") # 初始化上下文并获得初始身份验证令牌 initiate_token = ctx.step() # 向 Kerberos 服务发送身份验证令牌并获得响应 response_token = kerberos_authenticate(host, service, initiate_token) # 处理响应令牌并完成 Kerberos 认证过程 while not ctx.complete: ctx.step(response_token) response_token = kerberos_authenticate(host, service, ctx.step()) # 认证成功,打印客户端身份信息 print("Authenticated as", ctx.initiator_name) ``` 在上面的代码中,`kerberos_authenticate` 函数是用于向 Kerberos 服务发送身份验证令牌并获得响应的自定义函数。这个函数应该调用与 Kerberos 服务器通信的代码,以完成身份验证过程。在函数中,应该使用 `gssapi` 库提供的 `wrap` 和 `unwrap` 方法来对身份验证令牌进行加密和解密。 请注意,这只是一个简单的示例程序,实际的 Kerberos 认证过程可能更加复杂。在实际使用中,您需要根据您的具体需求进行修改和扩展。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值