Вопрос по java, certificate, saml – Чтение сертификата X.509 с Java

9

Я пытаюсь использовать 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.

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

Аккуратно организовано как в----- START CERTIFICATE ----- \n base 64 junk \n ----- END CERTIFICATE ----- Я предполагаю? Maarten Bodewes
Если вы открываете его в текстовом редакторе, он показывает текст или мусор? Maarten Bodewes
спасибо. Должен ли я использовать Bouncy castle, чтобы прочитать его тогда, или есть какой-то другой вариант в Java? а также каков формат по умолчанию (тот, что на моем самозаверяющем сертификате)? Java
Он находится в формате PEM, заголовок, нижний колонтитул и сертификат, закодированный в кодировке 64 DER. Maarten Bodewes
Я открыл мой в текстовом редакторе и его полный мусор, а сторонний - аккуратно распределенный мусор внутри текста сертификата BEGIN и сертификата END, а содержимое внутри этих двух заканчивается символом == (закодировано в base64?) Java

Ваш Ответ

1   ответ
7

Попробуйте напечатать это с помощью 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.

FWIW, легковесный API BouncyCastle дал мне очень похожую ошибку.
У меня была та же ошибка, что и у OP, и в моем случае причиной были лишние пробелы в конце строк.
Не все сертификаты созданы равными, @cmbaron, я видел много ошибок кодирования. Если вы уверены, что ваш код должен работать (спросите список рассылки Bouncy), то это может быть и ваш сертификат.

Похожие вопросы