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

Уведомление

Icon
Error

4 Страницы<1234>
Опции
К последнему сообщению К первому непрочитанному
Offline komex  
#11 Оставлено : 30 сентября 2014 г. 15:19:35(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Удалось создавать и проверять свои подписи.

Подписать файл:
Код:
$ /opt/cprocsp/bin/amd64/csptestf -keyset -sign GOST -in data.xml -out data.xml.sig -password 1234567890 -container RaUser-60002963-592a-4e32-96c8-8e7304f7b424 -keytype exchange -expcert cert.pem


Где, data.xml - сообщение, которое нужно подписать, data.xml.sig - подпись, которая будет создана для сообщения, cert.pem - сертификат, который будет экспортирован.

Для проверки подписи используется следующая команда:
Код:
$ /opt/cprocsp/bin/amd64/csptestf -keyset -verify GOST -in data.xml -signature data.xml.sig -certificate cert.pem -keytype exchange -verifycontext


При работе со СМЭВ, требуется всегда побайтно переворачивать подпись. Если делаем подпись, то сначала делаем подпись, потом ее переворачиваем, дальше в base64 и вставляем в XML. При проверке порядок действий обратный: Извлекаем подпись, декодируем из base64 в бинарную строку, побайтно переворачиваем и запускаем команду проверки. Сертификат у меня хранится в бинарном виде.

Отредактировано пользователем 3 октября 2014 г. 17:02:13(UTC)  | Причина: Найдено решение.

thanks 1 пользователь поблагодарил komex за этот пост.
Mishanki оставлено 20.10.2014(UTC)
Offline Mishanki  
#12 Оставлено : 20 октября 2014 г. 18:42:41(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Здравствуйте!

Корректный пример для переворачивания подписи по байтам есть (на php)?

Обязательно ли указывать при подписании -expcert cert.pem? У меня работает без.

Спасибо! Очень жду ответов!!!
Offline komex  
#13 Оставлено : 20 октября 2014 г. 18:49:56(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Автор: Mishanki Перейти к цитате
Здравствуйте!

Корректный пример для переворачивания подписи по байтам есть (на php)?

Обязательно ли указывать при подписании -expcert cert.pem? У меня работает без.

Спасибо! Очень жду ответов!!!


Здравсвуйте. Для переворачивания подписи использую функцию strrev. Т.е. берется из сообщения строка в формате base64 и переворачивается так:

Код:

$str = 'тут строка в формате base64';
$sign = strrev(base64_decode($str));


Добавлять ключ "-expcert cert.pem" не обязательно. Она просто экспортирует сертификат, который нужно добавлять в ответном сообщении. Его можно заранее извлечь один раз, и не создавать каждый раз при подписи.
Offline Mishanki  
#14 Оставлено : 20 октября 2014 г. 21:36:14(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Изначально мне казалось, что переварачиваем именно подпись, а потом уже кодируем в b64 перевернутую подписиь.
Или мы сначала подписываем, кодируем в b64, а потом переворачиваем? Какой вариант правильный?

Нужно ли блок SignInfo перед подписыванием преобразовывать в hash по ГОСТ Р 34.11-94, а после подписывать по ГОСТ Р 34.10-2001 или мы сразу подписываем?

Есть ли пример реализации канонизации в c14n на php?

С п а с и б о !
Offline komex  
#15 Оставлено : 20 октября 2014 г. 22:10:23(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Автор: Mishanki Перейти к цитате
Изначально мне казалось, что переварачиваем именно подпись, а потом уже кодируем в b64 перевернутую подписиь.
Или мы сначала подписываем, кодируем в b64, а потом переворачиваем? Какой вариант правильный?


При проверке подписи сначала декодируем, потом переворачиваем и проверяем. Для подписи делаем все наоборот: подписываем, переворачиваем, кодируем в base64.

Автор: Mishanki Перейти к цитате
Нужно ли блок SignInfo перед подписыванием преобразовывать в hash по ГОСТ Р 34.11-94, а после подписывать по ГОСТ Р 34.10-2001 или мы сразу подписываем?


Криптопро сам все делает, дополнительно хэшировать не нужно - только канонизированный блок отдать на подпись.

Автор: Mishanki Перейти к цитате
Есть ли пример реализации канонизации в c14n на php?


