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();//簽發(fā)者
} 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標識符、簽名算法標識、簽發(fā)者名稱、證書有效期等信息。
開始時,我是直接將數組轉為String進行讀取,運行后報讀取證書異常,檢查代碼無果后,打開本地證書與String進行格式比較后發(fā)現了關鍵就是代碼中
-----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中读取证书的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: arp电脑一次发很多数据包(局域网内大量
- 下一篇: Win7系统电脑开机很慢的优化方法(电脑