Android – преобразование строки сертификата pkcs12 в объект сертификата x509 для bks keystore

Я пишу приложение для 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]". 

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

Если кому-то еще нужен ответ …

Я смог обойти это, полностью уничтожив библиотеки 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() ); 
Intereting Posts
Как использовать ItemAnimator в RecyclerView? Android: пользовательские настройки галереи setSelection () Appium: версия сервера adb (31) не соответствует этому клиенту (36) Отключить внешний сервис android Paho MQTT ServiceConnectionLeaked error Выполнение паузы активности, которая не возобновляется после воссоздания метода Как имитировать убийственную деятельность для сохранения памяти? Заменить пространство на Hyphen Вложенная вкладка ActionBar с пользовательским представлением не отображается правильно Звоните на getLayoutInflater () в местах, где нет активности Java.lang.NullPointerException GoogleMaps V2 Синхронизация с календарем Android-телефона в Календаре Google в Интернете без использования API данных календаря Google. Это возможно? Календарь пользовательского интерфейса в Android Запустите два Android-эмулятора с разными языками Какова взаимосвязь между задачами и задним стеком LoginButton запрашивает разрешение для списка друзей, почему?