当前位置: 首页 > backend >正文

【jceks】使用keytool和hadoop credential生成和解析jceks文件(无密码storepass)

build.gradle文件:

plugins {id 'org.jetbrains.kotlin.jvm' version '1.9.23'
}group = 'com.xxx.test'
version = '1.0-SNAPSHOT'repositories {mavenCentral()
}dependencies {implementation("org.apache.hadoop:hadoop-common:3.0.0")testImplementation 'org.jetbrains.kotlin:kotlin-test'
}test {useJUnitPlatform()
}
kotlin {jvmToolchain(8)
}

koltin语言编写。
ranger中的org.apache.ranger.credentialapi.CredentialReader工具类:

import org.apache.commons.lang3.StringUtils
import org.apache.hadoop.conf.Configuration
import org.apache.hadoop.security.alias.CredentialProvider.CredentialEntry
import org.apache.hadoop.security.alias.CredentialProviderFactory
import org.apache.hadoop.security.alias.JavaKeyStoreProvider
import java.util.*object CredentialReader {fun getDecryptedString(CrendentialProviderPath: String?, alias: String?, storeType: String?): String? {var CrendentialProviderPath = CrendentialProviderPathvar alias = aliasvar credential: String? = nulltry {if (CrendentialProviderPath == null || alias == null) {return null}var pass: CharArray? = nullval conf = Configuration()var crendentialProviderPrefixJceks = JavaKeyStoreProvider.SCHEME_NAME + "://file"val crendentialProviderPrefixLocalJceks = "localjceks://file"crendentialProviderPrefixJceks = crendentialProviderPrefixJceks.lowercase(Locale.getDefault())var crendentialProviderPrefixBcfks = "bcfks" + "://file"var crendentialProviderPrefixLocalBcfks = "localbcfks" + "://file"crendentialProviderPrefixBcfks = crendentialProviderPrefixBcfks.lowercase(Locale.getDefault())crendentialProviderPrefixLocalBcfks = crendentialProviderPrefixLocalBcfks.lowercase(Locale.getDefault())CrendentialProviderPath = CrendentialProviderPath.trim { it <= ' ' }alias = alias.trim { it <= ' ' }if (CrendentialProviderPath.lowercase(Locale.getDefault()).startsWith(crendentialProviderPrefixJceks) ||CrendentialProviderPath.lowercase(Locale.getDefault()).startsWith(crendentialProviderPrefixLocalJceks) ||CrendentialProviderPath.lowercase(Locale.getDefault()).startsWith(crendentialProviderPrefixBcfks) ||CrendentialProviderPath.lowercase(Locale.getDefault()).startsWith(crendentialProviderPrefixLocalBcfks)) {conf[CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH] = CrendentialProviderPath} else {if (CrendentialProviderPath.startsWith("/")) {if (StringUtils.equalsIgnoreCase(storeType, "bcfks")) {conf[CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH] = CrendentialProviderPath} else {conf[CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH] =JavaKeyStoreProvider.SCHEME_NAME + "://file" + CrendentialProviderPath}} else {conf[CredentialProviderFactory.CREDENTIAL_PROVIDER_PATH] =JavaKeyStoreProvider.SCHEME_NAME + "://file/" + CrendentialProviderPath}}val providers = CredentialProviderFactory.getProviders(conf)var aliasesList: List<String?> = ArrayList()var credEntry: CredentialEntry? = nullfor (provider in providers) {//System.out.println("Credential Provider :" + provider);aliasesList = provider.aliasesif (aliasesList != null && aliasesList.contains(alias.lowercase(Locale.getDefault()))) {credEntry = nullcredEntry = provider.getCredentialEntry(alias.lowercase(Locale.getDefault()))pass = credEntry.credentialif (pass != null && pass.size > 0) {credential = String(pass)break}}}} catch (ex: Exception) {ex.printStackTrace()credential = null}return credential}
}

测试案例:

import org.junit.jupiter.api.Test
class CredentialReaderTest {val storeType = "jceks"@Testfun testDecrypted() {var path: String = "D:\\projects\\CredientialReader\\src\\test\\resources\\rangeradmin.jceks"path=path.replace("\\","/")val alias: String = "unixauthtruststorealias"val cred = CredentialReader.getDecryptedString(path, alias, storeType)println(cred) // success: somepassword}/*** method: 1, using `keytool` command!* [root@ranger conf]# keytool -importpass -alias ranger -storetype jceks -keystore tmp.jceks* Enter keystore password:* Re-enter new password:* Enter the password to be stored:* Re-enter password:* Enter key password for <ranger>*         (RETURN if same as keystore password):** [root@ranger conf]# keytool -list -v -storetype jceks -keystore tmp.jceks* Enter keystore password:* Keystore type: JCEKS* Keystore provider: SunJCE** Your keystore contains 1 entry** Alias name: ranger* Creation date: Apr 28, 2025* Entry type: SecretKeyEntry*/@Testfun testDecryptedTmp() {// failed : java.io.IOException: Keystore was tampered with, or password was incorrectvar path: String = "D:\\projects\\CredientialReader\\src\\test\\resources\\tmp.jceks"path=path.replace("\\","/")val alias: String = "ranger"val cred = CredentialReader.getDecryptedString(path, alias, storeType)println(cred)}/*** method: 2, using `hadoop credential` command* hadoop credential create -help* hadoop credential create ranger  -value 999 -provider localjceks:///home/someone/hdp.jceks* hdfs hdfs -copyToLocal /home/someone/hdp.jceks .* Note: "localjceks://file" is fixed,"/home/someone/hdp.jceks" is real path* hadoop credential create ranger  -value 999 -provider localjceks://file/home/someone/hdp.jceks* keytool -list -v -storetype jceks -keystore hdp.jceks* 999*/@Testfun testDecryptedHdp() {// success: 999var path: String = "D:\\projects\\CredientialReader\\src\\test\\resources\\hdp.jceks"path=path.replace("\\","/")val alias: String = "ranger"val cred = CredentialReader.getDecryptedString(path, alias, storeType)println(cred)}
}

使用keytool必须指定storepass,即jceks文件的密码。使用hadoop credential create命令生成的jceks的密码是NONE,就是没有密码。

http://www.xdnf.cn/news/2670.html

相关文章:

  • 零基础搭建AI作曲工具:基于Magenta/TensorFlow的交互式音乐生成系统
  • 【计算机视觉】Bayer Pattern与Demosaic算法详解:从传感器原始数据到彩色图像
  • PostgreSQL无法查看表中数据问题排查
  • ARM32静态交叉编译并使用pidstat教程
  • Docker 获取 Python 镜像操作指南
  • 【Web应用服务器_Tomcat】三、Tomcat 性能优化与监控诊断
  • 菱形继承和虚基表
  • go语言八股文(五)
  • 解决Ubuntu20.04重启出现显卡驱动异常的问题(操作记录)
  • k8s基本概念-YAML
  • git 修改用户名和邮箱
  • 【Docker】——在Docker工具上安装创建容器并完成项目部署
  • 线性代数的本质大白话理解
  • 【Linux系统】进程间通信(管道)
  • 8、HTTPD服务--ab压力测试
  • JAVA EE_网络原理_UDP与TCP
  • 二进制、高位低位、位移操作与进制转换全解
  • 国联股份卫多多与北京慧闻科技(集团)签署战略合作协议
  • Kubernetes(k8s)学习笔记(三)--部署 Kubernetes Master
  • 完美解决.NET Framework 4.0 中 System.Drawing 库不支持 WebP 格式的图像处理
  • Android adb 安装应用失败(安装次数限制)
  • 【现代深度学习技术】循环神经网络07:通过时间反向传播
  • 爬虫学习笔记(二)--web请求过程
  • 从代码学习机器学习 - UMAP降维算法 scikit-learn版
  • 【Linux】基于环形队列的生产消费者模型
  • 机器学习第三篇 模型评估(交叉验证)
  • 腾讯云服务器独立ip服务器优点是什么?服务器需要固定ip吗?
  • WebRtc08:WebRtc信令服务器实现
  • 简单分析自动驾驶发展现状与挑战
  • cURL 入门:10 分钟学会用命令行发 HTTP 请求