日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > Android >内容正文

Android

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

發布時間:2023/12/2 Android 31 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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("");

}

如有問題,歡迎指正。

總結

以上是生活随笔為你收集整理的Android代码数字证书,有关Android中读取证书的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。