2012-07-23 4 views
8

Я пытаюсь использовать Java для чтения сертификата, полученного мной от внешней стороны. Код бросает следующее сообщение об ошибке:Чтение сертификата X.509 с помощью Java

java.lang.RuntimeException: java.security.cert.CertificateException: Unable to initialize, java.io.IOException: extra data given to DerValue constructor

Код:

FileInputStream ksfis = new FileInputStream(this.getCertificateFile()); 
ksbufin = new BufferedInputStream(ksfis); 
certificate = (X509Certificate) 
    CertificateFactory.getInstance("X.509").generateCertificate(ksbufin); 

Для того, чтобы убедиться, что проблема была не в коде, я создал самозаверяющий сертификат и использовать его с кодом, и он работал нормально. Я установил оба сертификата в цепочке ключей системы, и оба они действительны. Я использую Mac и Java 1.6.

Любая идея, почему я получаю исключение выше, когда загружаю внешний сертификат? Как вы думаете, он был поврежден во время передачи? Если это так, оно не должно отображаться как действительное в локальной системе, верно?

+0

Если вы открываете его в текстовом редакторе, отображает ли он текст или мусор? –

+0

Я открыла шахту в текстовом редакторе, а ее полный мусор и сторонний - это аккуратно устроенный мусор в тексте BEGIN Certificate и END, а содержимое внутри этих двух концов с == (base64 encoded?) – Java

+0

Аккуратно устроено как в ' ---- СТАРТ СЕРТИФИКАТ ----- \ n база 64 мусор \ n ----- КОНЕЦ СЕРТИФИКАТА ----- 'Я полагаю? –

ответ

6

Попробуйте ввести это с помощью OpenSSL, а затем импортировать результат:

openssl x509 -outform der -in certificate.pem -out certificate.der 

или использовать функциональные возможности Java Bouncy Castle в легком API:

http://www.bouncycastle.org/docs/pkixdocs1.5on/org/bouncycastle/openssl/PEMReader.html

Вы можете кодировать результат снова, а затем использовать по умолчанию CertificateBuilder в Java, чтобы получить сертификат JCE.

+0

FWIW, легкий API-интерфейс BouncyCastle дал мне очень похожую ошибку. – cmbaron

+0

Не все сертификаты созданы равными, @cmbaron, я видел много ошибок в кодировке. Если вы уверены, что ваш код должен работать (обратитесь к списку рассылки Bouncy), он также может быть вашим сертификатом. –

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