powered by simpleCommunicator - 2.0.49     © 2025 Programmizd 02
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# ЕЦП в XML файл
2 сообщений из 2, страница 1 из 1
C# ЕЦП в XML файл
    #39912187
tatanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Здравствуйте!
Помогите разобраться. Мне нужно в 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
C# ЕЦП в XML файл
    #39912190
tatanat
Скрыть профиль Поместить в игнор-лист Сообщения автора в теме
Гость
Все получилось:
надо поменять

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
2 сообщений из 2, страница 1 из 1
Форумы / WinForms, .Net Framework [игнор отключен] [закрыт для гостей] / C# ЕЦП в XML файл
Целевая тема:
Создать новую тему:
Автор:
Закрыть
Цитировать
Найденые пользователи ...
Разблокировать пользователей ...
Читали форум (0):
Пользователи онлайн (0):
x
x
Закрыть


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