2015-07-13 2 views
2

Последняя версия Java не поддерживает кривые ECC Brainpool. Когда я прочитал сертификат X509, содержащий EC Curve Brainpool, я получаю исключение.Поддержка Java ECC Brainpool для сертификатов?

Я узнал, что Java не поддерживает сертификаты с кривыми Brainpool. Есть ли способ добавить эту поддержку самостоятельно?

+0

Возможно ли вам отправить сертификат (используя кодировку base64 или PEM?). Возможно, я могу написать ответ, но на этом компьютере нет каких-либо сертификатов, готовых к тестированию. –

+0

Да, это один из них. Я загрузил его здесь (http://pastebin.com/CAMPLMfx) в PEM, потому что он длинный для публикации в качестве комментария. – Opa114

+0

OK, пришлось загрузить поставщика BC и пропустить некоторый ввод, но решение относительно просто. –

ответ

3

Bouncy Castle поддерживает эти кривые. Фокус в том, что Java все еще должна знать о них, чтобы найти их. Таким образом, вы не можете просто добавить поставщика Bouncy Castle и сделать с ним. Вы должны явно использовать CertificateFactory Bouncy Castle.

Если вы просто используете Java CertificateFactory вам будет встречено со следующим исключением (что вы сейчас, вероятно, знакомы с):

Exception in thread "main" java.security.cert.CertificateParsingException: java.io.IOException: Unknown named curve: 1.3.36.3.3.2.8.1.1.7 

Так использовать следующий фрагмент кода/раствор вместо:

Security.addProvider(new BouncyCastleProvider()); 
// explicit BC factory required, knows about curve! 
CertificateFactory fact = CertificateFactory.getInstance("X509", BouncyCastleProvider.PROVIDER_NAME); 
PemReader reader = new PemReader(new FileReader("ecc_certificate.txt")); 
PemObject readPemObject = reader.readPemObject(); 
final byte[] cert = readPemObject.getContent(); 
Certificate generatedCertificate = fact.generateCertificate(new ByteArrayInputStream(cert)); 
System.out.println(generatedCertificate); 

Чтобы получить имя именованной кривой, вам, однако, нужно перейти к специальному коду Bouncy Castle (т. Е. Использовать классы Bouncy напрямую, а не использовать их через JCA):

ECPublicKey publicKey = (ECPublicKey) generatedCertificate.getPublicKey(); 
// Bouncy Castle specific class 
ECNamedCurveSpec params = (ECNamedCurveSpec) publicKey.getParams(); 
System.out.println(params.getName()); 

Почти забыл: вам нужно как провайдер Bouncy Castle , так и файл jar PKIX в вашем пути к классу, чтобы сделать это.

Загрузка неограниченных криптографических файлов для Java никогда не повредит, хотя для этой функции она, вероятно, напрямую не нужна (лучше, чем сожалеть, хотя).

+0

спасибо! Добавление BC Provder в Security и в CertificateFactory действительно работало, как будто я хочу :) Спасибо! еще один вопрос: если я распечатаю key.getParameters(), я не получаю имя кривой (здесь: brainpoolP256r1), со старым исходным кодом Java я получаю имя от других кривых EC, но теперь я получил только : [email protected] - любая идея? – Opa114

+0

ОК исправил это также, но для этого вам нужен специальный код Bouncy. –

+0

еще раз спасибо! работает отлично. – Opa114

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