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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline Алексей Вдовин  
#1 Оставлено : 6 декабря 2024 г. 9:00:51(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Есть файл с присоединённой подписью (на сколько я понимаю без сертификатов, делал по примеру в CADES).



При проверке ругается
Цитата:
Certificate: sn 2880a4700bab06f8247ae9c20df094812 issued by GeneralNames:\n 4: 1.2.643.100.4=7707329152,E=uc@tax.gov.ru,1.2.643.100.1=1047707030513,C=RU,ST=77 Москва,L=г. Москва,STREET=ул. Неглинная\\, д. 23,O=Федеральная налоговая служба,CN=Федеральная налоговая служба\n not found; error codes: [13] 'Certificate not found in the certificate list


я так понимаю, потому что я в проверку передал null
судя по сообщению хочет сертификат налоговой

Код:

CAdESSignature cadesToVerify = new CAdESSignature(Base64.decode(fileContent),null,null);
            cadesToVerify.verify(null);


что нужно передать, чтобы отработало?


в аналоге на PHP в VerifyCades ничего кроме тела не передавал - всё работало

в примере на сколько я понял если сертификатов нет, то цепочка вот так отдаётся
new HashSet<X509Certificate>(config.getChain())

сеттера не нашел config.setChain() - не понятно что там в конфиге и как получают


получить цепочку из присоединённой подписи, по ней вытащить из хранилища сертификаты и передать в проверку? так что-ли?!

