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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline MrLebovsky  
#1 Оставлено : 5 марта 2020 г. 7:24:24(UTC)
MrLebovsky

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

Группы: Участники
Зарегистрирован: 05.03.2020(UTC)
Сообщений: 29
Российская Федерация

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

1. Имеется: файл хранилища jks с открытым ключом для проверки ЭЦП.
Если смотреть в дебаггере "keyAlgorithm: GOST3410_2012_256".

2. Так же, имеется некоторый текстовый файл test.txt.
Применяем к нему команду: csptest.exe -sfsign -sign -detached -my Отин -in test.txt -out test.txt.p7s
На выходе получаем файл подписи test.txt.p7s

3. На Java пытаемся проверить валидность подписи следующим образом:
Код:

final byte[] signature = Files.readAllBytes(Paths.get("C:\\signed\\test.txt.p7s"));
final byte[] data = Files.readAllBytes(Paths.get("C:\\signed\\test.txt"));

/*
  Возможно в следующей строке передается неправильный алгоритм?
  Значение "GOST3410_2012_256" передать не получается, ошибка "GOST3410_2012_256 Signature not available"
*/
final Signature sig = Signature.getInstance("GOST3411_2012_256withGOST3410_2012_256");

sig.initVerify(publicKey);
sig.update(data);
return sig.verify(signature); //здесь всегда значение false


Подскажите пожалуйста, в чем может быть проблема?

Отредактировано пользователем 5 марта 2020 г. 7:30:02(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#2 Оставлено : 5 марта 2020 г. 7:35:32(UTC)
Санчир Момолдаев

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

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,215
Российская Федерация

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 285 раз в 265 постах
Добрый день!
вы создали подпись cades-bes,
а проверяете голую RAW подпись
см примеры в samples-source.jar/cades
Техническую поддержку оказываем тут
Наша база знаний
Offline MrLebovsky  
#3 Оставлено : 5 марта 2020 г. 11:01:09(UTC)
MrLebovsky

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

Группы: Участники
Зарегистрирован: 05.03.2020(UTC)
Сообщений: 29
Российская Федерация

Перепробовали множество примеров из samples-source.jar/cades, однако так и не заработало. Задача проверки подписи оказалась не так проста, как казалось.
Файл p7s получен после применения команды:
Цитата:
csptest.exe -sfsign -sign -detached -my Отин -in test.txt -out test.txt.p7s


Ниже приведен MWE, где по итогу возникает следующее исключение:
Цитата:
message-digest attribute value does not match calculated value; error codes: [8] 'Signature is invalid'


Код:
package cryptopro.jcp.example;


import ru.CryptoPro.CAdES.CAdESSignature;
import ru.CryptoPro.CAdES.exception.CAdESException;
import ru.CryptoPro.JCP.tools.Array;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.IOException;
import java.security.KeyStore;
import java.security.KeyStoreException;
import java.security.NoSuchAlgorithmException;
import java.security.UnrecoverableKeyException;
import java.security.cert.Certificate;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;

/**
 * Пример проверки подписи CAdES.
 */
public class VerifyExample {

    private static final char[] STORE_PASS = new char[]{'p', 'a', 's', 's', 'w', 'o', 'r', 'd'};
    private static final String ALIAS = "tp-7f214c34-9bb4-42f1-3h5a-dsbh76e64h5u";

    public static void loadConfiguration(Collection<X509Certificate> chain)
            throws KeyStoreException, NoSuchAlgorithmException, CertificateException,
            IOException {

        KeyStore keyStore = KeyStore.getInstance("JKS");
        final File file = new File("D:/cert/test.jks");
        keyStore.load(new FileInputStream(file), STORE_PASS);

        // Получаем цепочку сертификатов.
        List<Certificate> lChain = Arrays.asList(keyStore.getCertificate(ALIAS));

        // Конвертируем цепочку в X509Certificate.
        Collection<X509Certificate> xChain =
                Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));

        chain.addAll(xChain);

        // сохранение содержимого хранилища в файл с тем же паролем
        keyStore.store(new FileOutputStream(file), STORE_PASS);
    }

    /**
     * @param args
     */
    public static void main(String[] args) {

        try {

            Collection<X509Certificate> chain = new ArrayList<X509Certificate>();
            loadConfiguration(chain);

            // Читаем подпись из файла.
            byte[] cadesCms = Array.readFile("C:\\signed\\test.txt.p7s");

            CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, null);
            cadesSignature.verify(chain);

            Configuration.printSignatureInfo(cadesSignature);
        } catch (IOException e) {
            e.printStackTrace();
        } catch (KeyStoreException e) {
            e.printStackTrace();
        } catch (NoSuchAlgorithmException e) {
            e.printStackTrace();
        } catch (CertificateException e) {
            e.printStackTrace();
        } catch (UnrecoverableKeyException e) {
            e.printStackTrace();
        } catch (CAdESException e) {
            e.printStackTrace();  //To change body of catch statement use File | Settings | File Templates.
        }
    }
}


