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

Уведомление

Icon
Error

4 Страницы123>»
Опции
К последнему сообщению К первому непрочитанному
Offline commander  
#1 Оставлено : 17 мая 2012 г. 18:53:11(UTC)
commander

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

Группы: Участники
Зарегистрирован: 16.12.2008(UTC)
Сообщений: 22
Откуда: Смоленск

Сказал(а) «Спасибо»: 4 раз
Программа-клиент на Delphi должна отправлять подписанные SOAP запросы к веб-сервисам СМЭВ.
Требования к подписи:
Цитата:
Структура электронной подписи информационной системы должна соответствовать стандарту OASIS Standard 200401 (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf) с профилем X.509 Certificate Token Profile (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0.pdf).
Расчет хеш-сумм ГОСТ Р 34.11-94
Формирования подписи ГОСТ Р 34.10-2001


Я не уверен, что правильно вывожу хеш в DigestValue. Дело в том, что формат вывода результата хеш-функции в ГОСТ Р 34.11-94 не описан, а в методических рекомендациях сказано только:
"К элементу <soapenv:Body> и его потомкам, включая атрибуты, применяется каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата рассчитывается хэш по алгоритму ГОСТ Р 34.11-94 и заносится в <ds:DigestValue> в формате Base64."

Каноникализацию я делаю на основе процедуры из Clever Internet Suite (TclXmlCanonicalizer), а процедура расчета хэша написал такую:

Цитата:
function GetDigestValue(sText: string; var hProv: HCRYPTPROV; var cert: PCCERT_CONTEXT): string;
var s, err: string;
i: integer;
size, hashSize, DataSize: DWORD;
hash: HCRYPTHASH;
pbHash: PByte;
alg: ALG_ID;
begin
Result:='';

//alg:=CALG_GR3411;
alg:=CertOIDToAlgId(Cert.pCertInfo.SignatureAlgorithm.pszObjId);

if not CryptCreateHash(hProv, alg, 0, 0, hash) then
begin
raise Exception.Create('Ошибка создания хеш-объекта');
end;

s:=sText;
size:=Length(s);
if not CryptHashData(hash, PByte(s), size, 0) then
begin
raise Exception.Create('Ошибка при хешировании');
end;

DataSize:=SizeOf(DataSize);
if not CryptGetHashParam(hash, HP_HASHSIZE, @hashSize, DataSize, 0) then
begin
raise Exception.Create('Ошибка при хешировании');
end;
GetMem(pbHash, hashSize);
try
if not CryptGetHashParam(hash, HP_HASHVAL, pbHash, hashSize, 0) then // получаем хеш
begin
raise Exception.Create('Ошибка при хешировании');
end;
for i:=0 to hashSize-1 do // выводим хеш
Result:=Result+PAnsiChar(pbHash)[i];
finally
FreeMem(pbHash);
end; //finally

if not CryptDestroyHash(hash) then
begin
raise Exception.Create('Ошибка при уничтожении хеша', False);
end;
end;


Результат этой функции кодирую в BASE64 и помещаю в DigestValue.

В документации к веб-сервисам, которые я должен вызывать, есть подписанные контрольные примеры. Значение хэша, который там находится в DigestValue, не совпадает с рассчитываемым мной.

Подскажите пожалуйста, где у меня может быть ошибка. Или может есть более простой путь подписания XML, чем писать это все вручную? КриптоПро .Net и КриптоПро JCP мне, как я понимаю, никак не помогут, я же не смогу их использовать из своей программы...
Если надо, могу показать функцию каноникализации.

Спасибо.
Offline dedov  
#2 Оставлено : 17 мая 2012 г. 19:32:40(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
значения хотя бы покажите
Offline commander  
#3 Оставлено : 17 мая 2012 г. 19:53:23(UTC)
commander

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

Группы: Участники
Зарегистрирован: 16.12.2008(UTC)
Сообщений: 22
Откуда: Смоленск

Сказал(а) «Спасибо»: 4 раз
dedov написал:
значения хотя бы покажите

Вот тестовый запрос из примера веб-сервиса налоговой:

