Android - преобразование строки сертификата pkcs12 в объект сертификата x509 для хранилища ключей bks - PullRequest
5 голосов
/ 18 октября 2011

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

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

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

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

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

Затем я пытаюсь создать сертификат X509, используя байт []

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]".

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

1 Ответ

8 голосов
/ 19 октября 2011

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

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