Статус: Участник
Группы: Участники
Зарегистрирован: 26.09.2014(UTC) Сообщений: 20 Сказал «Спасибо»: 2 раз Поблагодарили: 4 раз в 4 постах
|
Автор: Mishanki Видимо кодировка. Как Вы записываете в файл данные? В какой они там кодировке?
Пустое значение хеш совпадает с найденным на форуме: mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=
Спасибо! UTF-8. Конкретно для этого примера я просто в DOMDocument загрузил всю XML, нашел элемент Body, сделал C14N() и строку вставил в файл. А какая операционная система? Может для переноса строк используется \r\n вместо \n?
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.10.2014(UTC) Сообщений: 16 Откуда: Москва Сказал(а) «Спасибо»: 3 раз
|
CentOS По Вашему файлу результат старый: hNSGjtOnN590TiFAhZaL2yxrkeysvgwI7o+JDTCfuyA= Отредактировано пользователем 24 октября 2014 г. 12:02:25(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.09.2014(UTC) Сообщений: 20 Сказал «Спасибо»: 2 раз Поблагодарили: 4 раз в 4 постах
|
Для создания ответа с нуля так же используется DOMDocument. Туда добавляются элементы через методы объекта. По идее, не должно быть проблем... Вы можете выложить код (или его часть), а я, когда будет время, посмотрю что там не так. Но не обещаю, что это будет скоро.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.10.2014(UTC) Сообщений: 16 Откуда: Москва Сказал(а) «Спасибо»: 3 раз
|
Скопировал Ваш файл в папку темт. Запустил алгоритм хэширования криптоПРО через bash (руками).
Считываю содержимое из php: $str = file_get_contents('/tmp/c14n.xml.hsh'); echo base64_encode($str);
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 26.09.2014(UTC) Сообщений: 20 Сказал «Спасибо»: 2 раз Поблагодарили: 4 раз в 4 постах
|
Так... Что-то где-то не так делаем. Проверяю файл, который приложил - хэш такой же, как у вас. Вставляю такой же код из буффера прямо на сервере в файл, хэш как и был раньше... Похоже, файл, который я приложил имел неверное окончание. Вроде новый файл должен быть правильным (если форум его не изменит). Отредактировано пользователем 24 октября 2014 г. 12:16:38(UTC)
| Причина: Исправление файла Вложение(я): c14n.xml (3kb) загружен 11 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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 отрабатывает и считывание уже написал.
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.10.2014(UTC) Сообщений: 16 Откуда: Москва Сказал(а) «Спасибо»: 3 раз
|
Файл обработан корректно! Хэш совпал. Теперь появился простор для экспериментов. Отредактировано пользователем 24 октября 2014 г. 12:33:41(UTC)
| Причина: Не указана
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 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");
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 20.10.2014(UTC) Сообщений: 16 Откуда: Москва Сказал(а) «Спасибо»: 3 раз
|
Различия обнаружил. К концу строки приклеил перенос строки ...</S:Body>' . "\n"; Теперь рабоает.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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. В итоге получается сообщение которое проходит проверку подписи СМЭВ. Спасибо всем кто отписывался в данной теме ранее.
|
1 пользователь поблагодарил dimice за этот пост.
|
sniker оставлено 04.06.2020(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close