集团网站建设详细策划,jetpack报错 wordpress,公众号平台文章wordpress,觅图网免费素材图库最近在项目中遇到了读取证书中内容与读取keystore中对应公钥的需求#xff0c;在此做一下笔记读取证书最近项目中遇到后台返回个byte[]数组类型的证书#xff0c;需要从证书中获取相关内容#xff0c;先看一下相关代码BufferedInputStream mStream null;try {String s new…最近在项目中遇到了读取证书中内容与读取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.509X.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();}如有问题欢迎指正。