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)
- Cómo importar certificado SSL autofirmado a Volley en Android 4.1+
- ¿Cómo instalar mediante programación un certificado de CA (para configuración EAP WiFi) en Android?
- Mostrar certificado de Android
- Instalación del certificado autofirmado mediante programación
- Cómo abrir MIME - "application / x-509-server-cert" tipo en Android Moto G?
"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!
- ¿Cómo implementar la fijación de hojas / certificados intermedios en Android?
- Android - ¿Hay una manera de obtener platform.pk8 y platform.x509.pem la ROM firmada con?
- Instalar certificado de usuario a través de ADB
- ¿Cómo generamos un hash SHA256 codificado en base64 de SubjectPublicKeyInfo de un certificado X.509, para la fijación del certificado de Android N?
- Aceptar certificados SSL autofirmados-> donde configurar TrustManager predeterminado
- Android manual X509 validación de la cadena de certificados
- ¿No pudo validar la firma del certificado?
- Instalar certificado X509 mediante programación en mi caso
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() );