Отредактировано пользователем 6 декабря 2024 г. 9:19:49(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#2 Оставлено : 6 декабря 2024 г. 10:18:43(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 21 раз
Поблагодарили: 712 раз в 673 постах
Здравствуйте.
"в аналоге на PHP в VerifyCades ничего кроме тела не передавал - всё работало" - это другая реализация, возможно, плагин ищет сертификаты в хранилище My.
Т.к. в подписи нет сертификата для ее проверки, то его надо передать извне, например, с помощью verify. Если подпись формируется с помощью CAdESSignature, то добавить любые сертификаты (например, сертификат подписи) можно с помощью CAdESSignature#setCertificateStore (принимает список X509CertificateHolder), а конкретно цепочку - с помощью параметра addCertificateChain одного из методов CAdESSignature#addSigner (цепочка добавится целиком в ходе создания подписи).
Offline Алексей Вдовин  
#3 Оставлено : 6 декабря 2024 г. 11:04:45(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Автор: Евгений Афанасьев Перейти к цитате
Здравствуйте.
"в аналоге на PHP в VerifyCades ничего кроме тела не передавал - всё работало" - это другая реализация, возможно, плагин ищет сертификаты в хранилище My.
Т.к. в подписи нет сертификата для ее проверки, то его надо передать извне, например, с помощью verify. Если подпись формируется с помощью CAdESSignature, то добавить любые сертификаты (например, сертификат подписи) можно с помощью CAdESSignature#setCertificateStore (принимает список X509CertificateHolder), а конкретно цепочку - с помощью параметра addCertificateChain одного из методов CAdESSignature#addSigner (цепочка добавится целиком в ходе создания подписи).


1. Как понять есть ли в подписи сертификаты для её проверки? (файл с присоединённой подписью выше под спойлером)
2. Да подпись формируется с помощью CAdESSignature. Судя по ошибке он "потерял" сертификат ИФНС. Чтобы эту цепочку передать, её сначала нужно получить - как?

судя по коду примера


Код:
        cadesSignature.verify(
            signatureType.equals(SignatureType.ST_CADES_X_LONG_TYPE_1) ||
            signatureType.equals(SignatureType.ST_CADES_A)
            ? Collections.<X509Certificate>emptySet()
            : ( config.getCertificateStore() != null ? null : new HashSet<X509Certificate>(config.getChain()) ),
              ( config.getCRLStore()         != null ? null : config.getCRLs() )
        );


в verify() передаётся цепочка в таком формате new HashSet<X509Certificate>(config.getChain())

а вот как в конфиг она попадает - вопрос, сеттера я не нашел, но нашел метод loadConfiguration()
где на Служебном классе Container2012_256 уже в конец потерял нить :(
Offline Алексей Вдовин  
#4 Оставлено : 6 декабря 2024 г. 11:09:28(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
млин, как то всё очень сложно :(

задача вроде простоая - есть файл с подписью (либо исходный файл + подпись), как получить из неё данные?


по идее "скормить" данные файла методу verify() и всё!

Код:

CAdESSignature cadesToVerify = new CAdESSignature(Base64.decode(fileContent),null,null);
cadesToVerify.verify(null);


и на php именно так и работает

тут же всё не просто почему то
на verify(null) ошибка, какие то сертификаты ещё нужно передавать? где их брать? ...

Отредактировано пользователем 6 декабря 2024 г. 11:14:14(UTC)  | Причина: Не указана

Offline Алексей Вдовин  
#5 Оставлено : 6 декабря 2024 г. 12:16:25(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
подметил ещё такой момент - на PHP я для проверки и получения данных ЭЦП использовал метод VerifyCades() объекта класса CPSignedData

а тут CAdESSignature.verify()

может не то использую? хотя в примере именно так
Offline Алексей Вдовин  
#6 Оставлено : 6 декабря 2024 г. 12:39:44(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
как попонять - ошибка "Certificate not found in the certificate list" говорит о том, что я в коде, что то не так делаю?
или просто снова что-то в cacets надо импортировать?

уже в конец запутался :(
Offline Алексей Вдовин  
#7 Оставлено : 6 декабря 2024 г. 16:30:00(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Код:

// Цепочка сертификатов подписи.
List<X509Certificate> chain = ...;
// Сертификаты для проверки подписи.
Set<X509Certificate> certs = ...;


кусочек из документации, по проверке подписи

никак не могу понять - как их получить?
вот есть файл с присоединённой подписью - на этом всё!

как его проверить и получить данные подписанта?

с ГУИ КриптоПро это всё делается без проблем ...

теперь кусочек из примера, класс Configuration метод loadConfiguration возвращает PrivateKey, но тут же получает и устанавливает цепочку! (no comment)

Код:

		// Получаем цепочку сертификатов. 
		List<Certificate> lChain = 
			Arrays.asList(keyStore.getCertificateChain(alias));
	
		// Конвертируем цепочку в X509Certificate.
		Collection<X509Certificate> xChain = 
			Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));
		
		chain.addAll(xChain);


но и тут мне непонятно - что тут за alias, где его брать ?
в описании параметров метода
"@param alias Идентификатор ключа."
не пойму - о каком ключе речь?

у меня на входе сингатура подписи и всё, какой ключ мне нужно использовать? может у меня вообще никаких ключей нет - мне просто нужно проверить подпись ...

копаем далее - параметром в этот метод передаётся container.getAlias()

Отредактировано пользователем 7 декабря 2024 г. 3:46:18(UTC)  | Причина: Не указана

Offline Алексей Вдовин  
#8 Оставлено : 7 декабря 2024 г. 3:48:26(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
Автор: GTAlex Перейти к цитате
Код:

// Цепочка сертификатов подписи.
List<X509Certificate> chain = ...;
// Сертификаты для проверки подписи.
Set<X509Certificate> certs = ...;


кусочек из документации, по проверке подписи

никак не могу понять - как их получить?
вот есть файл с присоединённой подписью - на этом всё!

как его проверить и получить данные подписанта?

с ГУИ КриптоПро это всё делается без проблем ...

теперь кусочек из примера, класс Configuration метод loadConfiguration возвращает PrivateKey, но тут же получает и устанавливает цепочку! (no comment)

Код:

		// Получаем цепочку сертификатов. 
		List<Certificate> lChain = 
			Arrays.asList(keyStore.getCertificateChain(alias));
	
		// Конвертируем цепочку в X509Certificate.
		Collection<X509Certificate> xChain = 
			Arrays.asList((lChain).toArray(new X509Certificate[lChain.size()]));
		
		chain.addAll(xChain);


но и тут мне непонятно - что тут за alias, где его брать ?
в описании параметров метода
"@param alias Идентификатор ключа."
не пойму - о каком ключе речь?

у меня на входе сингатура подписи и всё, какой ключ мне нужно использовать? может у меня вообще никаких ключей нет - мне просто нужно проверить подпись ...

копаем далее - параметром в этот метод передаётся container.getAlias()


IDE говорит, что это одна из 16 имплементаций Служебного интерфейса ISignatureContainer (млин, это ещё что?!)

ну и если я правильно расковырял, то изначально контейнер задаётся

new Container2012_256()
а алияс соответственно таким геттером
Код:

public String getAlias() {
    return "unixCadesTestCerts2012-Usr256";
}


при подписании я тоже использовал загрузку цепочки
keyStore.getCertificateChain(alias)
но при подписании alias - это айди ключевого контейнера, которым я подписываю документ


а тут то что?!

Отредактировано пользователем 7 декабря 2024 г. 4:24:56(UTC)  | Причина: Не указана

Offline Алексей Вдовин  
#9 Оставлено : 7 декабря 2024 г. 4:43:44(UTC)
Алексей Вдовин

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

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

Сказал(а) «Спасибо»: 77 раз
Поблагодарили: 1 раз в 1 постах
ради интереса - подпихнул те же данные, что и при подписании
верификация прошла

Код:

            KeyStore keyStore = KeyStore.getInstance("RutokenStore", "JCP");
            keyStore.load(null, null);

            // Получаем цепочку сертификатов.
            List<Certificate> lChain = Arrays.asList(keyStore.getCertificate("3e428a1c-af93-451d-a456-9889564df7c1"));

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

            Collection<X509Certificate> chain = new ArrayList<>(List.of());
            chain.addAll(xChain);

            CAdESSignature cadesToVerify = new CAdESSignature(Base64.decode(fileContent),null,null);
            cadesToVerify.verify(new HashSet<>(chain));


ну это же совсем не то, что нужно

а если мне нужно верифицировать сторонний файл с подписью, от которого у меня нет контейнера?!

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