Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline dsergeev  
#1 Оставлено : 18 декабря 2009 г. 21:42:54(UTC)
dsergeev

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2009(UTC)
Сообщений: 10

Как получить объект Certificate из файла .p7b используя JCP?

Отредактировано пользователем 18 декабря 2009 г. 22:27:04(UTC)  | Причина: Не указана

Offline Iva  
#2 Оставлено : 21 декабря 2009 г. 17:05:25(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Certificate[] ru.CryptoPro.JCPRequest.CertChainLoader.loadChain(String loadPath)
Offline dsergeev  
#3 Оставлено : 21 декабря 2009 г. 18:00:12(UTC)
dsergeev

Статус: Участник

Группы: Участники
Зарегистрирован: 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[] (в документации отсутвует описание классов данного пакета)
Offline Iva  
#4 Оставлено : 21 декабря 2009 г. 18:33:34(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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;
}
Offline dsergeev  
#5 Оставлено : 21 декабря 2009 г. 20:38:17(UTC)
dsergeev

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2009(UTC)
Сообщений: 10

Прикрепил
Offline Iva  
#6 Оставлено : 22 декабря 2009 г. 13:07:05(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Это не p7b. Это сертификат в base64.
Отрежьте -----BEGIN CERTIFICATE----- в начале
и -----END CERTIFICATE----- в конце.
Раскодировать можно ru.CryptoPro.JCP.tools.Decoder.
Offline dsergeev  
#7 Оставлено : 22 декабря 2009 г. 16:55:33(UTC)
dsergeev

Статус: Участник

Группы: Участники
Зарегистрирован: 11.12.2009(UTC)
Сообщений: 10

Так тоже не работает

Вот пример
String res Speak to the hand

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)  | Причина: Не указана

Offline Iva  
#8 Оставлено : 22 декабря 2009 г. 17:03:03(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 09.10.2008(UTC)
Сообщений: 181

Внутри Base64 нет p7b цепочки, loadChain не нужен вообще.
После раскодирования Base64 получите сертификат в DER кодировке.
factory = CertificateFactory.getInstance("X509");
cert = factory.generateCertificate(new ByteArrayInputStream(encoded));
Offline dsergeev  
#9 Оставлено : 22 декабря 2009 г. 17:16:13(UTC)
dsergeev

Статус: Участник

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Iva  
#10 Оставлено : 22 декабря 2009 г. 18:26:50(UTC)
Iva

Статус: Активный участник

Группы: Участники
Зарегистрирован: 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);
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.