2011-10-17 5 views
5

Я пишу приложение для Android, которое требует сертификации SSL для определенных веб-запросов. В отличие от параметров, которые я вижу в Интернете, о создании файлов хранилища ключей с использованием файла сертификата, я должен сделать начальный веб-запрос, который возвращает сертификат в виде строки в ответ json.Android - преобразование строки сертификата pkcs12 в объект сертификата x509 для bks keystore

данные JSON отформатирован как следующий ... (примечание: следующее свидетельство укорачивается, то «...» не существует в реальной реакции)

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

Я декодировании этого значения используя Base64.deocode, чтобы сохранить его как байт []

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

Тогда я пытаюсь создать 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]". 

Я потратил много времени, пытаясь исправить то, что, кажется, простая задача, не повезло вообще. Любая помощь будет потрясающей!

+0

Можете ли вы вставить ответ JSON, содержащий сертификат здесь? – emboss

+0

«результат»: { "pkcs12": "Ulv6GtdFbjzLeqlkelqwewlq822OrEPdH + zxKUkKGX/eN ... 9801asds3BCfu52dm7JHzPAOqWKaEwIgymlk =" }, – calebisstupid

ответ

8

В случае, если кто-то нуждается в ответ ...

Я был в состоянии работать вокруг этого, полностью зачистки библиотеки BouncyCastle и используя PKCS12 магазин вместо БКС. Следующим фрагментом является решение. Мне больше не приходилось создавать объект сертификата, вместо этого я сохраняю строку сертификата 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()); 

 Смежные вопросы

  • Нет связанных вопросов^_^