Если в дебаггере просматривать внутренности подписи и цепочки сертификатов, то У подписи наблюдается значение digest = 1.2.643.7.1.1.2.2, в то же время у сертификата algId = 1.2.643.7.1.1.3.2
Возможно в этом дело?

Отредактировано пользователем 5 марта 2020 г. 13:58:58(UTC)  | Причина: Не указана

Offline MrLebovsky  
#4 Оставлено : 5 марта 2020 г. 12:37:51(UTC)
MrLebovsky

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

Группы: Участники
Зарегистрирован: 05.03.2020(UTC)
Сообщений: 29
Российская Федерация

Так же, хотелось бы задать вопрос: можно ли преобразовать cades-bes в RAW подпись, или так делать не стоит?

Отредактировано пользователем 5 марта 2020 г. 12:52:44(UTC)  | Причина: Не указана

Offline Санчир Момолдаев  
#5 Оставлено : 5 марта 2020 г. 14:54:33(UTC)
Санчир Момолдаев

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

Группы: Модератор, Участники
Зарегистрирован: 03.12.2018(UTC)
Сообщений: 1,215
Российская Федерация

Сказал(а) «Спасибо»: 101 раз
Поблагодарили: 285 раз в 265 постах
CAdESSignature cadesToVerify = new CAdESSignature(signToVerify,data,null);
cadesToVerify.verify(null);

Если у вас detached, передайте также исходные данные.
Если исключений нет при verify, все хорошо.

Raw и cades разные форматы подписи. Cades можно разобрать как asn1 струтуру. Извлечь значение подписи (raw в 64 или 128 байт, затем проверить от исходных данных и сертификата.
Техническую поддержку оказываем тут
Наша база знаний
Offline MrLebovsky  
#6 Оставлено : 6 марта 2020 г. 4:15:04(UTC)
MrLebovsky

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

Группы: Участники
Зарегистрирован: 05.03.2020(UTC)
Сообщений: 29
Российская Федерация

Итак, если signToVerify - файл Cades - подписи (в виде последовательности байт), data - исходный файл, который подписывали (так же в виде последовательности байт),
то имеем следующие варианты:

1.
Код:
new CAdESSignature(signToVerify,data,null).verify(null);


Исключение:
Цитата:
error codes: [13] 'Certificate not found in the certificate list'

Так же непонятно, как этот вариант может работать, если в verify не передавать исходный сертификат с открытым ключом

2.
Код:
new CAdESSignature(signToVerify, data, null).verify(chain);

Исключение
Цитата:
sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate'


3.
Код:
new CAdESSignature(signToVerify, null, null).verify(chain);

Исключение:
Цитата:
org.bouncycastle.cms.CMSSignerDigestMismatchException: message-digest attribute value does not match calculated value

Отредактировано пользователем 6 марта 2020 г. 4:15:43(UTC)  | Причина: Не указана

Offline two_oceans  
#7 Оставлено : 6 марта 2020 г. 4:48:56(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
1) будет работать без передачи сертификата при условии что сертификат включен в файл отсоединенной подписи. У Вас похоже не включен раз выдает ошибку.
2) будет работать если передали сертификат, а в отсоединенной подписи нет сертификата. у Вас похоже не установлены в Джаве или не проверяются по спискам отзыва сертификаты УЦ.
3) будет работать если подпись присоединенная. У Вас отсоединенная, потому исходных данных в подписи нет.
Offline MrLebovsky  
#8 Оставлено : 6 марта 2020 г. 5:16:12(UTC)
MrLebovsky

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

