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

Уведомление

Icon
Error

4 Страницы«<234
Опции
К последнему сообщению К первому непрочитанному
Offline komex  
#31 Оставлено : 24 октября 2014 г. 11:49:05(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Автор: Mishanki Перейти к цитате
Видимо кодировка.
Как Вы записываете в файл данные? В какой они там кодировке?

Пустое значение хеш совпадает с найденным на форуме: mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=

Спасибо!


UTF-8. Конкретно для этого примера я просто в DOMDocument загрузил всю XML, нашел элемент Body, сделал C14N() и строку вставил в файл.
А какая операционная система? Может для переноса строк используется \r\n вместо \n?
Offline Mishanki  
#32 Оставлено : 24 октября 2014 г. 11:58:25(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
CentOS
По Вашему файлу результат старый: hNSGjtOnN590TiFAhZaL2yxrkeysvgwI7o+JDTCfuyA=

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

Offline komex  
#33 Оставлено : 24 октября 2014 г. 12:02:14(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Для создания ответа с нуля так же используется DOMDocument. Туда добавляются элементы через методы объекта. По идее, не должно быть проблем... Вы можете выложить код (или его часть), а я, когда будет время, посмотрю что там не так. Но не обещаю, что это будет скоро.
Offline Mishanki  
#34 Оставлено : 24 октября 2014 г. 12:05:08(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Скопировал Ваш файл в папку темт.
Запустил алгоритм хэширования криптоПРО через bash (руками).

Считываю содержимое из php:
$str = file_get_contents('/tmp/c14n.xml.hsh');
echo base64_encode($str);


Offline komex  
#35 Оставлено : 24 октября 2014 г. 12:07:59(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Так... Что-то где-то не так делаем. Проверяю файл, который приложил - хэш такой же, как у вас. Вставляю такой же код из буффера прямо на сервере в файл, хэш как и был раньше...

Похоже, файл, который я приложил имел неверное окончание. Вроде новый файл должен быть правильным (если форум его не изменит).

Отредактировано пользователем 24 октября 2014 г. 12:16:38(UTC)  | Причина: Исправление файла

Вложение(я):
c14n.xml (3kb) загружен 11 раз(а).

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

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

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

Сказал(а) «Спасибо»: 3 раз
Все xml, которые Вы отправляете, генерируются через DOMDocument?
Я на данный момент храню тестовые $xml = 'строка xml'.

Далее. Обработка с14n:
$obj = new DOMDocument("1.0", "ISO-8859-15");
$obj->loadXML($xml);

$node = $obj->getElementsByTagName('Body');
for($c = 0; $c<$node->length; $c++){
$c14nBody = $node->item($c)->C14N();
}

Запись в файл
$file = fopen('/tmp/'.$fName.'.txt', 'w+');
if (!$file) {
die();
} else {
$res = fputs($file, $str);
if ($res) $ok = 'ok';
}
fclose($file);

Далее Hash отрабатывает и считывание уже написал.


Offline Mishanki  
#37 Оставлено : 24 октября 2014 г. 12:20:08(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Файл обработан корректно! Хэш совпал.
Теперь появился простор для экспериментов.

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

Offline komex  
#38 Оставлено : 24 октября 2014 г. 12:22:14(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Автор: Mishanki Перейти к цитате
Все xml, которые Вы отправляете, генерируются через DOMDocument?
Я на данный момент храню тестовые $xml = 'строка xml'.

Далее. Обработка с14n:
$obj = new DOMDocument("1.0", "ISO-8859-15");
$obj->loadXML($xml);

$node = $obj->getElementsByTagName('Body');
for($c = 0; $c<$node->length; $c++){
$c14nBody = $node->item($c)->C14N();
}

Запись в файл
$file = fopen('/tmp/'.$fName.'.txt', 'w+');
if (!$file) {
die();
} else {
$res = fputs($file, $str);
if ($res) $ok = 'ok';
}
fclose($file);

Далее Hash отрабатывает и считывание уже написал.




Да, руками не нужно ничего генерировать - скорее всего будут ошибки.
А почему кодировка используется "ISO-8859-15"? Лучше либо убрать это совсем, либо заменить на utf-8.

Код:
$obj = new DOMDocument();
или
Код:
$obj = new DOMDocument("1.0", "utf-8");
Offline Mishanki  
#39 Оставлено : 24 октября 2014 г. 12:43:11(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Различия обнаружил. К концу строки приклеил перенос строки ...</S:Body>' . "\n";
Теперь рабоает.
Offline dimice  
#40 Оставлено : 6 апреля 2015 г. 11:46:24(UTC)
dimice

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

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

Поблагодарили: 1 раз в 1 постах
Может кому пригодится, получилось подписать сообщение для СМЭВ на PHP следующим образом:
Код:
$dir = "tmp";

$tempfile = $dir."/tmp.txt";
$doc = new DOMDocument();
$xml = preg_replace('/\r\n/u',"\n", $xml);

$doc->loadXML($xml);

// сначала хэш
$body = $doc->getElementsByTagName('Body')->item(0)->C14N(true);
// записываем во временный файл и считаем хэш
file_put_contents($tempfile, $body);
$cmd = "cryptcp -hash -provtype 75 -dir {$dir} {$tempfile}";
exec($cmd, $output);
$hash = base64_encode(file_get_contents($tempfile.".hsh"));
// записываем хэш внутрь XML
$doc->getElementsByTagName('DigestValue')->item(0)->nodeValue = $hash;

// теперь подпись
$SignedInfo = $doc->getElementsByTagName('SignedInfo')->item(0)->C14N(true);
file_put_contents($tempfile, $SignedInfo);
$cmd = "csptest -keyset -sign GOST -in {$tempfile} -out {$tempfile}.sig -password 1234567890 -container RaUser-164aa6f1-fcf4-4074-bb69-6b1ea5e29e93 -keytype exchange";
exec($cmd, $output);
$signature = base64_encode(strrev(file_get_contents($tempfile.".sig")));
// записываем подпись внутрь XML
$doc->getElementsByTagName('SignatureValue')->item(0)->nodeValue = $signature;

// сохраняем XML
$xml = $doc->saveXML();


Перед выполнением данного кода в $xml хранится сгенерированное сообщение, в том числе с сертификатом в BinarySecurityToken. Т.е. остаётся заполнить поля SignatureValue и DigestValue.
В итоге получается сообщение которое проходит проверку подписи СМЭВ.

Спасибо всем кто отписывался в данной теме ранее.
thanks 1 пользователь поблагодарил dimice за этот пост.
sniker оставлено 04.06.2020(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (2)
4 Страницы«<234
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.