Да, для этого используется метод C14N класса DOMNode. А вообще, есть библиотека XMLSecurity, которая сама проверяет все подписи и хэши. Вот только нужно ее расширять, что бы получить поддержку ГОСТ.
Offline Mishanki  
#16 Оставлено : 20 октября 2014 г. 22:44:33(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
С14N настроил. Работает. Только не знаю корректно ли.
Сохраняются ли ds: в блоке? Есть ли пример блока SignInfo прошедшего канонизацию?

<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<ds:Reference URI="#id-20">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<ds:DigestValue>kLELYYPd38yHnns/LNr41cSC6Toci3IIwbOqw5SHtho=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>

Offline komex  
#17 Оставлено : 20 октября 2014 г. 23:06:51(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Автор: Mishanki Перейти к цитате
С14N настроил. Работает. Только не знаю корректно ли.
Сохраняются ли ds: в блоке? Есть ли пример блока SignInfo прошедшего канонизацию?

<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"/>
<ds:Reference URI="#id-20">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"/>
<ds:DigestValue>kLELYYPd38yHnns/LNr41cSC6Toci3IIwbOqw5SHtho=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>



Я прогнал через C14N и результат получился следующий:

Код:
<SignedInfo>
  <CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></CanonicalizationMethod>
  <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411"></SignatureMethod>
  <Reference URI="#id-20">
  <Transforms>
  <Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"></Transform>
  </Transforms>
  <DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411"></DigestMethod>
  <DigestValue>kLELYYPd38yHnns/LNr41cSC6Toci3IIwbOqw5SHtho=</DigestValue>
  </Reference>
</SignedInfo>


Правда при этом php ругался, что не знает префикса ds (ведь XML не полный). Если покажете исходный XML, сделаю из него правильный SignedInfo для проверки.
Offline Mishanki  
#18 Оставлено : 21 октября 2014 г. 12:06:24(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Попробуем разобратся. Все еще не могу пройти проверку ЭП на сервере СМЭВ.

Весь алгортим:
Канонизирую весь xml. Беру блок Body, пишу в файл, делаю хеш, достаю хеш (без всяких переворотов строки), кодирую в base64 и вставляю в DigestValue.
Проверка hash: Обработка тестовой строки: $str = 'Проверка' возвращает результат в b64: wahup7a1pam125HxOxg67T8FMblT9l7iPE6WFFHZn2Y=

Далее... Вновь канонизируем весь xml. Беру блок SignInfo, пишу в файл, подписываю, переворачиваю, кодирую в base64, вношу результат в SignatureValue.

Отправка и ошибка ЭП.

Где искать ошибку? Прошу помощи.

Код канонизации:
$x = xml, $tag = 'Body' или 'SignInfo'
function getC14N($tag, $x){

$xml = new DOMDocument("1.0", "ISO-8859-15");
$xml->loadXML($x);

$node = $xml->getElementsByTagName($tag);
for($c = 0; $c<$node->length; $c++){
$n = $node->item($c)->C14N();
}

return $n;
}

Спасибо!
Offline komex  
#19 Оставлено : 21 октября 2014 г. 12:47:35(UTC)
komex

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

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

Сказал «Спасибо»: 2 раз
Поблагодарили: 4 раз в 4 постах
Вот пример рабочего запроса СМЭВ:



В данном примере только один блок Security и подписывает он Body. Делается это так. Создается блок wsse:Security и добавляется в s:Header.
Дальше в него добавляется публичный сертификат через блок wsse:BinarySecurityToken.
Следом создается блок ds:Signature, в который добавляется ds:KeyInfo со ссылкой на этот сертификат. Потом в ds:Signature добавляем ds:SignedInfo.
В нем CanonicalizationMethod и SignatureMethod всегда одинаковые. Reference указывает на блок, который подписываем: тут подписывается только Body (ID="_2").
Дальше берется весь кусок s:Body, трансформируется и высчитывается его hash, кладется в b64 в DigestValue.
Следющим шагом берется ds:SignedInfo, канинизируется (трансформируется) и делается его подпись. Она переворачивается и кладется в b64 в ds:SignatureValue.

Писал по памяти, мог ошибиться. Вообще, этот алгоритм описан в документации СМЭВ. Кроме того, делать все эти XML руками очень сложно и велика вероятность ошибки (даже один лишний пробел может испортить запрос).
Если есть возможность, пробуйте использовать готовые компоненты (давал ссылку выше).
Offline Mishanki  
#20 Оставлено : 21 октября 2014 г. 13:30:37(UTC)
Mishanki

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

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

Сказал(а) «Спасибо»: 3 раз
Спасибо!

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

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