不依赖keytool工具,指令生成证书库,而是java代码生成,且导出到证书文件中。直接上代码:

证书工具类:

package com.daobo.security.utilsimport com.daobo.security.bean.Certification
import org.bouncycastle.jce.provider.BouncyCastleProvider
import org.bouncycastle.x509.X509V1CertificateGenerator
import sun.misc.BASE64Decoder
import sun.misc.BASE64Encoder
import java.io.BufferedInputStream
import java.io.FileInputStream
import java.math.BigInteger
import java.security.*
import java.security.Security.addProvider
import java.security.cert.CertificateFactory
import java.security.cert.X509Certificate
import java.security.spec.PKCS8EncodedKeySpec
import java.security.spec.RSAKeyGenParameterSpec
import java.util.*
import javax.security.auth.x500.X500Principalobject CertificationUtil {const val strDnInfo : String = "CN=Test Certificate"/*** @param pair 密钥对* @param startDate 有效期* @param endDate 有效期* @param info 证书信息* @return* @throws InvalidKeyException* @throws NoSuchProviderException* @throws SignatureException*/@Throws(InvalidKeyException::class, NoSuchProviderException::class, SignatureException::class)@SuppressWarnings("deprecation")fun generateV1Certificate(pair: KeyPair, startDate: Date, endDate: Date, info: X500Principal): X509Certificate {// generate the certificateaddProvider(BouncyCastleProvider())val certGen = X509V1CertificateGenerator()certGen.setSerialNumber(BigInteger.valueOf(System.currentTimeMillis()))certGen.setIssuerDN(info)certGen.setNotBefore(startDate)certGen.setNotAfter(endDate)certGen.setSubjectDN(X500Principal(strDnInfo))certGen.setPublicKey(pair.public)// i get error herecertGen.setSignatureAlgorithm("SHA256WithRSAEncryption")return certGen.generateX509Certificate(pair.private, "BC")}/*** * 生成证书文件* @param address 文件保存的路径* @param startDate 有效期* @param endDate 有效期* @param info 证书信息* @param algorithm 算法名称* @param keySize 密钥长度* @param random 随机源* @throws Exception*/@Throws(Exception::class)fun writeFilePkCert(fileName: String, startDate: Date, endDate: Date, info: X500Principal,algorithm: String, keySize: Int, random: SecureRandom, kpGen : Certification) {// create the keysval kp = kpGen.getKeyPair(algorithm, keySize, random)// generate the certificateval cert = generateV1Certificate(kp, startDate, endDate, info)// show some basic validationcert.checkValidity(Date())cert.verify(cert.publicKey)CertFileUtil.getInstance(null).writeToFile(fileName,BASE64Encoder().encode(cert.encoded))//System.out.println("valid certificate generated:"+cert.getPublicKey());}@Throws(Exception::class)fun writeFileSkCert(fileName: String, kpGen : Certification) {//直接将私钥 string 写进到文件CertFileUtil.getInstance(null).writeToFile(fileName,getKeyAsString(kpGen.privateKey!!))//System.out.println("valid certificate generated:"+cert.getPublicKey());}fun getKeyAsString(key: Key): String {val keyBytes = key.encodedval b64 = BASE64Encoder()return b64.encode(keyBytes)}//将String类型转换为PrivateKey类型@Throws(Exception::class)fun getPrivateKeyFromString(key: String, algorithm: String): PrivateKey {val keyFactory = KeyFactory.getInstance(algorithm)val b64 = BASE64Decoder()val privateKeySpec = PKCS8EncodedKeySpec(b64.decodeBuffer(key))return keyFactory.generatePrivate(privateKeySpec)}/*** 获取证书对象* @param address 证书文件路径* @return* @throws Exception*/@Throws(Exception::class)fun getCert(address: String): X509Certificate? {var cert: X509Certificate? = nullval fis = FileInputStream(address)val bis = BufferedInputStream(fis)val cf = CertificateFactory.getInstance("X.509")while (bis.available() > 0) {cert = cf.generateCertificate(fis) as X509Certificate?}return cert}
}

certification Bean:

package com.daobo.security.beanimport java.math.BigInteger
import java.security.*
import java.text.SimpleDateFormat
import java.util.*
import javax.crypto.Cipherclass Certification {var strName : String = ""var strCreateTime : String = ""var strEffectiveTime : String = ""// 私钥:var privateKey: PrivateKey? = null// 公钥:var publicKey: PublicKey? = nullconstructor(name : String, createTime : String, effectiveTime: String){strName = namestrCreateTime = createTimestrEffectiveTime = effectiveTime}constructor(name : String, effectiveTime : String)  {this.strName = namethis.strEffectiveTime = effectiveTimeval format = SimpleDateFormat("yyyy-MM-dd HH:mm:ss")strCreateTime = format.format(Date())}@Throws(GeneralSecurityException::class, NoSuchAlgorithmException::class)fun getKeyPair(algorithm : String, keySize : Int, random : SecureRandom) : KeyPair {val kpGen = KeyPairGenerator.getInstance(algorithm)kpGen.initialize(keySize, random)val keyPair = kpGen.generateKeyPair()this.privateKey = keyPair!!.privatethis.publicKey = keyPair!!.publicreturn keyPair}fun isExpired () : Boolean {var date = SimpleDateFormat("yyyy-MM-dd HH:mm:ss").parse(strEffectiveTime)if(date.before(Date())){return true}return false}// 把私钥导出为字节fun getPrivateKey(): ByteArray {return this.privateKey!!.encoded}// 把公钥导出为字节fun getPublicKey(): ByteArray {return this.publicKey!!.encoded}// 用公钥加密:@Throws(GeneralSecurityException::class)fun encrypt(message: ByteArray): ByteArray {val cipher = Cipher.getInstance("RSA")cipher.init(Cipher.ENCRYPT_MODE, this.publicKey)return cipher.doFinal(message)}// 用私钥解密:@Throws(GeneralSecurityException::class)fun decrypt(input: ByteArray): ByteArray {val cipher = Cipher.getInstance("RSA")cipher.init(Cipher.DECRYPT_MODE, this.privateKey)return cipher.doFinal(input)}
}

写文件的工具类:

package com.daobo.security.utilsimport android.content.Context
import android.os.Environment
import java.io.File
import java.io.FileInputStream
import java.io.FileOutputStream
import java.io.OutputStreamWriter
import java.nio.charset.Charsetclass CertFileUtil {private var applicationContext : Context? = nullvar certRootPath : String = ""companion object {private var instance: CertFileUtil? = nullfun getInstance(context: Context?): CertFileUtil {if (instance == null)instance = CertFileUtil(context)return instance!!}}private constructor (context: Context?) {this.applicationContext = contextLogUtil.init(LogUtil.INFO_LEVEL, "$certRootPath/daobo/log/")val state = Environment.getExternalStorageState()if (Environment.MEDIA_MOUNTED == state) {// 已经挂载了sd卡certRootPath = Environment.getExternalStoragePublicDirectory(Environment.DIRECTORY_DOWNLOADS).absolutePathcertRootPath += "/daobo/cert/"} else {LogUtil.info( "=== 读取 sd 状态不可用!===")}}fun certPKFileName (certName : String) : String {return certName + "_pk.cer"}fun certSKFileName (certName : String) : String {return certName + "_sk.cer"}fun writeToFile(fileName : String, fileData : String) {try {val filePath = File(certRootPath)if (!filePath.exists()) {filePath.mkdirs()}val file = File(filePath, fileName)val fos = FileOutputStream(file)val wr = OutputStreamWriter(fos, Charset.forName("UTF-8"))//wr.write("-----BEGIN CERTIFICATE-----\n")wr.write(fileData)//wr.write("\n-----END CERTIFICATE-----\n")wr.flush()wr.close()//val fos = FileOutputStream(file)//fos.write(fileData)//fos.flush()fos.close()}catch (e:Exception) {e.printStackTrace()}}fun readCertFile(fileName : String) : ByteArray {var filePath = File(certRootPath)var files = filePath.listFiles()if(files == null || files.isEmpty()){//Toast.makeText(context, "文件为空!", Toast.LENGTH_SHORT).show()LogUtil.info("directory=daoboCert=== 文件为空!===")return ByteArray(0)}// 拿到输入流for(f in files){if(fileName == f.name){val input = FileInputStream(files[0])try {// 建立存储器var buf = ByteArray(input.available())// 读取到存储器input.read(buf)return buf} catch (e: Exception) {e.printStackTrace()}finally {// 关闭输入流input.close()}}}return ByteArray(0)}}

说明下,需要依赖一个证书的库:bcprov-jdk15to18-165.jar (bouncycastle)链接,还需要单独去下载一个Android使用的base64编码的工具jar

公钥是有对应的生成cer证书的操作,但是私钥没有,一半经过base64直接写到文件中。公钥证书有几个关键的证书参数:

//获取发布者标识
Principal principalIssuer = x509Certificate.getIssuerDN();
//获取证书的主体标识
Principal principalSubject = x509Certificate.getSubjectDN();
//保存证书的序列号
list.add(x509Certificate.getSerialNumber())

android平台使用java动态生成公私钥,并导出证书文件相关推荐

  1. 【Android 逆向】修改运行中的 Android 进程的内存数据 ( 运行环境搭建 Android 模拟器安装 | 拷贝 Android 平台可执行文件和动态库到 /data/system )

    文章目录 一.运行环境搭建 Android 模拟器安装 二.拷贝 Android 平台可执行文件和动态库到 /data/system 目录下 一.运行环境搭建 Android 模拟器安装 使用低版本的 ...

  2. rsa生成公私钥php,php中rsa生成公私钥和加解密

    php中rsa生成公私钥和加解密 注意:php使用RSA时需要开启openssl扩展 生成公私钥 //创建公私钥 $res = openssl_pkey_new(); //获取私钥 openssl_p ...

  3. Java动态代理生成的对象导出方法

    运行时生成的动态代理对象是可以导出到文件的,方法有两种 在代码中加入System.setProperty("sun.misc.ProxyGenerator.saveGeneratedFile ...

  4. Java web中不同浏览器间导出Excel文件名称乱码问题解决方案

    Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 参考文章: (1)Java web中不同浏览器间导出Excel文件名称乱码问题解决方案 (2)https://www.cnblog ...

  5. 基于NDK编译Android平台的FFmpeg动态库

    需求 FFmpeg在Linux平台(如Ubuntu)上的支持已经比较完善了,如前述文章介绍 http://blog.csdn.net/ericbar/article/details/73702061, ...

  6. Android平台和java平台 DES加密解密互通程序及其不能互通的原因

    为什么80%的码农都做不了架构师?>>>    网上的demo一搜一大堆,但是,基本上都是一知半解(包括我).为什么呢?我在尝试分别在两个平台加密的时候,竟然发现Android DE ...

  7. Android.mk编译java动态库

    一, java动态库程序代码 在Anroid层根目录新建study/java_lib/lib目录, 并创建文件名: com/wq/mytestjar/Test.java package com.wq. ...

  8. 使用Openssl的RSA算法生成公私钥对

    openssl的安装参考这里:openssl的安装指导 非对称加密算法:RSA1024 /2048 /3072 /4096 在需要放置公私钥对所在的文件夹下,按住shift键点击右键,选择" ...

  9. RSA生成公私钥并加解密

    1.RSA简介 RSA是目前使用最广泛的公钥密码体制之一,可以实现非对称加密.它是1977年由罗纳德·李维斯特(Ron Rivest).阿迪·萨莫尔(Adi Shamir)和伦纳德·阿德曼(Leona ...

最新文章

  1. jQuery对下拉框、单选框、多选框的处理
  2. Java数据结构与算法:栈
  3. java 封装优化工具_利用Java注解的简单封装的一次优化
  4. C#中几种常用的集合的用法
  5. python怎样导入scrapy_(Python)在导入的模块scrapy中找不到任何项目
  6. navicat存储过程返回值为空_Excel VBA解读(128):Function过程详解——枯燥的语法...
  7. Lync2013 升级错误总结2 Lync2013 PC和手机客户端登录无法验证
  8. Objective-C中 copy, tetain, assign , readonly , readwrite, nonatomic区别
  9. python 除法 保留2位小数
  10. python提高for循环速度_提升Python运行效率的小窍门
  11. 后台获取用户登录信息
  12. 电脑开机后黑屏的解决办法
  13. “隔代教育的成功之道”-新浪教育专家宋少卫做客西单图书大厦
  14. 使用autoware的calibration_toolkit联合标定双目相机和激光雷达(ZED and VLP-16)
  15. SEO基础:Meta标签之Keywords、Description
  16. 小学数学加减法测试软件,儿童数学练习智能出题系统
  17. MASM32 v11 汇编、连接及运行程序的方法
  18. 结巴分词关键词相似度_中文文本相似度计算工具集
  19. 【Axure视频教程】随机函数random
  20. 传奇服务器 m2自动开启网关,GOM的M2里提示:非法网关连接 添加网关所在机器IP怎么回事?...

热门文章

  1. ubuntu16.04 xfce4的鼠标主题设置为oxygen-red、修改文件夹背景颜色、两处系统字体设置、右键菜单添加压缩解压选项
  2. 【数学基础】拉格朗日对偶
  3. 建立http服务器,基于名称的虚拟主机
  4. 浙江省经信委与新华三签署战略合作协议
  5. 如何实现文件增量同步——算法
  6. OAuth2.0 授权的工作原理
  7. Android自己定义组件系列【4】——自己定义ViewGroup实现双側滑动
  8. 机器学习和深度学习笔记(Matlab语言实现)
  9. Android硬件抽象层(HAL)概要介绍和学习计划
  10. [Everyday Mathematics]20150113