Сгенерировать X509Certificate из байта []?

Есть ли возможность создать java.security.cert.X509Certificate из байта []?


person Alex    schedule 02.08.2010    source источник


Ответы (3)


Конечно.

Объекты сертификата могут быть созданы экземпляром CertificateFactory. — в частности, настроенный для создания сертификатов X509. Это можно создать так:

CertificateFactory certFactory = CertificateFactory.getInstance("X.509");

Затем вам нужно передать ему InputStream, содержащий байты сертификата. Этого можно добиться, заключив массив байтов в ByteArrayInputStream< /а>:

InputStream in = new ByteArrayInputStream(bytes);
X509Certificate cert = (X509Certificate)certFactory.generateCertificate(in);
person Andrzej Doyle    schedule 02.08.2010
comment
Спасибо за Ваш ответ. Но я получаю (java.security.cert.CertificateException) java.security.cert.CertificateException: Не удалось разобрать сертификат: java.io.IOException: Пустой ввод в последней строке. InputStream не пуст, но выдает Exception - person Samir; 12.06.2015
comment
То же самое произошло со мной сначала, потому что я не думал тщательно о том, что я делаю. В моем случае это произошло потому, что я пытался сделать это с байтами из хранилища ключей, а не с сертификатом в хранилище ключей. Извлечение сертификата из хранилища ключей, получение закодированных байтов, а затем работа над ними заставили этот ответ выше работать для меня. - person Trevor Brown; 14.11.2015
comment
В моем случае проблема заключалась в том, что byte[] был закодирован по основанию 64... Сообщение об ошибке было слегка вводящим в заблуждение пустым вводом. Может кому-то когда-нибудь поможет... - person riskop; 09.06.2016
comment
Как насчет байтов [] из защищенного паролем файла JKS? Как нам сгенерировать сертификат из него? - person Shashank; 24.06.2020

Вы можете сделать что-то вроде:

X509Certificate certificate = signature.getKeyInfo().getX509Datas().get(0).getX509Certificates().get(0);

String lexicalXSDBase64Binary = certificate.getValue();
byte[] decoded = DatatypeConverter.parseBase64Binary(lexicalXSDBase64Binary);


CertificateFactory certFactory = CertificateFactory.getInstance("X.509");
Certificate cert = certFactory.generateCertificate(new ByteArrayInputStream(decoded));
person hal9000    schedule 02.04.2018

person    schedule
comment
В вопросе не упоминается base-64, а инициализация stream отсутствует. Этот код выдаст ошибку NullPointerException. - person user207421; 23.03.2016