我正在编写一个Android应用程序,需要对某些Web请求进行SSL认证。与我在网上看到的关于使用cert文件创建密钥库文件的选项不同,我必须创建一个初始Web请求,将证书作为json响应中的字符串返回。
JSON数据的格式如下......(注意:缩短了以下证书,实际响应中不存在“...”)
"result":{
"pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/eN...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk="
},
我使用Base64.deocode解码此值以将其保存为byte []
ssl.setPkcs12( Base64.decode( jsonObject.optString( "pkcs12" ) ) );
然后我尝试使用byte []
创建X509CertificateCertificateFactory 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]".
我花了很多时间试图解决看似简单的问题而根本没有运气。任何帮助都会很棒!
答案 0 :(得分:8)
如果其他人需要答案......
我能够通过完全剥离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() );