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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline yuri-kho  
#1 Оставлено : 24 июля 2012 г. 19:22:54(UTC)
yuri-kho

Статус: Новичок

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

Здравствуйте.

Ситуация такая: у клиента стоит CSP + программка, которая подписывает файл, используя CryptoAPI.
Файл и подпись (detached) передаются на сервер, где установлен JCP.
Вот там-то, на сервере, не удается проверить подпись - всегда false :(


Signature sig = Signature.getInstance(JCP.GOST_SIGN_NAME);
byte[] pkcs7Bin = utils.fromBase64ToBinary(this.signature);
X509Certificate cert = pkcs7.getCertificates()[0];

sig.initVerify(cert);

sig.update(this.crtf_data);
result = sig.verify(pkcs7Bin);


Отправлял на http://notary.cryptopro.ru/ подпись и файл - все нормально.
Offline Евгений Афанасьев  
#2 Оставлено : 24 июля 2012 г. 19:31:14(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Здравствуйте.
Если подпись в формате PKCS7, то можете посмотреть примеры CMS в samples_src.jar. Для совместимости с CSP попробуйте использовать алгоритм "CryptoProSignature".
Offline yuri-kho  
#3 Оставлено : 24 июля 2012 г. 21:27:06(UTC)
yuri-kho

Статус: Новичок

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

Убрал перекодировку в UTF-16LE - заработало. MessageDigest считался неправильно.
Спасибо.
Offline yuri-kho  
#4 Оставлено : 27 июля 2012 г. 13:58:02(UTC)
yuri-kho

Статус: Новичок

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

Еще несколько вопросов.

1. Что-то не понял, как загрузить файлы CRL в JCP. Просветите.
2. В хранилище будут лежать сертификаты разных УЦ. И не будет лежать сертификат, которым подписан документ. Ну, сертификат я из подписи достану, но как в этом случае построить цепочку и проверить ее?
Offline Евгений Афанасьев  
#5 Оставлено : 27 июля 2012 г. 14:56:25(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
1. Для проверки статуса сертификата вам надо будет использовать PKIX - есть пример в samples_src.jar/OCSPValidateCert. Грузить надо будет программно (http) или используя PKIX.
2. В этом же примере (OCSPValidateCert) есть описание, как построить цепочку. http://cryptopro.ru/foru....aspx?g=posts&t=4905 - здесь обсуждалось построение цепочки.

Отредактировано пользователем 27 июля 2012 г. 14:57:01(UTC)  | Причина: Не указана

Offline yuri-kho  
#6 Оставлено : 27 июля 2012 г. 16:38:52(UTC)
yuri-kho

Статус: Новичок

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

В примере сертификаты промежуточные и корневой берутся по заведомо известному алиасу.
В моем случае алиасы неизвестны.
Offline Евгений Афанасьев  
#7 Оставлено : 27 июля 2012 г. 17:31:34(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Получить из хранилища сертификатов алиасы и сертификаты можно так:
Код:

KeyStore store = KeyStore.getInstance("CertStore", "JCP");
store.load(new FileInputStream("/path/to/cert/store"), "store_password".toCharArray());

Enumeration aliases = store.aliases();
while (aliases.hasMoreElements()) {
    String alias = (String) aliases.nextElement();
    System.out.println("Current alias: " + alias);
    if (store.isCertificateEntry(alias)) {
         System.out.println( ((X509Certificate)store.getCertificate(alias)).getSubjectDN() );
    }
}
Offline yuri-kho  
#8 Оставлено : 27 июля 2012 г. 18:00:26(UTC)
yuri-kho

Статус: Новичок

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

Это-то ясно. Как из сертификата однозначно идентифицировать его издателя? Сравнивать cert.issuerDN и store.getCertificate(alias)).getSubjectDN()?
Offline Евгений Афанасьев  
#9 Оставлено : 27 июля 2012 г. 18:11:20(UTC)
Евгений Афанасьев

Статус: Сотрудник

Группы: Участники
Зарегистрирован: 06.12.2008(UTC)
Сообщений: 3,977
Российская Федерация
Откуда: Крипто-Про

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 708 раз в 669 постах
Если в списке все сертфикаты - корневые, то передайте их в trustAnchor при построении цепочки: PKIX сам определит, кто издатель, и построит цепочку.
Offline yuri-kho  
#10 Оставлено : 14 сентября 2012 г. 16:26:10(UTC)
yuri-kho

Статус: Новичок

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

Добрый день.
При проверке подписи выдается ошибка:
com.objsys.asn1j.runtime.Asn1TagMatchFailedException: ASN.1 decode error @ offset 0:

Как я понимаю, скорее всего какие-то данные в сертификате имеют неверный тип.
Прошу помочь разобраться.

Отредактировано пользователем 14 сентября 2012 г. 16:36:49(UTC)  | Причина: Не указана

Вложение(я):
anketa.xls (20kb) загружен 11 раз(а).
anketa.xls.p7s (3kb) загружен 12 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
2 Страницы12>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.