转自: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自带的加解密算法实现。