Android - 将pkcs12证书字符串转换为x509证书对象以用于bks密钥库

5
我正在编写一个需要某些Web请求的SSL证书的Android应用程序。与我在网上看到的使用cert文件创建密钥库文件的选项不同,我必须进行初始Web请求,该请求返回作为JSON响应中的字符串的证书。
JSON数据的格式如下...(注意:以下证书已缩短,“...”在实际响应中不存在)
"result":{
    "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/eN...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk="
},

我正在使用Base64.decode解码该值,以便将其保存为byte[]。
ssl.setPkcs12( Base64.decode( jsonObject.optString( "pkcs12" ) ) );

接下来我尝试使用byte[]创建X509证书

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

我的代码在调用 generateCertificate() 方法时出现错误:

"java.security.cert.CertificateException: org.apache.harmony.security.asn1.ASN1Exception: ASN.1 Sequence: mandatory value is missing at [4]".

我花了很多时间尝试修复一个看起来很简单的问题,但一直没有成功。任何帮助都将是惊人的!


你能把包含证书的JSON响应粘贴在这里吗? - emboss
"result":{ "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/eN...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk=" }, - calebisstupid
1个回答

9
如果有其他人需要答案...
我能够解决这个问题,方法是完全删除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() );

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接