<?xml version="1.0" encoding="UTF-8" standalone="no"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><SOAP-ENV:Header><wsse:Security SOAP-ENV:actor="http://smev.gosuslugi.ru/actors/smev"><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<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="#body">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
<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>DREzHDy368wuJ88hgdLKSKlwii360tSFhJDoWJwpDVQ=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
KsuUdgoIIMMUViZaYzjGvaCnQkEb0EAazeR7cAA3S+dAmIS36aBnWMK0W6El1tBjCqEPguRwNjdO
jA0QjBSqEA==
</ds:SignatureValue>
<ds:KeyInfo>
<wsse:SecurityTokenReference><wsse:Reference URI="#SenderCertificate"/></wsse:SecurityTokenReference>
</ds:KeyInfo>
</ds:Signature><wsu:Timestamp wsu:Id="Timestamp-8E267978C3D7A708BE13172760165661"><wsu:Created>2011-09-29T06:00:16Z</wsu:Created><wsu:Expires>2011-09-29T06:05:16Z</wsu:Expires></wsu:Timestamp><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="SenderCertificate">
MIIDbzCCAx6gAwIBAgIKT0n0JwAAAAACbzAIBgYqhQMCAgMweTEXMBUGCSqGSIb3DQEJARYIY2FA
cnQucnUxCzAJBgNVBAYTAlJVMRUwEwYDVQQHDAzQnNC+0YHQutCy0LAxJDAiBgNVBAoMG9Ce0JDQ
niDQoNC+0YHRgtC10LvQtdC60L7QvDEUMBIGA1UEAxMLUlRLIFRlc3QgQ0EwHhcNMTEwNzE0MTEx
MzAwWhcNMTIwNzE0MTEyMjAwWjBSMQswCQYDVQQGEwJSVTFDMEEGA1UEAx46BCIENQRBBEIEPgQy
BEsEOQAgBEEENQRABEIEOAREBDgEOgQwBEIAIAQkBB0EIQAgBC0EHwAtBB4EEjBjMBwGBiqFAwIC
EzASBgcqhQMCAiQABgcqhQMCAh4BA0MABEBoEKpxwOzL7/rR/NzVm6UKW1IUROTXkzzx587jlJPf
Qa3PdOMhSVlEZcwEL9+qcJBFkszomWQ+rXmqcCFAHS2+o4IBqzCCAacwCwYDVR0PBAQDAgTwMCYG
A1UdJQQfMB0GByqFAwICIgYGCCsGAQUFBwMCBggrBgEFBQcDBDAdBgNVHQ4EFgQUxpxy+ssufWhK
y2NS1P/bqZchrGowHwYDVR0jBBgwFoAU3FNp0mLQ2/bwWr2CT1PAxNXwP1cwZgYDVR0fBF8wXTBb
oFmgV4ZVaHR0cDovL2QwMHBndWNlcnQwMS4wMC5lZ292LmxvY2FsL3JhL2NkcC9kYzUzNjlkMjYy
ZDBkYmY2ZjA1YWJkODI0ZjUzYzBjNGQ1ZjAzZjU3LmNybDCBkwYIKwYBBQUHAQEEgYYwgYMwOwYI
KwYBBQUHMAGGL2h0dHA6Ly9kMDBwZ3VjZXJ0MDEuMDAuZWdvdi5sb2NhbC9vY3NwL29jc3Auc3Jm
MEQGCCsGAQUFBzAChjhodHRwOi8vZDAwcGd1Y2VydDAxLjAwLmVnb3YubG9jYWwvcmEvY2RwL3Rl
c3RfY2FfcnRrLmNydDAyBgkrBgEEAYI3FQoEJTAjMAkGByqFAwICIgYwCgYIKwYBBQUHAwIwCgYI
KwYBBQUHAwQwCAYGKoUDAgIDA0EAYEEdhOpMor9QE22T4hUP1jJVnZ9aA0XgsxsjBzjhzfMwAI4g
L2YgBUvKQNa+iWVyg8u+BHHGCrVF9GyGXQIuzA==
</wsse:BinarySecurityToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body wsu:Id="body"><ws:SendRequestRq xmlns:ws="http://ws.unisoft/">

<smev:Message xmlns:smev="http://smev.gosuslugi.ru/rev110801"><smev:Sender><smev:Code>13242</smev:Code><smev:Name>MINSVYAZ_SYS_1</smev:Name></smev:Sender><smev:Recipient><smev:Code>13312</smev:Code><smev:Name>NALOG_SYS_1</smev:Name></smev:Recipient><smev:Originator><smev:Code>originator_code</smev:Code><smev:Name>ПГУ</smev:Name></smev:Originator><smev:TypeCode>5</smev:TypeCode><smev:Date>2011-08-17T09:30:47Z</smev:Date></smev:Message><smev:MessageData xmlns:smev="http://smev.gosuslugi.ru/rev110801"><smev:AppData wsu:Id="fns-AppData"><rq1:Документ xmlns:rq1="http://ws.unisoft/FNSZDL/Rq1" ВерсФорм="4.02" ИдЗапросП="012345678012345678012345678012345678">
<rq1:СвЮЛ ИННЮЛ="5245023822" НаимЮЛ="ООО Ромашка" ОГРН="1234567890999"/>
<rq1:ЗапросНП ДатаНа="10.09.2011">
<rq1:ИННЮЛ>5252017241</rq1:ИННЮЛ>
</rq1:ЗапросНП>
</rq1:Документ></smev:AppData></smev:MessageData></ws:SendRequestRq></SOAP-ENV:Body></SOAP-ENV:Envelope>


Их хэш:
<ds:DigestValue>DREzHDy368wuJ88hgdLKSKlwii360tSFhJDoWJwpDVQ=</ds:DigestValue>
Мой получается:
<ds:DigestValue>pbxUB4P0qhEAPMZFf1CFbU6ekXndIFlni0QDZhJo94g=</ds:DigestValue>
Offline dedov  
#4 Оставлено : 17 мая 2012 г. 20:13:09(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
какие в этом примере хэшируются данные? т.е. что подается на ввод?
Offline dedov  
#5 Оставлено : 17 мая 2012 г. 21:08:53(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
- либо входные данные имеют различие у вас и налоговой
- вполне возможно что проблема у вас не в хэшировании, а в преобразовании pbyte в строку и дальнейшее кодирование в base64

