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

Уведомление

Icon
Error

2 Страницы12>
Опции
К последнему сообщению К первому непрочитанному
Offline sniker  
#1 Оставлено : 8 мая 2014 г. 14:32:27(UTC)
sniker

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

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

Сказал(а) «Спасибо»: 15 раз
Проверка в JCP подписи, созданной в Browser Plugin

Нужно состыковать создание подписи в браузерном плагине и её проверку в JCP.
Для начала попытался подписать и проверитьстроку... Не получилось (

Создание подписи:
Код:

dataToSign = window.btoa('1234567890'); // MTIzNDU2Nzg5MA==
HASH = '4B565582CCC3BF1AEA4F2A535E2E4A96092F58E3';

var oStore = DSP.CreateObject('CAPICOM.Store');
oStore.Open(DSP.CAPICOM_CURRENT_USER_STORE, DSP.CAPICOM_MY_STORE,DSP.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

// Находим сертификат в хранилище по хэшу
var oCertificates = oStore.Certificates.Find(DSP.CAPICOM_CERTIFICATE_FIND_SHA1_HASH, HASH);
if (oCertificates.Count == 0) {
  alert('Certificate not found');
}
var oCertificate = oCertificates.Item(1);
var oSigner = DSP.CreateObject('CAdESCOM.CPSigner');
oSigner.Certificate = oCertificate;

var oSignedData = DSP.CreateObject('CAdESCOM.CadesSignedData');
oSignedData.ContentEncoding = 1;
oSignedData.Content = dataToSign;

try {
  var sSignedMessage = oSignedData.SignCades(oSigner, DSP.CADESCOM_CADES_BES, true); //ЭЦП
} catch (err) {
  alert('Failed to create signature. Error: ' + DSP.GetErrorMessage(err));
}
oStore.Close();

$('input[name="SIGNATURE"]').val(sSignedMessage);



Подпись через POST форму попадают в PHP обработчик, который декодирует её и сохраняет в файл.
Сертификат, на котором создана подпись кладу рядом userсert.cer (так и не понял как в Яве извлечь сертификат прямо из подписи)

Код:

file_put_contents('c:\\usersig.txt',base64_decode($_POST['SIGNATURE']))


Далее в JCP нужно проверить подпись.
Код:

private static final String ALG = JCP.CRYPTOPRO_SIGN_NAME; //"CryptoProSignature"
private static final String filecert = System.getProperty("user.dir")+ DS + "userсert.cer";
private static final String filesig = System.getProperty("user.dir")+ DS + "usersig.txt";
Certificate cert = null;
		
// Получаем сертификат из файла
FileInputStream fis = new FileInputStream(filecert);
BufferedInputStream bis = new BufferedInputStream(fis);
CertificateFactory cf = CertificateFactory.getInstance("X.509");
while (bis.available() > 0) {
	cert = cf.generateCertificate(bis);
}

// Подписанные данные
orig = "1234567890".getBytes();

// Получаем подпись из файла
inFile = new FileInputStream(filesig);
byte[] sig = new byte[inFile.available()];
inFile.read(sig);
inFile.close();

boolean result = verify(ALG, cert.getPublicKey(), orig, sig);
System.out.println(result);


При этом результат стабильно false
Перекодировку учел отсюда - Особенности представления данных для подписи при работе с объектом CadesSignedData

Отредактировано пользователем 8 мая 2014 г. 14:37:21(UTC)  | Причина: Не указана

Вложение(я):
userсert.zip (2kb) загружен 8 раз(а).
usersig.txt (2kb) загружен 10 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline Евгений Афанасьев  
#2 Оставлено : 12 мая 2014 г. 16:18:31(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Здравствуйте.
Попробуйте подпись проверить в csptest, например, или cryptcp.
Также проверьте входные/выходные данные, может, не все читается.

Отредактировано пользователем 12 мая 2014 г. 16:20:17(UTC)  | Причина: Не указана

Offline sniker  
#3 Оставлено : 12 мая 2014 г. 16:59:41(UTC)
sniker

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

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

Сказал(а) «Спасибо»: 15 раз
Автор: afev Перейти к цитате
Здравствуйте.
Попробуйте подпись проверить в csptest, например, или cryptcp.
Также проверьте входные/выходные данные, может, не все читается.


В cryptcp проверял уже. Подпись, которую генерирует плагин корректная.
Причем как бинарный вариант корректно проверяется
Код:
file_put_contents('c:\\usersig.txt',base64_decode($_POST['SIGNATURE']))

, так и base64 вариант (на всяки случай пробовал)
Код:
file_put_contents('c:\\usersig64.txt',$_POST['SIGNATURE'])


Получается что плагин выходные данные (файл usersig.txt) генерирует правильно.

Для проверки вх./вых. данных в JCP добавил вывод в файл:
Код:

// Получаем подпись из файла
inFile = new FileInputStream("usersig.txt");
byte[] sig = new byte[inFile.available()];
inFile.read(sig);
inFile.close();

//Сохраняем её в файл еще раз
FileOutputStream outFile = new FileOutputStream("out.txt");
outFile.write(sig);
outFile.close();


usersig.txt и out.txt получаются идентичными и по длине и по содержимому

В JCP передавал как бинарный вариант подписи, так и base64.
Причем во время выполнения ошибок не выдает никаких. Просто false и всё.
Поэтому бинарный вариант тут нужен, думаю. Иначе бы "ругался" на невозможность из base64 декодировать.
Offline Евгений Афанасьев  
#4 Оставлено : 12 мая 2014 г. 17:23:52(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Сама подпись в base64? Если да, то надо декодировать (невидно, что в verify()), если нет - может, проблема в том, что как txt сохраняется бинарная подпись?

Отредактировано пользователем 12 мая 2014 г. 17:25:06(UTC)  | Причина: Не указана

Offline sniker  
#5 Оставлено : 13 мая 2014 г. 0:29:41(UTC)
sniker

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

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

Сказал(а) «Спасибо»: 15 раз
Автор: afev Перейти к цитате
Сама подпись в base64? Если да, то надо декодировать (невидно, что в verify()), если нет - может, проблема в том, что как txt сохраняется бинарная подпись?


Верно. не заметил. вот код verify()
Код:

	 /**
	  * Проверка подписи на открытом ключе
	  *
	  * @param alghorithmName алгоритм подписи
	  * @param publicKey открытый ключ
	  * @param data подписываемые данные
	  * @param signature подпись
	  * @return true - верна, false - не верна
	  * @throws Exception /
	  */
	 public static boolean verify(String alghorithmName, PublicKey publicKey,
	                              byte[] data, byte[] signature) throws Exception {
	     final Signature sig = Signature.getInstance(alghorithmName);
	     sig.initVerify(publicKey);
	     sig.update(data);
	     return sig.verify(signature);
	 }


Функция verify, кстати, полностью из примера из документации по JCP (отсюда samples/samples_src.jar/userSamples/SignAndVerify.java)

Подпись используется в бинарном виде:
Плагин выдаёт её в base64, затем php скрипт декодирует в бинарник.
(первый пост)
Код:
file_put_contents('c:\\usersig.txt',base64_decode($_POST['SIGNATURE']))


Только вот не понял причем тут расширение .txt...
Насколько я знаю, ни file_put_content() в php, ни FileInputStream() в java никак не изменяют своего поведения в зависимости от расширения файла.

В любом случае, cryptcp нормально валидировал подпись из плагина.
Исправил расширение файла с подписью и в JCP исправил:
Код:
private static final String filesig = System.getProperty("user.dir")+ DS + "usersig.sig";

Опять тоже самое - false

Вот интересно, вообще с проверкой в JCP подписи, созданной не в JCP, сталкивася кто-нибудь...Think
Offline Евгений Афанасьев  
#6 Оставлено : 13 мая 2014 г. 1:27:07(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
У вас формируется CAdES-BES подпись, как я понял, а проверяется почему-то как plain - то есть "голая" подпись (из 64 байтов). Вам следует смотреть примеры из пакета CMS_samples либо CAdES.
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
sniker оставлено 13.05.2014(UTC)
Offline sniker  
#7 Оставлено : 14 мая 2014 г. 12:35:36(UTC)
sniker

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

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

Сказал(а) «Спасибо»: 15 раз
Спасибо.
Видимо в этом проблема.
Не разобрался с первого раза в документации к JCP.

Только не могу скомпилировать CMSVerify

eclipse не может импортировать com.objsys.asn1j.runtime.Asn1BerDecodeBuffer

Где её можно взять?
У меня только JCP + JRE установлено.

UPDATE:

РЕШЕНО! )
Нашёл её в JCP.
Почему-то eclipse не включил её в составе jre

Отредактировано пользователем 14 мая 2014 г. 13:08:05(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#8 Оставлено : 14 мая 2014 г. 12:44:37(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
В дистрибутиве jcp есть библиотека asn1rt.jar (она должна копироваться в jre при установке jcp).
thanks 1 пользователь поблагодарил Евгений Афанасьев за этот пост.
sniker оставлено 14.05.2014(UTC)
Offline Малыгин Н.  
#9 Оставлено : 25 октября 2018 г. 17:45:25(UTC)
Малыгин Н.

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

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

Сказал(а) «Спасибо»: 6 раз
Возникла схожая проблема.
Есть файл с данными и конверт с подписью этого файла. Подпись сформирована с помощью browser plugin. На сайте https://www.gosuslugi.ru/pgu/eds/order подпись проходит проверку успешно, в КриптоАрме тоже.
В JCP следующая ситуация:
проверка по примеру из пакета CAdES проходит, если включить онлайновую проверку CRL;
проверка по примеру из CMS_Samples всегда возвращает false.
Пытался по инструкции
https://support.cryptopr...nlirovnija-kriptopro-jcp
включить журналирование, но ничего нового в выводе программы не появилось ни при проверке по CAdES ни по CMS.

Сертификат открытого ключа установлен в хранилище типа CertStore, корневые установлены в cacerts

Куда ещё можно копнуть и как заставить работать журналирование?

Данные с подписью 25_sign_detached.zip (686kb) загружен 3 раз(а). и настройки логирования cacerts.zip (76kb) загружен 2 раз(а). во вложениях

Отредактировано пользователем 25 октября 2018 г. 17:48:32(UTC)  | Причина: Не указана

Offline Евгений Афанасьев  
#10 Оставлено : 26 октября 2018 г. 15:49:21(UTC)
Евгений Афанасьев

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

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

Сказал(а) «Спасибо»: 20 раз
Поблагодарили: 690 раз в 651 постах
Здравствуйте.
Автор: Малыгин Н. Перейти к цитате
Возникла схожая проблема.
Есть файл с данными и конверт с подписью этого файла. Подпись сформирована с помощью browser plugin. На сайте https://www.gosuslugi.ru/pgu/eds/order подпись проходит проверку успешно, в КриптоАрме тоже.
В JCP следующая ситуация:
проверка по примеру из пакета CAdES проходит, если включить онлайновую проверку CRL;
проверка по примеру из CMS_Samples всегда возвращает false.
Пытался по инструкции
https://support.cryptopr...nlirovnija-kriptopro-jcp
включить журналирование, но ничего нового в выводе программы не появилось ни при проверке по CAdES ни по CMS.

Сертификат открытого ключа установлен в хранилище типа CertStore, корневые установлены в cacerts

Куда ещё можно копнуть и как заставить работать журналирование?

Данные с подписью 25_sign_detached.zip (686kb) загружен 3 раз(а). и настройки логирования cacerts.zip (76kb) загружен 2 раз(а). во вложениях

Скорее всего, при проверке с помощью CMS_Samples вы хешировали данные, а не атрибуты. Более развернутая проверка - в CMSVerify.
Для журналирования - да, по инструкции ставите уровень, например, ALL, у нужного хендлера - Console и т.п., добавляете строку про JCPLogger тоже с уровнем. Все это в logging.properties той java, в которой происходит выполнение примера. У веб-серверов могут быть свои logging.properties.
Также посмотрите http://cpdn.cryptopro.ru...nt/cades/plugin-faq.html

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