Гость
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# ЕЦП в XML файл / 2 сообщений из 2, страница 1 из 1
09.01.2020, 18:50
    #39912187
tatanat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# ЕЦП в XML файл
Здравствуйте!
Помогите разобраться. Мне нужно в XML файл добавить электронную подпись. 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.
<?xml version="1.0" encoding="utf-8"?>
<PROV Id="Prov">
	<header>
		<Security>
			<Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
				<SignedInfo>
					<CanonicalizationMethod Algorithm="..." />
					<SignatureMethod Algorithm="..." />
					<Reference URI="#Prov">
						<Transforms>
							<Transform Algorithm="..." />
						</Transforms>
						<DigestMethod Algorithm="..." /> <DigestValue>...</DigestValue>
					</Reference>
				</SignedInfo>
			<SignatureValue>...</SignatureValue>
			<KeyInfo>
				<X509Data>
					<X509Certificate>...
					</X509Certificate>
				</X509Data>
			</KeyInfo>
		</Signature>
	</Security>
</header>
<body>
	<param1>12364</param1>
	<param2>87535</param2>
</body>
</PROV>



У меня <Signature> вставляется в конец (перед </PROV>). Как нужно сделать правильно?
Код: 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.
X509Certificate2Collection fcollection = (X509Certificate2Collection)store.Certificates;
X509Certificate2Collection collection =
	X509Certificate2UI.SelectFromCollection(fcollection,
    "выбор сертификата",
    "выбор сертификата для построения цепочки",
	X509SelectionFlag.SingleSelection);
X509Certificate2 sert = collection[0];

XmlDocument doc = new XmlDocument();
doc.PreserveWhitespace = false;
// ishxml- исходный XML-файл
doc.Load(new XmlTextReader(ishxml));

SignedXml signedXml = new SignedXml(doc);
RSACryptoServiceProvider key1 = (RSACryptoServiceProvider)sert.PrivateKey;
SignedXml.SigningKey = key1;

Reference reference = new Reference();
reference.Uri = "#Prov";
XmlDsigEnvelopedSignatureTransform env = new XmlDsigEnvelopedSignatureTransform();
reference.AddTransform(env);
signedXml.AddReference(reference);

KeyInfo keyInfo = new KeyInfo();
KeyInfoX509Data keyInfoData;
keyInfoData = new KeyInfoX509Data(sert);
keyInfo.AddClause(keyInfoData);
signedXml.KeyInfo = keyInfo;

signedXml.ComputeSignature();

XmlElement xmlDigitalSignature = signedXml.GetXml();

doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

XmlTextWriter xmltw = new XmlTextWriter(rezxml, new UTF8Encoding(false));
doc.WriteTo(xmltw);
xmltw.Close();
...
Рейтинг: 0 / 0
09.01.2020, 19:00
    #39912190
tatanat
Гость
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
C# ЕЦП в XML файл
Все получилось:
надо поменять

doc.DocumentElement.AppendChild(doc.ImportNode(xmlDigitalSignature, true));

на

XmlNamespaceManager nsmgr = new XmlNamespaceManager(doc.NameTable);
nsmgr.AddNamespace("Signarury", "");
doc.SelectSingleNode("/PROV/header/security", nsmgr).AppendChild(doc.ImportNode(xmlDigitalSignature, true));
...
Рейтинг: 0 / 0
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# ЕЦП в XML файл / 2 сообщений из 2, страница 1 из 1
Целевая тема:
Создать новую тему:
Автор:
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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