2014-01-15 1 views
9

У меня есть следующий код в моем проекте Android, где я подключаюсь к защищенному серверу. Я получаю ошибку синтаксического анализа. [вставлено ниже]. Если кто-то знает об этом исключении, сообщите мне. Заранее спасибо.

Фрагмент кода

CertificateFactory cf = CertificateFactory.getInstance("X.509"); 
InputStream caInput = new BufferedInputStream(new FileInputStream("/storage/emulated/0/cert.p12")); 
Certificate ca; 
try { 
    ca = cf.generateCertificate(caInput); // error at this line 
    System.out.println("ca=" + ((X509Certificate) ca).getSubjectDN()); 
} finally { 
    caInput.close(); 
}  

Ошибка

01-15 17:01:00.107: W/System.err(14932): java.security.cert.CertificateException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: com.android.org.conscrypt.OpenSSLX509CertificateFactory$ParsingException: java.lang.RuntimeException: error:0D0680A8:asn1 encoding routines:ASN1_CHECK_TLEN:wrong tag 
01-15 17:01:00.107: W/System.err(14932): at com.android.org.conscrypt.OpenSSLX509CertificateFactory.engineGenerateCertificate(OpenSSLX509CertificateFactory.java:272) 

01-15 17: 01: 00,107: Вт/System.err (14932): в java.security.cert.CertificateFactory.generateCertificate (CertificateFactory.java:195)

+7

Попробуй поставщик BouncyCastle (т.е. 'GetInstance ("X.509", "КИ");' Кроме того, убедитесь версией Android не слишком стар. См. например, [Android не удалось преобразовать сертификаты файла p12 в x509, правильно преобразовывает их с помощью java] (https://groups.google.com/forum/#!topic/android-developers/HCiHwBKOsrI) – jww

+0

@noloader, ваш комментарий заслуживает ответа. Я сделал именно это (добавление поставщика BC), и он сработал. Вы должны добавить его в качестве ответа, чтобы помочь другим. – fernandohur

+0

1. Кажется, что неправильный формат файла. threre - тип DER и PEM. Попробуйте преобразовать ваш cert.p12 в другой формат ($ x509 -in cert.p12 -inform PEM -out output.crt -outform D ЭР). –

ответ

0

У вас есть две ошибки 1. Похоже, что это неправильный формат файла. Для openssl threre используется тип DER и PEM. Попробуйте преобразовать ваш cert.p12 в другой формат ($ x509 -in cert.p12 -inform PEM -out output.crt -outform DER). 2. Возможно, cert.p12 не является форматом X509, но pkcs12 есть. Узнайте больше об этих форматах и ​​проверьте свои файлы.

+0

Я тоже получаю эту ошибку с файлами pem. Что может быть причиной? –

8

Я изменил эту строку, чтобы включить в "BC" поставщик и ошибка исчезла: getInstance("X.509", "BC")

+0

Работал замечательно для меня. – March3April4

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