powered by simpleCommunicator - 2.0.56     © 2025 Programmizd 02
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подписывание XML - ветка подписи в пространстве имен
12 сообщений из 12, страница 1 из 1
Подписывание XML - ветка подписи в пространстве имен
    #38473599
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Здравствуйте.
Мне надо сделать цифровую подпись для 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.
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.
<?xml version="1.0" encoding="UTF-8" standalone="no"?><kz.quest>
  <status>-1</status>
  <personInfo>
    <currentFIO>
      <birthDate>
        <time>431398800000</time>
        <timezone>GMT</timezone>
      </birthDate>
      <middleName>ИВАНОВ</middleName>
      <name>ИВАН</name>
      <surName>ИВАНОВИЧ</surName>
    </currentFIO>
  </personInfo>
  <realtyInfo>
    <buildingNumber>189</buildingNumber>
    <cooperativeCode/>
    <flatNumber/>
    <streetCode>1000000000000077324</streetCode>
    <realtyType>4</realtyType>
    <corpus/>
  </realtyInfo>
  <language>ru</language>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<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>xkQhIEasdferqwerqwergasdf6M=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>
pBPR15sQ/WBasdfasdfRlMrn1+1Ukrx02OOGRRyHdVhPmYVN367qN2Fu5KLCVpTGkI4PQGsR24wE
3IEkwqCf7wfTFdNpiglFkfsW9Gl1JXasdfasdfasfb2UUlQfohE6wRSpawQvCSp6VbBCLz/bXrm8
QLBprAfG4lasdfasfasdfasdfasfdasdfasdfafhjhjfdjhfjhejfhjehfjhehjfhejhfjehfjhD
M+mNAyum2jmYlN4bl+ij0U9Yi8l8pkewyQsoR6qvn7OCEqH6Ds/ESxlydIzlWHBAX5AODtMiKfI7
yzpasd1oTwefefefeffefefefeefefeffefeffe=
</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509Certificate>
MIIIRTCCBi2gAwIBAgIgd++9pO/1bWj1SmT1mRQnJHNFbjmTX7yZVl0Ae/OWVd4wDQYJKoZIhvcN
AQEFBQAwggEPMRowGAYDVQQDDBHQndCj0KYg0KDQmiAoUlNBKTFDMEEGA1UECww60JjQvdGE0YDQ
.............
KI0+k7zlmoY+bY4pDoR46/7ml7BlofGeSl79xtIF3BFNjwP6UiyM7AQhj2Pm35zA+F/fHjdKLXXF
AIx6qWaJX0+ctyEi
</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
</ds:Signature></kz.questt>



Во-первых, само тело ХМЛя - с отступами, а ХМЛ цифровой подписи без отступов. Как так можно сделать в одном документе?

