最近在项目中遇到了读取证书中内容与读取keystore中对应公钥的需求,在此做一下笔记

读取证书

最近项目中遇到后台返回个byte[]数组类型的证书,需要从证书中获取相关内容,先看一下相关代码

BufferedInputStream mStream = null;

try {

String s = new String(cert);//cert为后台返回的byte[]数组

StringBuilder builder = new StringBuilder();

builder.append("-----BEGIN CERTIFICATE-----\n").append(s).append("\n-----END CERTIFICATE-----");

mStream = new BufferedInputStream(new ByteArrayInputStream(builder.toString().getBytes()));

//参数 x.509为证书类型,注意X.509 的 CertificateFactory 返回的证书必须是 java.security.cert.X509Certificate 的实例

CertificateFactory instance = CertificateFactory.getInstance("X.509");

X509Certificate certificate = (X509Certificate) instance.generateCertificate(mStream);

Principal sigAlgName = certificate.getSubjectDN();//主体名

// certificate.getSigAlgName();//签名算法

//certificate.getNotBefore();//有效期

//certificate.getIssuerDN();//签发者

} catch (CertificateException e) {

e.printStackTrace();

} catch (IOException e) {

e.printStackTrace();

}finally{

if(mStream != null ){

mStream.close();

}

}

> 关于CertificateFactory类:

此类定义了用于从相关的编码中生成证书、证书路径 (CertPath) 和证书撤消列表 (CRL) 对象的 CertificateFactory 功能。

> 关于X.509:

X.509是一种基本的证书格式,x509证书由用户公共密钥和用户标识符组成。此外还包括版本号、证书序列号、CA标识符、签名算法标识、签发者名称、证书有效期等信息。

开始时,我是直接将数组转为String进行读取,运行后报读取证书异常,检查代码无果后,打开本地证书与String进行格式比较后发现了关键就是代码中

-----BEGIN CERTIFICATE-----

-----END CERTIFICATE-----

注:这两个字符串分别就是证书的开始标签与结束标签,只有开始与结束拼接上面两个字符串后,才会是个完整的证书(拼接时注意要加换行符,否则还不是个完整的证书)

读取到证书后就可获取需要的信息了。

读取Keystore中公钥

参考资料:传送门

读取Keystore公钥其实与上面类似,通过PackageInfo获取到本地证书后,进行读取,在读取证书时无需拼接以上两个标识符,读取到的就是完整证书。

在获取公钥时,获取到的公钥格式包括一些字符串等信息,需要自己进行截取处理一下。代码如下:

public void getPublicKey() {

String signcode = "";

try {

PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(),

PackageManager.GET_SIGNATURES);

//Signature需注意 该类导包时有两个包 一个为java.signature, 安卓中需要 android.content.pm.Signature包

Signature[] signs = packageInfo.signatures;

Signature sign = signs[0];

signcode = parseSignature(sign.toByteArray());

signcode = signcode.toLowerCase();//如有大写字符 都换为小写

//signcode 便是需要的公钥

} catch (Exception e) {

LogUtill.debug(e.getMessage());

}

}

private String parseSignature(byte[] signature) {

String sign = "";

try {

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");

X509Certificate cert = (X509Certificate) certFactory.generateCertificate(new ByteArrayInputStream(signature));

String pubKey = cert.getPublicKey().toString();

String ss = subString(pubKey);

ss = ss.replace(",", "");

ss = ss.toLowerCase();

int aa = ss.indexOf("modulus");

int bb = ss.indexOf("publicexponent");

sign = ss.substring(aa + 8, bb);

} catch (CertificateException e) {

LogUtill.debug(e.getMessage());

}

return sign;

}

private String subString(String sub) {

Pattern pp = Pattern.compile("\\s*|\t|\r|\n");

Matcher mm = pp.matcher(sub);

return mm.replaceAll("");

}

如有问题,欢迎指正。

