【问题标题】:Android - converting pkcs12 certificate string to x509 certificate object for bks keystoreAndroid - 将 pkcs12 证书字符串转换为 bks 密钥库的 x509 证书对象
【发布时间】:2011-12-09 15:18:38
【问题描述】:

我正在编写一个 Android 应用程序,该应用程序需要对某些 ​​Web 请求进行 SSL 认证。与我在网上看到的关于使用证书文件创建密钥库文件的选项不同,我必须发出初始 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]".

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

【问题讨论】:

  • 您能在此处粘贴包含证书的 JSON 响应吗?
  • "结果":{ "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH+zxKUkKGX/en...9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk=" },

标签: java android ssl x509certificate keystore


【解决方案1】:

如果其他人需要答案...

我能够通过完全剥离 BouncyCastle 库并使用 PKCS12 存储而不是 BKS 来解决此问题。以下 sn -p 是解决方案。我不再需要生成证书对象,而是将 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() );

【讨论】:

    猜你喜欢
    • 2021-03-28
    • 1970-01-01
    • 2012-10-23
    • 1970-01-01
    • 1970-01-01
    • 2020-11-30
    • 2011-06-27
    • 1970-01-01
    相关资源
    最近更新 更多