проверить работоспособность функции хэширования можно пустым значением, т.е. подайте sText=""
должно получиться хэш в HEX:98 1E 5F 3C A3 0C 84 14 87 83 0F 84 FB 43 3E 13 AC 11 01 56 9B 9C 13 58 4A C4 83 23 4C D6 56 C0

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

Offline commander  
#6 Оставлено : 18 мая 2012 г. 13:03:09(UTC)
commander

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

Группы: Участники
Зарегистрирован: 16.12.2008(UTC)
Сообщений: 22
Откуда: Смоленск

Сказал(а) «Спасибо»: 4 раз
dedov написал:
какие в этом примере хэшируются данные? т.е. что подается на ввод?

Вот эти данные (это после каноникализации):
https://docs.google.com/...ybziv59M-azdfanVuQ3lsY0E

dedov написал:
- либо входные данные имеют различие у вас и налоговой
- вполне возможно что проблема у вас не в хэшировании, а в преобразовании pbyte в строку и дальнейшее кодирование в base64

Да, возможно. А приведенный ниже хэш для пустой строки как должен выглядеть в base64?
У меня получается "mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=".

dedov написал:
проверить работоспособность функции хэширования можно пустым значением, т.е. подайте sText=""
должно получиться хэш в HEX:98 1E 5F 3C A3 0C 84 14 87 83 0F 84 FB 43 3E 13 AC 11 01 56 9B 9C 13 58 4A C4 83 23 4C D6 56 C0

Именно такой хэш у меня и получается.
Offline dedov  
#7 Оставлено : 18 мая 2012 г. 13:26:23(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
да base64 для хэша пустой строки:mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=


base64 канонизированных данных:97xE/bRG9xfdcH5cevDU7JNBG91+zXdTqRRSaejC4AI=
HEX:F7 BC 44 FD B4 46 F7 17 DD 70 7E 5C 7A F0 D4 EC 93 41 1B DD 7E CD 77 53 A9 14 52 69 E8 C2 E0 02

смотрите вашу реализацию канонизации
Offline commander  
#8 Оставлено : 18 мая 2012 г. 13:55:33(UTC)
commander

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

Группы: Участники
Зарегистрирован: 16.12.2008(UTC)
Сообщений: 22
Откуда: Смоленск

Сказал(а) «Спасибо»: 4 раз
dedov написал:
да base64 для хэша пустой строки:mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=

Большое спасибо. Теперь хотя бы понятно, что хэш я вычисляю правильно.

dedov написал:
base64 канонизированных данных:97xE/bRG9xfdcH5cevDU7JNBG91+zXdTqRRSaejC4AI=
HEX:F7 BC 44 FD B4 46 F7 17 DD 70 7E 5C 7A F0 D4 EC 93 41 1B DD 7E CD 77 53 A9 14 52 69 E8 C2 E0 02

смотрите вашу реализацию канонизации

Уточню. Это Вы сами каноникализировали <SOAP-ENV:Body> из приведенного мной XML и вычислили хэш? А можно посмотреть, что у Вас получилось после каноникализации (чем отличается от моего)?
Offline dedov  
#9 Оставлено : 18 мая 2012 г. 14:03:33(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
commander написал:
dedov написал:
да base64 для хэша пустой строки:mB5fPKMMhBSHgw+E+0M+E6wRAVabnBNYSsSDI0zWVsA=

Большое спасибо. Теперь хотя бы понятно, что хэш я вычисляю правильно.

dedov написал:
base64 канонизированных данных:97xE/bRG9xfdcH5cevDU7JNBG91+zXdTqRRSaejC4AI=
HEX:F7 BC 44 FD B4 46 F7 17 DD 70 7E 5C 7A F0 D4 EC 93 41 1B DD 7E CD 77 53 A9 14 52 69 E8 C2 E0 02

смотрите вашу реализацию канонизации

Уточню. Это Вы сами каноникализировали <SOAP-ENV:Body> из приведенного мной XML и вычислили хэш? А можно посмотреть, что у Вас получилось после каноникализации (чем отличается от моего)?


данные взял по вашей ссылке выше https://docs.google.com/open?id=0B2cybziv59M-azdfanVuQ3lsY0E

с кодировкой попробуйте поковырять

Отредактировано пользователем 18 мая 2012 г. 14:04:06(UTC)  | Причина: Не указана

Offline dedov  
#10 Оставлено : 18 мая 2012 г. 14:42:47(UTC)
dedov

Статус: Эксперт

Группы: Участники
Зарегистрирован: 03.04.2008(UTC)
Сообщений: 380
Мужчина
Откуда: Россия, г. Белгород

Сказал «Спасибо»: 11 раз
Поблагодарили: 9 раз в 9 постах
подправил свой функционал

результат:
base64:pbxUB4P0qhEAPMZFf1CFbU6ekXndIFlni0QDZhJo94g=

такой как и у вас

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