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 KeyStore: Error al generar certificado autofirmado, cadena de fecha no válida
  • ¿Cómo puedo validar un android.net.http.SsLCertificate con un X509TrustManager?
  • cómo instalar el certificado de CA mediante programación en Android sin interacción del usuario
  • Org.apache.http.client.ClientProtocolException
  • ¿Es este android SSL pinning implementación correcta y por qué este error aparece en el logcat?
  • Agregar varios certificados SSL a Android KeyStore no funciona. (Desde el archivo de recursos)
  • 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.