Android代码数字证书,有关Android中读取证书相关推荐

  1. Android 系统性能优化(42)---Android代码内存优化建议-Android资源篇

    Android代码内存优化建议-Android资源篇 这篇文章主要介绍在实际Android应用程序的开发中,容易导致内存泄露的一些情况.开发人员如果在进行代码编写之前就有内存泄露方面的基础知识,那么写 ...

  2. Android 代码实现查看SQLite数据库中的表

    前言 以前写PHP的时候,内置了print_r()和var_dump()两个函数用于打印输出任意类型的数据内部结构,现在做Android的开发,发现并没有这种类似的函数,对于数据库的查看很不方便,于是 ...

  3. android 代码浏览,Webview实现android简单的浏览器实例代码

    WebView是Android中一个非常实用的组件,它和Safai.Chrome一样都是基于Webkit网页渲染引擎,可以通过加载HTML数据的方式便捷地展现软件的界面,下面通过本文给大家介绍Webv ...

  4. android 自定义数字软键盘,Android自定义键盘的实现(数字键盘和字母键盘)

    在项目中,产品对于输入方式会有特殊的要求,需要对输入方式增加特定的限制,这就需要采用自定义键盘.本文主要讲述数字键盘和字母键盘的自定义实现. 自定义键盘的实现步骤如下: 自定义CustomKeyboa ...

  5. android 代码设置像素,【Android实例】用设计原则来重构1像素保活代码

    1 类图 在[FJU项目]1像素进程保活(二)中,涉及到的几个类的类图如下所示(仅供参考): 实线箭头:关联 虚线箭头:依赖 重构前UML类图在上图中,OnePixelManager里面有太多的职责, ...

  6. android代码zip怎么用,Android平台实现Zip文件解压缩

    [android]代码库在Android平台中如何实现Zip文件的解压缩功能呢? 因为Android内部已经集成了zlib库,对于英文和非密码的Zip文件解压缩还是比较简单的,下面给大家一个解压缩zi ...

  7. android 代码获取图片信息吗,Android 通过网络获取图片的代码

    Android 通过网络获取图片的代码 主activity package com.netimg; import android.app.Activity; import android.graphi ...

  8. c++读取txt文件中的数字_在Python中读取包中的数据文件的三种方式

    我们知道,写Python代码的时候,如果一个包(package)里面的一个模块要导入另一个模块,那么我们可以使用相对导入: 假设当前代码结构如下图所示: 其中test_1是一个包,在util.py里面 ...

  9. Android 代码实现视频加密,android实现视频的加密和解密(使用AES)

    java语言进行加密解密速度挺慢的..一个6mb左右的文件需要10多秒...等有空了瞅瞅ffmpeg去.. mainactivity.java /** * 视频加密/解密 * * @author ol ...

最新文章

  1. UA MATH567 高维统计IV Lipschitz组合2 Spherical Distribution的Lipschitz函数 Isoperimetric不等式
  2. 组会PPT20200910《大工HPT放电结果错误剖析》
  3. 少年自学python笔记_自学python 笔记
  4. Django,再谈json序列化
  5. 图解再谈ssh port forwarding-ssh隧道技术
  6. LINUX进程内存占用查看
  7. Linux系统安装pgp教程,在Linux系统下安装pgpcommandline
  8. altium designer2020安装教程
  9. 计算机桌面底边出现库如何去掉,桌面图标有蓝底怎么去掉完美全解决方案
  10. 最全的人力资源行业精美报表模板,免费下载啦
  11. 鸿蒙车载智慧屏评测,荣耀智慧屏体验评测:鸿蒙系统的智慧
  12. 抖音矩阵系统,抖音矩阵系统源码,抖音SEO源码独立部署。
  13. 游戏开发进度、状况以及结果的关系(个人感言)
  14. 语音控制,让家居听你的话
  15. python:字符串
  16. Python+Flask框架搭建可视化网站
  17. 新手站长做网站SEO的无奈与煎熬
  18. 联想拯救者R720-15ikbn安装黑苹果Mac Catalina 10.15.3
  19. FastAPI--依赖注入之Depends(8)
  20. 发现一个卖源码的淘宝店:)

热门文章

  1. hbase regions_使用Regions ADF 11g进行Master Detail CRUD操作
  2. 在Java EE应用程序中实现自动重试
  3. 如果今天完成,ESB会是什么样子?
  4. unchecked异常_为什么要在Java中使用Unchecked异常而不是Checked异常
  5. 本地CDI限定词:@Any和@Default
  6. 带有Swagger的Spring Rest API –创建文档
  7. Java状态和策略设计模式之间的差异
  8. 编写自动调试器以在测试执行期间捕获异常
  9. Java中的中介器设计模式-示例教程
  10. 使用Akka处理1000万条消息