Android -将pkcs12证书字符串转换为bks keystore的x509证书对象



我正在编写一个android应用程序,需要对某些web请求进行SSL认证。与我在网上看到的使用证书文件创建密钥存储库文件的选项不同,我必须进行初始web请求,该请求将证书作为json响应中的字符串返回。

JSON数据格式如下…(注意:以下证书是缩短的,实际响应中不存在"…")

"result":{
    "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/eN...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk="
},

我正在使用base64 . decocode解码此值以将其保存为字节[]

ssl.setPkcs12( Base64.decode( jsonObject.optString( "pkcs12" ) ) );

然后我尝试使用字节[]创建一个X509Certificate

CertificateFactory certFactory = CertificateFactory.getInstance( "X.509" );
InputStream in = new ByteArrayInputStream( ssl.getPkcs12() );
X509Certificate cert = (X509Certificate) certFactory.generateCertificate( in );

我的代码在使用

的generatecercertificate()方法上失败
"java.security.cert.CertificateException: org.apache.harmony.security.asn1.ASN1Exception: ASN.1 Sequence: mandatory value is missing at [4]".

我花了大量的时间试图解决一个看起来很简单的问题,但一点运气都没有。任何帮助将是惊人的!

如果有人需要答案…

我能够通过完全剥离BouncyCastle库并使用PKCS12存储而不是BKS来解决这个问题。下面的代码片段是解决方案。我不再需要生成证书对象,而是将json证书字符串保存在首选项中,然后获取它并使用它动态地生成密钥存储库。base64解码器不是BouncyCastle解码器,它是一个自定义的标准解码器。

KeyStore keyStore = KeyStore.getInstance( "PKCS12" );
String pkcs12 = UserSession.getCertificate( context );
InputStream sslInputStream = new ByteArrayInputStream( MyBase64Decoder.decode( pkcs12.getBytes() ) );
keyStore.load( sslInputStream, "password".toCharArray() );

最新更新