Android – convertir la cadena de certificados pkcs12 al objeto de certificado x509 para bks keystore

Estoy escribiendo una aplicación para Android que requiere la certificación SSL para determinadas solicitudes web. A diferencia de las opciones que veo en línea sobre la creación de los archivos de almacén de claves utilizando el archivo cert, tengo que hacer una solicitud web inicial que devuelve el certificado como una cadena en una respuesta json.

Los datos JSON se formatean como los siguientes … (nota: el siguiente certificado se acorta, el "…" no existe en una respuesta real)

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

Estoy descodificando este valor usando Base64.deocode para guardarlo como un byte []

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

Entonces estoy intentando crear un X509Certificate usando el byte []

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

Mi código está fallando en el método generateCertificate () con

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

He pasado una gran cantidad de tiempo tratando de arreglar lo que parece ser un problema simple sin suerte en absoluto. Cualquier ayuda sería increíble!

En caso de que alguien más necesita la respuesta …

Pude trabajar alrededor de esto eliminando totalmente las bibliotecas de BouncyCastle y usando una tienda de PKCS12 en vez de un BKS. El fragmento siguiente es la solución. Ya no tenía que generar un objeto de certificado, sino que estoy guardando la cadena de certificados json en las preferencias, luego la captura y la uso para generar un almacén de claves en el momento. El decodificador base64 no es el decodificador BouncyCastle, es un decodificador estándar personalizado.

 KeyStore keyStore = KeyStore.getInstance( "PKCS12" ); String pkcs12 = UserSession.getCertificate( context ); InputStream sslInputStream = new ByteArrayInputStream( MyBase64Decoder.decode( pkcs12.getBytes() ) ); keyStore.load( sslInputStream, "password".toCharArray() ); 
  • Android manual X509 validación de la cadena de certificados
  • ¿Cómo instalar mediante programación un certificado de CA (para configuración EAP WiFi) en Android?
  • ¿No pudo validar la firma del certificado?
  • ¿Cómo implementar la fijación de hojas / certificados intermedios en Android?
  • Aceptar certificados SSL autofirmados-> donde configurar TrustManager predeterminado
  • Android - ¿Hay una manera de obtener platform.pk8 y platform.x509.pem la ROM firmada con?
  • Agregar información de certificados de servidor a Trust Manager Android mediante programación
  • FlipAndroid es un fan de Google para Android, Todo sobre Android Phones, Android Wear, Android Dev y Aplicaciones para Android Aplicaciones.