2011-10-17 19 views
5

Estoy escribiendo una aplicación para Android que requiere certificación SSL para ciertas solicitudes web. A diferencia de las opciones que veo en línea sobre la creación de archivos de almacén de claves utilizando el archivo cert, tengo que hacer una solicitud web inicial que devuelva el certificado como una cadena en una respuesta JSON.Android - convertir cadena de certificado pkcs12 en objeto de certificado x509 para bks keystore

Los datos JSON tiene el formato como el siguiente ... (nota: el siguiente certificado se acorta, el "..." no existe en una respuesta real)

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

estoy decodificación este valor utilizando Base64.deocode para guardarlo como un byte []

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

Entonces estoy tratando de 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!

+0

¿Puedes pegar aquí la respuesta JSON que contiene el certificado? – emboss

+0

"resultado": { "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH + zxKUkKGX/eN ... 9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk =" }, – calebisstupid

Respuesta

8

En caso de que alguien más tiene la respuesta ...

que era capaz de solucionar este problema por completo excluyendo las bibliotecas BouncyCastle y el uso de una tienda PKCS12 en lugar de un BKS. El siguiente fragmento es la solución. Ya no tuve que generar un objeto de certificado, en su lugar estoy guardando la cadena del certificado json en las preferencias, luego la tomé y la usé para generar un almacén de claves sobre la marcha. 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()); 
Cuestiones relacionadas