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

最近在项目中遇到了读取证书中内容与读取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("");

}

如有问题,欢迎指正。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值