Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2009(UTC) Сообщений: 10
|
Как получить объект Certificate из файла .p7b используя JCP? Отредактировано пользователем 18 декабря 2009 г. 22:27:04(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.10.2008(UTC) Сообщений: 181
|
Certificate[] ru.CryptoPro.JCPRequest.CertChainLoader.loadChain(String loadPath)
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2009(UTC) Сообщений: 10
|
Iva написал:Certificate[] ru.CryptoPro.JCPRequest.CertChainLoader.loadChain(String loadPath) Возникает ошибка: com.objsys.asn1j.runtime.Asn1TagMatchFailedException: ASN.1 decode error @ offset 0: Tag match failed: expected [UNIVERSAL 16], parsed [UNIVERSAL 13] Также непонятно что делать в случае если это не файл, а уже в массив byte[] (в документации отсутвует описание классов данного пакета)
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.10.2008(UTC) Сообщений: 181
|
Прикрепите файл p7b, попытаюсь воспроизвести ошибку. Функции работы с массивом байтов снаружи нет. Добавлю. Файл .p7b это CMS сообщение. Можно попробовать разобрать его. Примеры есть samples_src.jar / CMS_samples. Код:public static Certificate[] loadChain(String loadPath)
throws IOException, Asn1Exception, CertificateException {
final byte[] file = Array.readFile(loadPath);
final Asn1BerDecodeBuffer asnBuf = new Asn1BerDecodeBuffer(file);
final ContentInfo sd = new ContentInfo();
sd.decode(asnBuf);
final Certificate[] certificates =
new Certificate[((SignedData) sd.content).certificates.elements.length];
final Asn1BerEncodeBuffer encBuf = new Asn1BerEncodeBuffer();
for (int i = 0;
i < ((SignedData) sd.content).certificates.elements.length; i++) {
((SignedData) sd.content).certificates.elements[i].encode(encBuf);
final CertificateFactory cf =
CertificateFactory.getInstance("X.509");
final Certificate cert =
cf.generateCertificate(encBuf.getInputStream());
certificates[i] = cert;
}
return certificates;
}
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2009(UTC) Сообщений: 10
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.10.2008(UTC) Сообщений: 181
|
Это не p7b. Это сертификат в base64. Отрежьте -----BEGIN CERTIFICATE----- в начале и -----END CERTIFICATE----- в конце. Раскодировать можно ru.CryptoPro.JCP.tools.Decoder.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2009(UTC) Сообщений: 10
|
Так тоже не работает Вот пример String res final Decoder decoder = new Decoder(); final byte[] cmsDer = decoder.decodeBuffer(res); Certificate[] certs = loadChain(cmsDer); // соответсвует коду public static Certificate[] loadChain(String loadPath) только для byte[] Получаем ошибку com.objsys.asn1j.runtime.Asn1MissingRequiredException: ASN.1 decode error @ offset 4: SEQUENCE or SET is missing a required element. Отредактировано пользователем 23 декабря 2009 г. 17:56:34(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.10.2008(UTC) Сообщений: 181
|
Внутри Base64 нет p7b цепочки, loadChain не нужен вообще. После раскодирования Base64 получите сертификат в DER кодировке. factory = CertificateFactory.getInstance("X509"); cert = factory.generateCertificate(new ByteArrayInputStream(encoded));
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 11.12.2009(UTC) Сообщений: 10
|
Iva написал:Внутри Base64 нет p7b цепочки, loadChain не нужен вообще. После раскодирования Base64 получите сертификат в DER кодировке. factory = CertificateFactory.getInstance("X509"); cert = factory.generateCertificate(new ByteArrayInputStream(encoded));
Так и сделал (для этого же примера) java.security.cert.CertificateException: Could not parse certificate: java.io.EOFException Отредактировано пользователем 22 декабря 2009 г. 23:46:04(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 09.10.2008(UTC) Сообщений: 181
|
У меня получилось. String fileName = "C:\\Tmp\\cert1.p7b"; int beginLength = "-----BEGIN CERTIFICATE-----\r\n".length(); int endLength = "-----END CERTIFICATE-----\r\n".length(); byte[] bytes = Array.readFile(fileName);
String beginEnd = new String(bytes, "UTF-16LE"); String clear = beginEnd.substring(beginLength, beginEnd.length() - endLength);
Decoder decoder = new Decoder(); byte[] encoded = decoder.decodeBuffer(new ByteArrayInputStream(clear.getBytes()));
Certificate[] certs = CertChainLoader.loadChain(encoded);
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close