Во-вторых, каждый элемент цифровой подписи идет с префиксом пространства имен, в том числе и самый первый член, в котором это пространство задается (<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#">). Как делается такое?

Пробовал при импорте подписи устанавливать префикс:
Код: vbnet
1.
2.
3.
4.
Dim impEl As XmlElement
impEl = doc.ImportNode(xmlDigitalSignature, True)
impEl.Prefix = "ds"
doc.DocumentElement.AppendChild(impEl)


в результате первая строка получается такой как надо
Код: xml
1.
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" />


(и опять таки с пробелом, собака), а остальные все равно без префикса "ds:"
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38473714
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамВо-первых, само тело ХМЛя - с отступами, а ХМЛ цифровой подписи без отступов. Как так можно сделать в одном документе?
Отформатировать документ с импортированной нодой подписи через XmlWriter не судьба?
ДиамВо-вторых, каждый элемент цифровой подписи идет с префиксом пространства имен, в том числе и самый первый член, в котором это пространство задается (<ds:Signature xmlns:ds=" http://www.w3.org/2000/09/xmldsig#">). Как делается такое?
А зачем вам этот префикс? У ноды сигнатуры объявлен неймспейс по умолчанию, все дочерние ноды без префиксов принадлежат этому неймспейсу. Вы хотите в ноду с подписью внедрить еще какие-то элементы не из http://www.w3.org/2000/09/xmldsig# ?

Диам(и опять таки с пробелом, собака)
Этот пробел не влияет на цифровую подпись.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38473857
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамМне надо сделать цифровую подпись для XML и получить результирующий файл с включенной подписью.

А с чего вы взяли, что при ЭЦП сама подпись включается как нода в подписываемый XML документ? Более того, делать подпись зависимой от форматирования - это неправильно.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38473930
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79,

Включается, если её вставляют в документ - почему бы, собственно, и нет? На msdn есть пример на эту тему именно с включением подписи в сам документ.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38473976
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Пример можно? Просто бессмысленно. Подпись, включаемая как элемент подписанного сообщения, портит само сообщение.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474018
Диам
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
А с чего вы взяли, что при ЭЦП сама подпись включается как нода в подписываемый XML документ?
Почитал документацию, и кроме того, я привел образец, в котором подпись вставлена в документ. Вы читали мое первое сообщение?
Прежде чем делать подписывание я почитал документацию (худо бедно, может чего недопонял, но почитал), теперь спрашиваю.

В одной из статей говорилось о важности сохранения форматирования у отправителя и получателя, т.к. если формирование одинаковых узлов у нас будет происходить по разному, то и подпись проверку не пройдет.

Вообще, я хотел бы оставить в стороне разговор именно о правильности подписывания. Даже если я делаю это неправильно, меня интересуют те вопросы, которые я задал в первом посте.
Как же все таки импортировать узел, чтобы в нем были все узлы с префиксами? Может быть это как-то можно задать в объекте SignedXml ?
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474126
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
ДиамА с чего вы взяли, что при ЭЦП сама подпись включается как нода в подписываемый XML документ?
Что значит, с чего? С вашего же примера.

ДиамПрежде чем делать подписывание я почитал документацию (худо бедно, может чего недопонял, но почитал), теперь спрашиваю.
Судя по всему, немного недопоняли. ЭЦП по сути своей - хэш-функция от набора байтов. Что этот набор из себя представляет - неважно.

Поэтому как вариант: вам нужно взять оригинальный XML-документ и сохранить его (превратить в байты). по этим байтам вы получаете подпись (как приплюсованную к оригинальному набору байтов, так и отсоединенную).

Затем создаете новый XML-документ, в который и добавляете все нужное (оригинальный набор байтов, цифровые подписи, используемые для проверки сертификаты, и так далее), используя base64

Для наглядности можете продублировать поля исходного XML-документа, но только для наглядности.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474127
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Пример можно?
http://msdn.microsoft.com/en-us/library/ms229745(v=vs.110).aspx
Arm79Просто бессмысленно. Подпись, включаемая как элемент подписанного сообщения, портит само сообщение.
Смысл вполне есть - при включении вместе с подписью открытого ключа адресат имеет возможность сразу же верифицировать полученные данные. А вы теперь объясните, что значит "портит само сообщение".

Arm79В одной из статей говорилось о важности сохранения форматирования у отправителя и получателя, т.к. если формирование одинаковых узлов у нас будет происходить по разному, то и подпись проверку не пройдет.
Говорят, в Москве кур доят.
Код: 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.
class Program
{
  static void Main()
  {
    var keyStore = new X509Store(StoreName.My, StoreLocation.CurrentUser);
    keyStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadWrite);
    var cert = keyStore.Certificates.Find(
      X509FindType.FindBySubjectDistinguishedName,
      "CN=MyCert", false
      ).Cast<X509Certificate2>().FirstOrDefault(
        c => !string.IsNullOrEmpty(c.Thumbprint) &&
        c.HasPrivateKey &&
        c.NotAfter > DateTime.Now &&
        c.NotBefore < DateTime.Now);
    var sign1 = GetSign(@"
      <root>
        <node id='1'>
          <text></text>
          <leaf/>
        </node>
      </root>
      ", cert);
    var sign2 = GetSign(@"<root><node id='1'><text></text><leaf /></node></root>",
                        cert);
    Console.WriteLine(sign1.SequenceEqual(sign2));
    Console.WriteLine("done");
    Console.ReadKey(true);
  }

  static byte[] GetSign(string strXml, X509Certificate2 certificate)
  {
    var xd = new XmlDocument();
    xd.LoadXml(strXml);
    var sx = new SignedXml(xd) { SigningKey = certificate.PrivateKey };
    var @ref = new Reference { Uri = string.Empty };
    @ref.AddTransform(new XmlDsigEnvelopedSignatureTransform());
    sx.AddReference(@ref);
    var keyInfo = new KeyInfo();
    var keyData = new KeyInfoX509Data(certificate);
    keyInfo.AddClause(keyData);
    sx.KeyInfo = keyInfo;
    sx.ComputeSignature();
    return sx.SignatureValue;
  }
}


Диам Как же все таки импортировать узел, чтобы в нем были все узлы с префиксами? Может быть это как-то можно задать в объекте SignedXml ?
Неистребима всё же любовь к изобретению собственных велосипедов с квадратными колесами. Через SignedXml - никак: http://stackoverflow.com/questions/12219232/xml-signature-ds-prefix
Если вам действительно нечего делать - рекурсия либо XPath для выбора всех нод узла подписи, и всем полченным нодам указать префикс. Типа такого:
Код: c#
1.
2.
3.
4.
5.
6.
...............
sx.ComputeSignature();
var sign = sx.GetXml();
sign.SelectNodes(@"//descendant-or-self::*").Cast<XmlElement>()
  .ToList().ForEach(n=>n.Prefix="ds");
xd.DocumentElement.AppendChild(sign);
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474137
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79Поэтому как вариант: вам нужно взять оригинальный XML-документ и сохранить его (превратить в байты). по этим байтам вы получаете подпись
Зачем??? Чтобы как раз зависеть форматирования документа? SignedXml вычисляет подпись на основании данных DOM-модели, не по текстовому представлению данных.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474182
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры Павловны,

Интересно, спасибо, буду знать. Правда, сильно неуниверсально, но если пренебречь зависимостью от BCL, выглядит здорово.

Сон Веры ПавловныArm79В одной из статей говорилось о важности сохранения форматирования у отправителя и получателя
А это откуда? Это к Диам, я такого не писал :-)
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474185
Arm79
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Сон Веры ПавловныЗачем??? Чтобы как раз зависеть форматирования документа?
Вы немного увлеклись. Не обязательно XML. Обмениваться можно любыми файлами.
...
Рейтинг: 0 / 0
Подписывание XML - ветка подписи в пространстве имен
    #38474415
Сон Веры Павловны
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Участник
Arm79А это откуда? Это к Диам, я такого не писал :-)
Да, пардон, промахнулся, это к нему.
Arm79Вы немного увлеклись. Не обязательно XML. Обмениваться можно любыми файлами.
Да я бы тоже использовал здесь что-нибудь типа бинарной сериализации, но вот ТС понадобился именно XML.
...
Рейтинг: 0 / 0
12 сообщений из 12, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / Подписывание XML - ветка подписи в пространстве имен
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


Просмотр
0 / 0
Close
Debug Console [Select Text]