Группы: Участники
Зарегистрирован: 05.03.2020(UTC)
Сообщений: 29
Российская Федерация

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


  • подписать файл с преобразованием:
    csptest.exe -sfsign -sign -add -my Отин -in test.txt -out test.txt.p7s


  • сделать подпись с сертификатом:
    csptest.exe -sfsign -sign -add -detached -my Отин -in test.txt -out test.txt.p7s

  • просто подпись:
    csptest.exe -sfsign -sign -detached -my Отин -in test.txt -out test.txt.p7s


Насколько мы понимаем, 1й вариант из списка - "подпись присоединенная"

Вариант
Код:
new CAdESSignature(cadesCms, null, null).verify(chain)
при этом выдает:
Цитата:
SunCertPathBuilderException: unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate',



Так же, скачали Crl список, проверяем следующим образом:

Код:
X509CRL crl = (X509CRL) CertificateFactory.getInstance("X.509")
                    .generateCRL(new FileInputStream("D:\\guc_gost12.crl"));
HashSet<X509CRL> cRLs = new HashSet<>();
cRLs.add(crl);

 // Проверка подписи
CAdESSignature cadesSignature = new CAdESSignature(cadesCms, null, null);
cadesSignature.verify(chain, cRLs);


При этом, ошибка
Цитата:
message-digest attribute value does not match calculated value; error codes: [8] 'Signature is invalid'



Наиболее часто на текущий момент встречается исключение "PKIX failure: invalid parameters of certificate". Сертификат у нас самоподписанный.
Были мысли, что JVM не доверяет сертификату. После этого сертификат был импортирован в cacerts по пути "jbr\lib\security". Ошибка осталась.

Отредактировано пользователем 6 марта 2020 г. 6:51:42(UTC)  | Причина: Не указана

Offline two_oceans  
#9 Оставлено : 6 марта 2020 г. 6:56:46(UTC)
two_oceans

Статус: Эксперт

Группы: Участники
Зарегистрирован: 05.03.2015(UTC)
Сообщений: 1,602
Российская Федерация
Откуда: Иркутская область

Сказал(а) «Спасибо»: 110 раз
Поблагодарили: 395 раз в 366 постах
Автор: MrLebovsky Перейти к цитате
Насколько мы понимаем, 1й вариант из списка - "подпись присоединенная"
Не поручусь за утилиту у которой нет официальной справки, но похоже что так (нет -detached). Кроме того, там возможно есть сертификат (есть -add). То есть
Код:
new CAdESSignature(cadesCms, null, null).verify(null)
также должно работать - это исключит вариант при котором chain сформирована неверно. Насколько помню в ca ставятся сертификаты промежуточных УЦ и их списки отзыва, а корневой сертификат (или самоподписанный) должен быть в trustAnchors.

Отредактировано пользователем 6 марта 2020 г. 6:59:34(UTC)  | Причина: самоподписанный тоже

Offline MrLebovsky  
#10 Оставлено : 6 марта 2020 г. 8:32:55(UTC)
MrLebovsky

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

Группы: Участники
Зарегистрирован: 05.03.2020(UTC)
Сообщений: 29
Российская Федерация

Автор: two_oceans Перейти к цитате
также должно работать - это исключит вариант при котором chain сформирована неверно. Насколько помню в ca ставятся сертификаты промежуточных УЦ и их списки отзыва, а корневой сертификат (или самоподписанный) должен быть в trustAnchors.


Не работает, ошибка:
Цитата:
unable to find valid certification path to requested target; error codes: [33] 'PKIX failure: invalid parameters of certificate'


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