Коллеги, столкнулся с тем что стандартный пример от крипто про по подписи двумя сертификатами не работает.
Задал вопрос на их форуме:
https://www.cryptopro.ru/forum2/default.aspx?g=posts&m=101896#post101896
Если кто сталкивался, буду благодарен.
подпись происходит так:
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.
// Подписывает XML документ и сохраняем подпись в документе.
static void SignXmlDocument(XmlDocument doc,
AsymmetricAlgorithm Key, X509Certificate Certificate)
{
// Создаем объект SignedXml по XML документу.
SignedXml signedXml = new SignedXml(doc);
// Добавляем ключ в SignedXml документ.
signedXml.SigningKey = Key;
// Создаем ссылку на node для подписи.
// При подписи всего документа проставляем "".
Reference reference = new Reference();
reference.Uri = "";
// Явно проставляем алгоритм хэширования,
// по умолчанию SHA1.
reference.DigestMethod =
CPSignedXml.XmlDsigGost3411Url;
// Добавляем transform на подписываемые данные
// для удаления вложенной подписей, не только
// собственной.
XmlDsigXPathTransform xpath = CreateXPathTransform();
reference.AddTransform(xpath);
// Добавляем ссылку на подписываемые данные
signedXml.AddReference(reference);
// Создаем объект KeyInfo.
KeyInfo keyInfo = new KeyInfo();
// Добавляем сертификат в KeyInfo
keyInfo.AddClause(new KeyInfoX509Data(Certificate));
// Добавляем KeyInfo в SignedXml.
signedXml.KeyInfo = keyInfo;
// Можно явно проставить алгоритм подписи: ГОСТ Р 34.10.
// Если сертификат ключа подписи ГОСТ Р 34.10
// и алгоритм ключа подписи не задан, то будет использован
// XmlDsigGost3410Url
// signedXml.SignedInfo.SignatureMethod =
// CPSignedXml.XmlDsigGost3410Url;
// Вычисляем подпись.
signedXml.ComputeSignature();
// Получаем XML представление подписи и сохраняем его
// в отдельном node.
XmlElement xmlDigitalSignature = signedXml.GetXml();
// Добавляем node подписи в XML документ.
doc.DocumentElement.AppendChild(doc.ImportNode(
xmlDigitalSignature, true));
}
проверка подписи:
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.
// Проверка подписи под XML документом.
static void VerifyXmlFile(String Name)
{
// Создаем новый XML документ в памяти.
XmlDocument xmlDocument = new XmlDocument();
// Сохраняем все пробельные символы, они важны при проверке
// подписи.
xmlDocument.PreserveWhitespace = true;
// Загружаем подписанный документ из файла.
xmlDocument.Load(Name);
// Ищем все node "Signature" и сохраняем их в объекте XmlNodeList
XmlNodeList nodeList = xmlDocument.GetElementsByTagName(
"Signature", SignedXml.XmlDsigNamespaceUrl);
// Проверяем все подписи.
for (int curSignature = 0; curSignature < nodeList.Count; curSignature++)
{
// Создаем объект SignedXml для проверки подписи документа.
SignedXml signedXml = new SignedXml(xmlDocument);
// Загружаем узел с подписью.
signedXml.LoadXml((XmlElement)nodeList[curSignature]);
// Проверяем подпись и выводим результат.
bool result = signedXml.CheckSignature();
// Выводим результат проверки подписи в консоль.
if (result)
Console.WriteLine("XML подпись[{0}] верна.", curSignature + 1);
else
Console.WriteLine("XML подпись[{0}] не верна.", curSignature + 1);
}
}