Статус: Сотрудник
Группы: Участники
Зарегистрирован: 14.10.2011(UTC) Сообщений: 150  Поблагодарили: 33 раз в 32 постах
|
SignedXml этого не умеет. В примере SignSmevRequest.cs используется уже готовый шаблон с нужными узлами. Вы также можете подготовить нужный Вам шаблон. |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 16.12.2008(UTC) Сообщений: 22 Откуда: Смоленск
Сказал(а) «Спасибо»: 4 раз
|
Спасибо за ответ. <SignedInfo> нет в шаблоне (в шаблоне только <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">), а <SignedInfo> создается в SignedXml (без "ds:"!), а потом просто переносится в doc. Или это только у меня одного в примере получается "<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">"?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 18.09.2012(UTC) Сообщений: 7 Откуда: СПб
Сказал(а) «Спасибо»: 2 раз
|
Win написал:Спасибо за ответ. У меня задача следующая: У нас сервис, который должен подписать сво ответ для смэв по госту и т.п..(Ну и по желанию проверить сертификат смэв при вызове сервиса)
Хотелось бы конечно на текущий сервис, добавить настройки через конфиг. подключить сборки и все. А так необходимо конфигурировать сервис через код. примеры из SDK не заводятся.(
Сертификаты, их проверку можно указsвать традиционными для WCF способами, через конфиг или код. Для подключения кодировщика сообщений от КриптоПро НЕТ через конфиг можно использовать пример во вложении Тогда создается CustomBinding, в котором ставиться кодировщик Код: <extensions>
<bindingElementExtensions>
<!--
Расширение дающее возможность использовать Message encoder КриптПроНет для СМЭВ.
Требует наличия на машине КриптоПро и КриптоПроНет.
Иначе необходимо закомментировать, а также заменить defaultAlgorithmSuite="BasicGostObsolete" на defaultAlgorithmSuite="Default"
-->
<add name="smevMessageEncoding" type="Имя вышеуказаного типа"/>
</bindingElementExtensions>
</extensions>
....
<smevMessageEncoding
innerMessageEncoding="textMessageEncoding"
messageVersion="Soap11"
recipientActor="http://smev.gosuslugi.ru/actors/recipient"
senderActor="http://smev.gosuslugi.ru/actors/smev"
/>
Но в контрактах все равно придется указывать подписывание сообщений. Отредактировано пользователем 4 октября 2012 г. 12:46:49(UTC)
| Причина: Не указана Вложение(я):  SmevMessageEncodingBindingElementExtensions.cs (6kb) загружен 77 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.08.2009(UTC) Сообщений: 60
|
Добрый день! Пример из КриптоПро .NET SDK со СМЕВ не работает. Сервис проверки СМЕВ пишет "Неверная ЭП сообщения" В качестве одной из причин поддержка СМЭВ заявляет "Используемые ОИВом библиотеки инвертируют подпись. В этом случае необходимо побитово инвертировать подпись перед внесением в XML."
Сейчас буду пробовать инвертировать полученную в примере из тега ds:SignatureValue подпись. О результатах напишу позже.
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.03.2012(UTC) Сообщений: 7
|
commander написал:Спасибо за ответ. <SignedInfo> нет в шаблоне (в шаблоне только <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">), а <SignedInfo> создается в SignedXml (без "ds:"!), а потом просто переносится в doc. Или это только у меня одного в примере получается "<SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#">"? У меня ровно то же самое происходит. А СМЭВ требует, чтобы весть запрос был каноникализирован, т.е. чтобы SignedInfo и SignatureValue и все вложенные блоки имели префикс ds, а неймспейс указан в Envelope Если я применяю процедуру каноникализации к этим блокам - внешне все становится нормально, но ЭЦП потом не валидируется. Значит - каноникализацию должен делать SignedXml Но как ему это объяснить - абсолютно не представляю :-( Отредактировано пользователем 5 октября 2012 г. 20:01:08(UTC)
| Причина: Не указана
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.08.2009(UTC) Сообщений: 60
|
Инвертирование подписи результата не принесло. Как делал: Код: //было в примере КриптоПро .NET SDK
//doc.GetElementsByTagName("ds:SignatureValue")[0].InnerText = xmlDigitalSignature.GetElementsByTagName("SignatureValue")[0].InnerText;
string signvalue = xmlDigitalSignature.GetElementsByTagName("SignatureValue")[0].InnerText;
byte[] decodedBytes = Convert.FromBase64String (signvalue );
byte[] bytesToEncode = new byte[decodedBytes.Length];
//Инвертирую массив байт
for (int i = 0; i < decodedBytes.Length; i++)
{
bytesToEncode[decodedBytes.Length - i - 1] = decodedBytes[i];
}
//кодирую инвертированную подпись в Base64
string encodedText = Convert.ToBase64String(bytesToEncode);
doc.GetElementsByTagName("ds:SignatureValue")[0].InnerText = encodedText;
Результат проверки в СМЭВ - "Неверная ЭП сообщения". Я так понимаю, что в СМЭВ используют провайдер КриптоПро JSP, поэтому подпись нужно инвертировать. Может быть нужно инвертировать не SignatureValue, а DigestValue? Отредактировано пользователем 8 октября 2012 г. 18:03:22(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.03.2012(UTC) Сообщений: 7
|
Путем серии экспериментов установил следующее: если после вычисления ЭЦП каноникализировать блок Signature, т.е. привести к виду: <wsse:Security soapenv:actor="http://smev.gosuslugi.ru/actors/smev"><ds:Signature Id="Signature-RON"><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/2001/10/xml-exc-c14n#" /></ds:Transforms><ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" /><ds:DigestValue>+MqCQtXZQFBJH5GwvKCSdMwfEUeQ5jJIPXOZ1BONez0=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>wxGP/a9twCCHKeRpD+i6Idn9Fvfkeuy7+Nidw/DK/8TfPJ00vJkSDQIABkTYru3YvjU2pw4DhynkiVjNvio+oQ==</ds:SignatureValue><ds:KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#CertId" /></wsse:SecurityTokenReference></ds:KeyInfo></ds:Signature><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="CertId">MIIDdTCCAySgAwIBAgIKGzZecgAAAAAPEDAIBgYqhQMCAgMwga4xIzAhBgkqhkiG9w0BCQEWFHVjMl8xQG5paS52b3NraG9kLnJ1MQswCQYDVQQGEwJSVTEVMBMGA1UEBx4MBBwEPgRBBDoEMgQwMS8wLQYDVQQKHiYEIAQ+BEEEOAQ9BEQEPgRABDwEQgQ1BEUEPQQ+BDsEPgQzBDgEODEPMA0GA1UECx4GBCMEEwQjMSEwHwYDVQQDHhgEIwQmACAEHgQTBBgEJgAgBBIEIwBfADEwHhcNMTExMjA2MTAxNzAwWhcNMTIxMjA2MTAxODAwWjBXMQswCQYDVQQGEwJSVTEhMB8GA1UECh4YBCAEPgRBBD4EMQRABD0EMAQ0BDcEPgRAMSUwIwYDVQQDHhwEIAQ+BEEEPgQxBEAEPQQwBDQENwQ+BEAAIAAyMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQBLCfo8Ve+BrowWGEqqHiq2w2XINNeU8rRKgAUBEZ/gJAJpsTQ05axmnA5TJZd6ZUzF5z/jx51D2W9C5poydW8+jggF2MIIBcjAOBgNVHQ8BAf8EBAMCBPAwGQYJKoZIhvcNAQkPBAwwCjAIBgYqhQMCAhUwJAYDVR0lBB0wGwYGKoUDZAICBgcqhQMCAiIGBggrBgEFBQcDAjAdBgNVHQ4EFgQUcwyJA9fAlNO5sQQqb5zdfV1SE8swHwYDVR0jBBgwFoAUZVd3YOFb6lkAejJvFvVODQULJSkwMAYJKwYBBAGCNxUKBCMwITAIBgYqhQNkAgIwCQYHKoUDAgIiBjAKBggrBgEFBQcDAjBnBgNVHR8EYDBeMCygKqAohiZodHRwOi8vdWMub2dpYy5ydS9DRFAvVUNfT0dJQ19WVV8xLmNybDAuoCygKoYoaHR0cDovL2NkcDEub2dpYy5ydS9DRFAvVUNfT0dJQ19WVV8xLmNybDBEBggrBgEFBQcBAQQ4MDYwNAYIKwYBBQUHMAKGKGh0dHA6Ly91Yy5vZ2ljLnJ1L0NFUlRTL1VDX09HSUNfVlVfMS5jZXIwCAYGKoUDAgIDA0EAnuMzj6hE6dyrlVerS05XugJmvxXwtLuGLRScpPqA/UeKrV1IFkZoE4EtDaW0NFNlmgjlROaqrEtSZgcx7x0EnQ==</wsse:BinarySecurityToken></wsse:Security> то алгоритм проверки подписи, изложенный в документации к SDK и в http://www.cryptopro.ru/...olzovaniem-kriptopro-netдает false. НО: если непосредственно перед проверкой подписи в блоке Signature и во всех вложенных блоках удалить префиксы, то подписанный XML прекрасно валидируется. Подглядев через Reflector, как все работает, понял что это вполне логично - при проверке сравниваются только хеши блока #body, а проблема в том, что SignedXml.Validate() почему-то не находит блок SignInfo если он снабжен префиксом
|
|
|
|
Статус: Активный участник
Группы: Администраторы, Участники Зарегистрирован: 28.04.2010(UTC) Сообщений: 140  Откуда: Крипто-Про Поблагодарили: 15 раз в 14 постах
|
Добрый день, После подписания изменять узел SignedInfo нельзя. см. xmldsig, т.к. именно он идет на подпись. Увы, SignedXml (SignedInfo, Reference) формирует эти узлы без префикса пр-ва имен. Пока единственный выход вижу: каноникальзовать и подписать SignedInfo руками (в этом случае SignedXml вообще не нужен). (смотреть XmlDsigC14NTransform)
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 13.03.2012(UTC) Сообщений: 7
|
Если открыть рефлектором сборку System.Security и в классе SignedXml проанализировать процесс вычисленияЭЦП, стартовав от метода ComputeSignature(), то видно, что непосредственно ЭЦП вычисляется от блока, идентификатор которого содержится в Reference.Uri. Это не что иное как байтовый массив, хеш, вычисленный по заданным алгоритмам, который впоследствии кладется как base64 в блок SignatureValue.
В доке к CryptoPro.NET далее делается следующее: // Вычисляем подпись. signedXml.ComputeSignature();
// Получаем представление подписи в виде XML. XmlElement xmlDigitalSignature = signedXml.GetXml();
// Добавляем необходимые узлы подписи в исходный документ в заготовленное место. xmlDocument.GetElementsByTagName("ds:Signature")[0].PrependChild( xmlDocument.ImportNode(xmlDigitalSignature.GetElementsByTagName("SignatureValue")[0], true)); xmlDocument.GetElementsByTagName("ds:Signature")[0].PrependChild( xmlDocument.ImportNode(xmlDigitalSignature.GetElementsByTagName("SignedInfo")[0], true));
т.е. методом GetXml() получаем XmlElement и из него импортируем два блока в свой документ. В этом методе (если опять же проанализировать через рефлектор) блоки Xml формируются "на лету", т.е. ПОСЛЕ вычисления ЭЦП и следовательно влиять на нее уже не могут.
Когда же мы проверяем ЭЦП методом CheckSignature(cert.PublicKey.Key), блок SignedInfo просто не находится, т.к. внутри метода для поиска используются метод XmlDocument, не учитывающий префикса. И если перед проверкой убрать префиксы хотя бы из блока SignedInfo (а лучше из Signature), то на хеш блока #body это совсем не влияет, но проверка после этого проходит нормально.
|
|
|
|
Статус: Активный участник
Группы: Администраторы, Участники Зарегистрирован: 28.04.2010(UTC) Сообщений: 140  Откуда: Крипто-Про Поблагодарили: 15 раз в 14 постах
|
Ради эксперемента можете проверить. Но снять перфикс только с SignedInfo будет не достаточно. Т.к. подписывается весь узел SignedInfo. В том же рефлекторе можно посмотреть на SignedXml.GetC14NDigest(hash), который каноканилизирует SignedInfo, и уже его хэш подписывается.
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close