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

标签 java android ssl x509certificate keystore

我正在编写一个 Android 应用程序,它需要对某些 ​​Web 请求进行 SSL 认证。与我在网上看到的有关使用证书文件创建 keystore 文件的选项不同,我必须发出一个初始 Web 请求,该请求以 json 响应中的字符串形式返回证书。

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

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

我正在使用 Base64.deocode 解码此值以将其保存为 byte[]

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

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

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]".

我花了很多时间试图解决一个看起来很简单的问题,但一点运气都没有。任何帮助都会很棒!

最佳答案

万一其他人需要答案...

我能够通过完全剥离 BouncyCaSTLe 库并使用 PKCS12 存储而不是 BKS 来解决这个问题。以下代码段是解决方案。我不再需要生成证书对象,而是在首选项中保存 json 证书字符串,然后获取它并使用它动态生成 keystore 。 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() );

关于java - Android - 将 pkcs12 证书字符串转换为 bks keystore 的 x509 证书对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7799904/

相关文章:

android - greendao listview 实体中的所有数据

php - Apple 推送通知的证书

java - Spring中如何传递多个请求参数?

java - 如何在数独程序 Java 中创建子网格和分隔线?

java - 从我的 java android 应用程序执行 python 脚本

java - 不同结构的Jtable

android - 在 Ice Cream Sandwich 和果冻 bean 中阻止主页按钮

android - InvalidObjectException ("Remote key and the prevKey should not be null") 创建 RemoteMediator android

Java 客户端 SSL 套接字 unknown_ca

ssl - 如何创建受信任的自签名 SSL 证书