Android/Java中解析.crt证书文件的公钥(public key)
——读取.crt文件证书(获取key)
1.问题描述
1)首先,在做项目时为加强安全性,需要读取 x.crt证书文件获取公钥;此时使用普通的IO流读取文件是行不通的,通过学习,发现用下面的方法可以完美解决,分享出来,希望对大家有帮助。
2)在使用的过程中,遇到了一个bug:
java.security.cert.CertificateException: com.android.org.conscrypt.OpenSSLX509……
bug信息太长,后面的省略了,总结异常关键点:
CertificateException - OpenSSLX509CertificateFactory$ParsingException;
后来发现方法中需要多传一个"BC",就可以解决问题:
eg:CertificateFactory.getInstance("X.509","BC");
2.解决问题
代码如下:
/* 获取公钥key的方法(读取.crt认证文件) */ private static String getKeyFromCRT(){ String key=""; CertificateFactory certificatefactory; X509Certificate Cert; InputStream bais; PublicKey pk; BASE64Encoder bse; try{ //若此处不加参数 "BC" 会报异常:CertificateException - OpenSSLX509CertificateFactory$ParsingException certificatefactory=CertificateFactory.getInstance("X.509","BC"); //读取放在项目中assets文件夹下的.crt文件;你可以读取绝对路径文件下的crt,返回一个InputStream(或其子类)即可。 bais = this.getAssets().open("xxx.crt"); Cert = (X509Certificate) certificatefactory.generateCertificate(bais); pk = Cert.getPublicKey(); bse = new BASE64Encoder(); key=bse.encode(pk.getEncoded()); // Log.e("源key-----"+ Cert.getPublicKey()); // Log.e("加密key-----"+bse.encode(pk.getEncoded())); }catch(Exception e){ e.printStackTrace(); } key=key.replaceAll("\\n", "").trim();//去掉文件中的换行符 return key; }