|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Как мне создать такой же по структуре файл, если у меня есть все данные для Object? Или скажем, как переподписать файл, если мне надо что-то изменить внутри Object тэга? Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43.
... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2014, 13:18 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
https://www.google.ru/search?q=C# sign xml - первая же ссылка ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2014, 16:39 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны https://www.google.ru/search?q=C# sign xml - первая же ссылка да, спасибо, но приватного ключа нету.... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2014, 17:42 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Дождаться выхода квантовых компьютеров. Тогда можно будет подобрать ключ... ... |
|||
:
Нравится:
Не нравится:
|
|||
03.01.2014, 21:15 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
petalvikДождаться выхода квантовых компьютеров. Тогда можно будет подобрать ключ... ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2014, 12:05 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Исходный файл Код: xml 1. 2. 3. 4. 5. 6. 7.
Хотелось бы получить такой после подписки: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Но у меня получается такой, т.е. Signature отдельным блоком, а надо бы как выше привел: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10.
Вот код, что не так? Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2014, 12:09 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сделать это очень просто: Код: c# 1. 2. 3. 4.
но для начала рекомендую ознакомиться еще и вот с таким материалом: http://msdn.microsoft.com/ru-ru/library/ms229950(v=vs.110).aspx Результат валидации после перемещния данных документа внутрь ноды с сигнатурой будет отрицательным всегда. И идея смешать две абсолютно разнородные сущности - сигнатуру и подписываемые данные - выглядит очень странно. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2014, 13:34 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныСделать это очень просто: Код: c# 1. 2. 3. 4.
но для начала рекомендую ознакомиться еще и вот с таким материалом: http://msdn.microsoft.com/ru-ru/library/ms229950(v=vs.110).aspx Результат валидации после перемещния данных документа внутрь ноды с сигнатурой будет отрицательным всегда. И идея смешать две абсолютно разнородные сущности - сигнатуру и подписываемые данные - выглядит очень странно. спасибо! ознакомлюсь. В том мто и дело, я бы оставил как есть, стандартно, т.е. когад сигнатура отдельным блоком. Но в этом случае я получаю ошибку в приложении, что схема не валидна. Из-за этого я пытаюсь сделать файл такой же, как и существующий, созданный не мной, а у него CheckSignature выдает true (!), и у него именно такая структура. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.01.2014, 23:57 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
WinnipuhВ том мто и дело, я бы оставил как есть, стандартно, т.е. когад сигнатура отдельным блоком. Но в этом случае я получаю ошибку в приложении, что схема не валидна. Просто в SignedXml.LoadXml передается не нода сигнатуры: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58.
Полученный и подписанный xml: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
И если уж совсем нет уверенности, какой там элемент Signature по счету, его можно искать так: Код: c# 1. 2. 3.
... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 11:17 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
не проходит так Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Должно быть так: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Может они исходят не их файла, а создают класс, выведенный из XmlDocument Образно говоря так: Код: c# 1. 2. 3. 4. 5. 6. 7.
и его подписывают как-то хитро и сохраняют в файл? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 11:45 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Winnipuhне проходит так А у меня проходит. Показать скриншот с консольным выводом от вышеприведенного кода? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 12:58 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры ПавловныWinnipuhне проходит так А у меня проходит. Показать скриншот с консольным выводом от вышеприведенного кода? я прошу прощения, видимо не точно выражаюсь. Когда я подсовываю такой структуры файл в приложение (не моё), то получаю ошибку на myDoc.Load(), что схема не валидна. Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
Потом я для эксперимента руками переставляю тег, чтобы он охватывал и объект тоже Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11.
загрузка проходит, т.е. схема теперь валидна и уже дальше выдается ошибка на myDoc.CheckSignature(). Это и понятно, я влез, куда не надо было. Т.е, потому я и сделал вывод, что структура файла должна быть такой как в случае 2. Остается вопрсо, как такую структуру получить, чтоыб при этом подпись была валидна. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 13:18 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
WinnipuhКогда я подсовываю такой структуры файл в приложение (не моё), то получаю ошибку на myDoc.Load(), что схема не валидна. Да, теперь понятно - внешний xsd, в который прописали наличие сигнатуры. Хотя я тоже ступил, не заметив вот этого : Код: xml 1.
- это как раз ссылка на ноду подписываемого фрагмента (в случае пустого URI это весь документ, подробнее см. здесь: http://www.w3.org/TR/xmldsig-core/#sec-ReferenceProcessingModel) Тогда при создании документа: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19.
и тогда верификация очень проста: Код: c# 1. 2. 3. 4. 5. 6.
- сигнатура сама возьмет Reference, хранимый в ней же, по Reference найдет нужные данные, и проверит их на соответствие. Здесь есть одно "но", связанное с использованием id-атрибутов (#Settings - именно указание на id-атрибут), но это немного другая тема. Момент номер 2: при такм подписывании всё, что снаружи <Object Id='Settings'>, не подписывается. Момент номер 3: WinnipuhМожет они исходят не их файла, а создают класс, выведенный из XmlDocument - нет, в файле указано: Код: xml 1.
- это стандарт подписи именно XML. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 15:15 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
моя ошибка, делал эксперименты, Здесь есть одно "но", связанное с использованием id-атрибутов (#Settings - именно указание на id-атрибут), но это немного другая тема. Момент номер 2: при такм подписывании всё, что снаружи <Object Id='Settings'>, не подписывается. здесь везде не Settings, а AuthorizedSettings ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 15:25 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Вот что примечательно, класс (не мой), а тот который грузит хмл файл в свои поля Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15.
в качестве Save используется базовый метод ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 15:30 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Winnipuhздесь везде не Settings, а AuthorizedSettings Было и Settings: 15376176 Но это неважно - главное, чтобы при использовании XmlDsigEnvelopedSignatureTransform для URI локального документа указывался реально существующий в документе id элемента в формате xpointer scheme (#id - разумеется, только если не нужно подписывать весь документ). Winnipuhт.е. руками сами добавляют тег Добавляют namespace. В XmlNamespaceManager. Возможно, для последующего разбора (обработки элементов, относящихся к этому namespace). Метод Save к этому XmlNamespaceManager вообще никаким боком. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 15:53 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Я сдела так как вы написали выше, но получил предполагаемый результат. Вот как они делают в своем приложении: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33.
И я попадаю на Error("Invalid Signature.");, т.е. проверяется весь файл, а не часть. Собственно, как не крути, а получается, что надо и структуру сохранить, иначе дает ошибку схемы, и подписывать. И вопрос остается... ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 16:28 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
WinnipuhИ вопрос остается... Итак, выше было сделано: 1) помещение подписываемого фрагмента внутрь ноды сигнатуры - как выше и требовалось; 2) валидация сигнатуры фрагмента из п.1. на тестовом примере с учетом того, что у сигнатуры Reference URI указывает именно на тот фрагмент, который нужно было подписать. Если ничего не получилось, то причин тому, опять же, может быть 2: 1) Действительно невалидная сигнатура - например, проверяем не тем, чем подписывали; 2) Не туда указывает Reference URI. Ищите. ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 17:24 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, ищу, есть идеи. Но вот незадача, нужна ваша помощь: В вашем коде выше, в этом месте: Код: c# 1. 2. 3.
в исходном файле было так: <Object Id="AuthorizedSettings"> После загрузки исходного файла так и осталось, после добавления этого куска к сигнатуре - так и осталось, это правильно. А вот после Код: xml 1.
стало: Код: xml 1.
а это неправильно. Как избавиться от этого атрибута имеено в этой строке? ... |
|||
:
Нравится:
Не нравится:
|
|||
05.01.2014, 19:53 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Winnipuhа это неправильно. Нет, всё правильно, у ноды Object есть дефолтный неймспейс xmlns="", но в исходной разметке он не указан, потому что он наследуется с родительского узла, в котором это прописано явно: Код: xml 1. 2. 3. 4. 5. 6. 7.
Когда мы забираем узел Object, и помещаем его внутрь узла, у которого нет xmlns="" (узел Signature, имеется явно прописанный дефолтный неймспейс - прописанный выше не наследуется), парсер помнит про то, что у забираемого объекта есть неймспейс по умолчанию, и прописывает неймспейс явно. Всё остается точно так же, как и прежде. И еще раз - код с тестовым примером: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28.
Подписываем в вышеприведенном документе узел <Object Id="Settings">: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
В файле D:\Trash\1.xml получаем следующее: Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
Подписанный узел Object Id="Settings" находится внутри узла Signature, у этого узла уже явно объявлен xmlns="". Проверяем файл: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9.
- код выводит true. Тестовый проект в аттаче (только для проверки там надо будет изменить код получения X509-сертификата - этот код заточен под мое личное хранилище и личные сертификаты). ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 11:16 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, йез! спасибо! Я так сделал, а потом оптимизировал: в исходный файл явно добавил xmlns того арента, к которому он будет перемещен, а он всегда стабилен: Код: xml 1.
Всё сработало! перехожу к следующей части, возможно попрошу еще помощи ... |
|||
:
Нравится:
Не нравится:
|
|||
06.01.2014, 12:43 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Помогите разобраться я не пойму как подписать документ по вашему образцу, если мне нужно , что бы было вот так в конце <Card> ... ... <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34310-gost34311"/> <ds:Reference URI=""> <ds:Transforms> <ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> </ds:Transforms> <ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34311"/> <ds:DigestValue>4h....fd</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>JifMm.......Q==</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate>MI.......eh</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> </Card> ... |
|||
:
Нравится:
Не нравится:
|
|||
28.01.2015, 13:46 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Roman0888Помогите разобраться я не пойму как подписать документ по вашему образцу, если мне нужно , что бы было вот так в конце <Card> ... ... <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"> <ds:SignedInfo> <ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/> <ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34310-gost34311"/> <ds:Reference URI=""> <ds:Transforms> <ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> </ds:Transforms> <ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#gost34311"/> <ds:DigestValue>4h....fd</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>JifMm.......Q==</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate>MI.......eh</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> </Card> Разобрался с префиксом ds:( спасибо Сон Веры Павловны нашел в другой теме), но все ровно не пойму как и откуда id=1 в этой строке <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"> и еще такой момент что после подписания у меня так <ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> а должно быть вот так <ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> ... |
|||
:
Нравится:
Не нравится:
|
|||
02.02.2015, 08:36 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Roman0888но все ровно не пойму как и откуда id=1 в этой строке <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"> Установить нужное значение Signature.Id у SignedXml: Код: c# 1. 2.
Roman0888а должно быть вот так <ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> в референс сигнатуры добавить еще одно преобразование: Код: c# 1. 2. 3.
Roman0888Разобрался с префиксом ds:( спасибо Сон Веры Павловны нашел в другой теме) Это вы про вот это? 15173377 Это в общем-то вредный совет - если валидация сигнатуры будет проводиться дотнетовскими средствами, то после такой операции она просто не пройдет. Видимо, это баг SignedXml - несмотря на фактическую идентичность подписей (дайджест, значение сигнатуры, и KeyInfo сертификата идентичны, разница только в префиксе неймспейса), валидация после такой операции не проходит. Если включить отладочные сообщения SignedXml (как - см. здесь ), то видно, что у подписей разный фактический хэш. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 08:38 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Спасибо что ответили очень нуждаюсь в помощи, да про префикс ds: я взял от туда. вообщем после получилось <ds:Signature Id="1" xmlns:ds=" http://www.w3.org/2000/09/xmldsig#"> а нужно <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"> Чтобы всех не путать объясню что и как есть сторонняя программа которая подписывает и отправляет xml вот так <Request> <Login>11</Login> <Password>11</Password> <Data><?xml version="1.0" encoding="utf-16"?><DC xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" version="2" xmlns=" http://........edit"> <Id xsi:nil="true"/><LastId>1</LastId> <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"><ds:SignedInfo> <ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>< ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#rsa-sha1"/> <ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> <ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/></ds:Transforms> <ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#sha1"/> <ds:DigestValue>dR7...E=</ds:DigestValue> </ds:Reference> </ds:SignedInfo> <ds:SignatureValue>VaL...=</ds:SignatureValue> <ds:KeyInfo> <ds:X509Data> <ds:X509Certificate>MIIIE....G</ds:X509Certificate> </ds:X509Data> </ds:KeyInfo> </ds:Signature> </DC> </Data> </Request> Я когда в свою программу вставляю что находится внутри <Data> , то все отправляется нормально! Но когда я подписываю xml сам и заменяю "<" на "<" то сервер выдает ответ ошибка цифровой подписи. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 10:57 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
меняю < на < ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 10:59 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Roman0888а нужно <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"> Вот в этом-то точно нет никакго смысла - расположение атрибутов в узле не влияет на данные, представляющие xml. Если это вдруг важно для принимающей стороны, то вырвать тем программистам ноги и голову. А вам уже не останется ничего, кроме XSLT, т.к. никакого контроля снаружи для формирования выходного дерева подписи API не предоставляет. Ну, или еще можно руками удалить атрибут Id, и добавить его снова - эмпирически он должен добавиться в конец списка атрибутов, т.е. после объявления неймспейса (но с т.з. теории такой гарантии нет - это отдано целиком на откуп парсеру, т.е. implementation-specific). Roman0888Но когда я подписываю xml сам и заменяю "<" на "<" то сервер выдает ответ ошибка цифровой подписи. 1. Попробуйте всё-таки отослать подпись без префикса ds - как я уже писал в другой теме, в нем нет никакого особенного смысла. 2. Если уж без него никак - можно попробовать вот такой хак: Код: c# 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27. 28. 29. 30. 31. 32. 33. 34. 35. 36. 37. 38. 39. 40. 41. 42. 43. 44. 45. 46. 47. 48. 49. 50. 51. 52. 53. 54. 55. 56. 57. 58. 59. 60. 61. 62. 63. 64. 65. 66. 67. 68. 69. 70. 71. 72. 73. 74. 75. 76. 77. 78. 79. 80. 81. 82.
соответственно, использовать вот так: Код: c# 1. 2. 3.
но это уже на ваш страх и риск - нет никаких гарантий что в будущем в очередной версии фреймворка будет метод BuildDigestedReferences, вызываемый через рефлекшн, или что логика GetC14NDigest останется прежней, и т. п. ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 11:18 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Отлично! опробовал - расположение id на самом деле не имеет значения . Разгадка близка)) 1) Скажите при подписывании будет разница между "<" "&_lt;" 2) не могли бы вы изменить код так чтобы подписывалось только то что находится внутри <Data> using System; using System.IO; using System.Linq; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Xml; using System.Xml; namespace test { class Program { static void Main() { const string quote = "\""; SignXml(@"<Data> <DC> </DC>" </Data>, Certificate, @"C:\24.xml"); var xd = new XmlDocument(); xd.Load(@"c:\24.xml"); var checker = new SignedXml(xd); // сигнатура - последний дочерний элемент корня var signature = (XmlElement)xd.SelectSingleNode("/*/*[last()]"); checker.LoadXml(signature); var res = checker.CheckSignature(Certificate.PrivateKey); Console.WriteLine(res); Console.WriteLine(quote); Console.ReadKey(true); } static X509Certificate2 Certificate { get { var cert = new X509Certificate2(); cert.Import("C:\\cert\\GOST.p12", "pass", X509KeyStorageFlags.MachineKeySet); return cert; } } static void SignXml(string content, X509Certificate2 certificate, string filePath) { var xd = new XmlDocument(); xd.LoadXml(content); var sx = new SignedXml(xd) { SigningKey = certificate.PrivateKey }; sx.Signature.Id = "1"; var @ref = new Reference { Uri = string.Empty }; @ref.AddTransform(new XmlDsigEnvelopedSignatureTransform()); @ref.AddTransform(new XmlDsigC14NWithCommentsTransform()); sx.AddReference(@ref); var keyInfo = new KeyInfo(); var keyData = new KeyInfoX509Data(certificate); keyInfo.AddClause(keyData); sx.KeyInfo = keyInfo; sx.ComputeSignature(); var signature = sx.GetXml(); signature.AppendChild(xmlDoc.DocumentElement.ChildNodes[0]);[SRC C#][/SRC] xd.DocumentElement.AppendChild(signature); using (var fs = new FileStream(filePath, FileMode.Create)) using (var xw = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true })) xd.Save(xw); } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 13:07 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Вот еще момент : после добавлении строки - sx.Signature.Id = "1"; <DC> - до подписания <Id xsi:nil="true"/> ..... </DC> после подписания становится вот так - хотя она должна остаться на своем месте <DC> ...... <Signature Id="1" xmlns=" http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> .... </KeyInfo> <Id xsi:nil="true" xmlns=" http://n.......edit" /> </Signature> </DC> ... |
|||
:
Нравится:
Не нравится:
|
|||
03.02.2015, 13:56 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Roman0888меняю < на < Roman08881) Скажите при подписывании будет разница между "<" "&_lt;" Это еще зачем? Приведите более-менее подробные примеры исходного XML, и подписанного в том виде, в котором его предоставляет стороняя программа. Каждый пример заключите в тэг [SRС XML] - внутри него XML entities не преобразуются в символы: Код: xml 1. 2. 3.
Roman08882) не могли бы вы изменить код так чтобы подписывалось только то что находится внутри <Data> Не могу. Точнее, могу, но без префикса ds - c этим префиксом вышеприведенный хак не работает для случая подписания узла внутри документа (подпись не проходит проверку), он работает только для документа целиком. Можно утверждать, что средствами .NET FCL невозможно сделать подпись с префиксом неймспейса - по крайней мере, гугл не предлагает ничего другого, кроме того, что я привел выше. И используйте тэг [src] - невозможно же читать код в таком виде, как у вас. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 07:05 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Вообщем мне нужно подписать то что внутри <Data>......</Data>, это вложенный документ. Т.е я отправляю soap запрос внутри которого подписанный xml. внутри Data - должен находится тот самый подписанный xml Код: xml 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26.
можно попробовать без тега DS: я использовал ваш исходник , с вашей помощью изменил , но он подписывает вместе с <Data> а если начинаю с Код: xml 1.
ошибку про символы ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 07:33 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Roman0888а если начинаю с Код: xml 1.
ошибку про символы Потому что это уже не XML, а обычный текст, и средствами System.Security.Cryptography.Xml вы это не подпишете никак. Либо помещайте ваш XML без XML declaration внутрь Data как дочерний узел, либо внутри Data создавайте CDATA-секцию, и подписывайте узел, содержащий эту секцию. ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 07:39 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
В примере не весь документ , а часть его. Еще я заметил если я меняю расположение строк в xml файле сделанный другой программой, и подставляю в свою, то тоже выдает ошибку не верная подпись, может из за этого моя тоже не проходить? ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 07:41 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
вот код которым я подписываю хотелось бы подписать то что внутри DATA при этом Uri ="" осталось бы пустым using System; using System.IO; using System.Linq; using System.Security.Cryptography.X509Certificates; using System.Security.Cryptography.Xml; using System.Xml; namespace test { class Program { static void Main() { const string quote = "\""; SignXml(@"<Data><DC xmlns:xsi=" + quote + " http://www.w3.org/2001/XMLSchema-instance" + quote + " xmlns:xsd=" + quote + " http://www.w3.org/2001/XMLSchema" + quote + " version=" + quote + "2" + quote + " xmlns=" + quote + " http://........it" + quote + "><Id xsi:nil=" + quote + "true" + quote + "/><LastId>5</LastId> .... </DC></Data>", Certificate, @"C:\1.xml"); var xd = new XmlDocument(); xd.Load(@"C:\1.xml"); var checker = new SignedXml(xd); // сигнатура - последний дочерний элемент корня var signature = (XmlElement)xd.SelectSingleNode("/*/*[last()]"); checker.LoadXml(signature); var res = checker.CheckSignature(Certificate.PrivateKey); Console.WriteLine(res); Console.ReadKey(true); } static X509Certificate2 Certificate { get { var cert = new X509Certificate2(); cert.Import("C:\\cert\\GOST.p12", "pass", X509KeyStorageFlags.MachineKeySet); return cert; } } static void SignXml(string content, X509Certificate2 certificate, string filePath) { var xd = new XmlDocument(); xd.LoadXml(content); var sx = new SignedXml(xd) { SigningKey = certificate.PrivateKey }; sx.Signature.Id = "1"; var @ref = new Reference { Uri = string.Empty }; @ref.AddTransform(new XmlDsigEnvelopedSignatureTransform()); @ref.AddTransform(new XmlDsigC14NWithCommentsTransform()); sx.AddReference(@ref); var keyInfo = new KeyInfo(); var keyData = new KeyInfoX509Data(certificate); keyInfo.AddClause(keyData); sx.KeyInfo = keyInfo; sx.ComputeSignature(); var signature = sx.GetXml(); // сигнатура будет последним дочерним элементом корня xd.DocumentElement.AppendChild(signature); using (var fs = new FileStream(filePath, FileMode.Create)) using (var xw = XmlWriter.Create(fs, new XmlWriterSettings { Indent = true })) xd.Save(xw); } } } ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 07:57 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, Говоря про xml без XML declaration вы имеет ввиду Код: xml 1.
... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 08:00 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Roman0888, Если я вас правильно понял, то мне эта строчка там не нужна,я просто в своем запросе сделаю так: я проверил так уходит <Request>_ <Login>...</Login> <Password>....</Password> <Data><?xml version=" & Chr(34) & "1.0" & Chr(34) & " encoding=" & Chr(34) & "utf-16" & Chr(34) & "?> .... (тут подписанный xml) ...... </Data> </Request> ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 08:11 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
в общем после множества испытаний я пришел вот к чему спасибо за это Сон веры Павловны 1)вместо того чтобы писать Код: xml 1.
можно сделать [CDATA[ .... это на самом деле проще и лучше. 2)Внутри [CDATA[ не нужно вот это <?xml version="1.0" encoding="utf-8"?> теперь по запросу. я отправляю так "<Request><Login>...</Login><Password>....</Password><Data><![CDATA[" & line & "]]></Data>" где line - нужный мне подписанный xml. Если я вставляю в line xml сгенирированный сторонней программой которsq выглядит так, предварительно ручками заменив Код: xml 1.
<DC xmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" version="2" xmlns=" http://n..it"><Id xsi:nil="true"/><LastId xsi:nil="true"/>........ <ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#" Id="1"><ds:SignedInfo><ds:CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><ds:SignatureMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#rsa-sha1"/><ds:Reference URI=""><ds:Transforms><ds:Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><ds:Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/></ds:Transforms><ds:DigestMethod Algorithm=" http://www.w3.org/2001/04/xmldsig-more#sha1"/><ds:DigestValue>qoi.....=</ds:DigestValue></ds:Reference></ds:SignedInfo><ds:SignatureValue>hJ........=</ds:SignatureValue><ds:KeyInfo><ds:X509Data><ds:X509Certificate>MII.....ii</ds:X509Certificate></ds:X509Data></ds:KeyInfo></ds:Signature></DC> А если же я подписываю сам то получается вот что <DCxmlns:xsi=" http://www.w3.org/2001/XMLSchema-instance" xmlns:xsd=" http://www.w3.org/2001/XMLSchema" version="2" xmlns=" http://....it"> <Id xsi:nil="true" /> <LastId>6845195</LastId> ......... <Signature Id="1" xmlns=" http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315" /> <SignatureMethod Algorithm=" http://www.w3.org/2000/09/xmldsig#rsa-sha1" /> <Reference URI=""> <Transforms> <Transform Algorithm=" http://www.w3.org/2000/09/xmldsig#enveloped-signature" /> <Transform Algorithm=" http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments" /> </Transforms> <DigestMethod Algorithm=" http://www.w3.org/2000/09/xmldsig#sha1" /> <DigestValue>R....M=</DigestValue> </Reference> </SignedInfo> <SignatureValue>Kxe......n50jzxnqQ==</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MII.........nOfIxO3q/bG</X509Certificate> </X509Data> </KeyInfo> </Signature> </DC> Выдает "Ошибку Подписи XML Скажите Может дело в том , что не в одну строчку записан мною подписанный XML или еще заметил вот что - Код: xml 1.
для подписания использую код в спойлере выше Подскажите пожалуйста, как решить (осталось только подписать документ и моя программа готова) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 12:26 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Поискав в интернете нашел вот еще кое что Код: vbnet 1. 2. 3. 4. 5. 6. 7. 8. 9. 10. 11. 12. 13. 14. 15. 16. 17. 18. 19. 20. 21. 22. 23. 24. 25. 26. 27.
после выполнения получил одинаковые <DigestValue> и <X509Certificate> , но совершенно разные <SignatureValue> ,с моей предыдущей подписью сделанной в test ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 12:51 |
|
Как сделать Signature в XML файле?
|
|||
---|---|---|---|
#18+
Сон Веры Павловны, не подскажите как в предыдущем ранее коде на c# сделать так , чтобы после подписания xml в одну строку был записан? Все таки мне кажется , что ошибка как раз из за этого (потому что если я меняю в xml сделанный в стор.программе расположение строчки, то выходит аналогичная ошибка) ... |
|||
:
Нравится:
Не нравится:
|
|||
04.02.2015, 15:30 |
|
|
start [/forum/topic.php?all=1&fid=20&tid=1401949]: |
0ms |
get settings: |
12ms |
get forum list: |
14ms |
check forum access: |
4ms |
check topic access: |
4ms |
track hit: |
34ms |
get topic data: |
13ms |
get forum data: |
3ms |
get page messages: |
65ms |
get tp. blocked users: |
2ms |
others: | 13ms |
total: | 164ms |
0 / 0 |