Android代码数字证书,有关Android中读取证书
最近在項(xiàng)目中遇到了讀取證書(shū)中內(nèi)容與讀取keystore中對(duì)應(yīng)公鑰的需求,在此做一下筆記
讀取證書(shū)
最近項(xiàng)目中遇到后臺(tái)返回個(gè)byte[]數(shù)組類(lèi)型的證書(shū),需要從證書(shū)中獲取相關(guān)內(nèi)容,先看一下相關(guān)代碼
BufferedInputStream mStream = null;
try {
String s = new String(cert);//cert為后臺(tái)返回的byte[]數(shù)組
StringBuilder builder = new StringBuilder();
builder.append("-----BEGIN CERTIFICATE-----\n").append(s).append("\n-----END CERTIFICATE-----");
mStream = new BufferedInputStream(new ByteArrayInputStream(builder.toString().getBytes()));
//參數(shù) x.509為證書(shū)類(lèi)型,注意X.509 的 CertificateFactory 返回的證書(shū)必須是 java.security.cert.X509Certificate 的實(shí)例
CertificateFactory instance = CertificateFactory.getInstance("X.509");
X509Certificate certificate = (X509Certificate) instance.generateCertificate(mStream);
Principal sigAlgName = certificate.getSubjectDN();//主體名
// certificate.getSigAlgName();//簽名算法
//certificate.getNotBefore();//有效期
//certificate.getIssuerDN();//簽發(fā)者
} catch (CertificateException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}finally{
if(mStream != null ){
mStream.close();
}
}
> 關(guān)于CertificateFactory類(lèi):
此類(lèi)定義了用于從相關(guān)的編碼中生成證書(shū)、證書(shū)路徑 (CertPath) 和證書(shū)撤消列表 (CRL) 對(duì)象的 CertificateFactory 功能。
> 關(guān)于X.509:
X.509是一種基本的證書(shū)格式,x509證書(shū)由用戶(hù)公共密鑰和用戶(hù)標(biāo)識(shí)符組成。此外還包括版本號(hào)、證書(shū)序列號(hào)、CA標(biāo)識(shí)符、簽名算法標(biāo)識(shí)、簽發(fā)者名稱(chēng)、證書(shū)有效期等信息。
開(kāi)始時(shí),我是直接將數(shù)組轉(zhuǎn)為String進(jìn)行讀取,運(yùn)行后報(bào)讀取證書(shū)異常,檢查代碼無(wú)果后,打開(kāi)本地證書(shū)與String進(jìn)行格式比較后發(fā)現(xiàn)了關(guān)鍵就是代碼中
-----BEGIN CERTIFICATE-----
-----END CERTIFICATE-----
注:這兩個(gè)字符串分別就是證書(shū)的開(kāi)始標(biāo)簽與結(jié)束標(biāo)簽,只有開(kāi)始與結(jié)束拼接上面兩個(gè)字符串后,才會(huì)是個(gè)完整的證書(shū)(拼接時(shí)注意要加換行符,否則還不是個(gè)完整的證書(shū))
讀取到證書(shū)后就可獲取需要的信息了。
讀取Keystore中公鑰
參考資料:傳送門(mén)
讀取Keystore公鑰其實(shí)與上面類(lèi)似,通過(guò)PackageInfo獲取到本地證書(shū)后,進(jìn)行讀取,在讀取證書(shū)時(shí)無(wú)需拼接以上兩個(gè)標(biāo)識(shí)符,讀取到的就是完整證書(shū)。
在獲取公鑰時(shí),獲取到的公鑰格式包括一些字符串等信息,需要自己進(jìn)行截取處理一下。代碼如下:
public void getPublicKey() {
String signcode = "";
try {
PackageInfo packageInfo = mContext.getPackageManager().getPackageInfo(mContext.getPackageName(),
PackageManager.GET_SIGNATURES);
//Signature需注意 該類(lèi)導(dǎo)包時(shí)有兩個(gè)包 一個(gè)為java.signature, 安卓中需要 android.content.pm.Signature包
Signature[] signs = packageInfo.signatures;
Signature sign = signs[0];
signcode = parseSignature(sign.toByteArray());
signcode = signcode.toLowerCase();//如有大寫(xiě)字符 都換為小寫(xiě)
//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("");
}
如有問(wèn)題,歡迎指正。
總結(jié)
以上是生活随笔為你收集整理的Android代码数字证书,有关Android中读取证书的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: arp电脑一次发很多数据包(局域网内大量
- 下一篇: android 百度开发论坛,Andro