Хотел попросить рассмотреть возможность поддержки работы с префиксом на блок Signature лично столкнулся с проблемой на примере сервиса ГИИС ДМДК https://dmdk.ru они отступают от стандарта и требуют префикс причем только "ds" пока решил временным костылём но хочется видеть интегрированное в библиотеку, более изящное и лаконичное решение так как не имею опыта работы с xml прикладываю то, что у меня работает.
Работающий код:
`
public static void SignDmdkXml(string requestFileName, string requestSignedFileName,
X509Certificate2 certificate, bool saveFormat = true)
{
// Подгружаем документ
var xdoc = new XmlDocument
{
PreserveWhitespace = saveFormat
};
xdoc.Load(requestFileName);
// Создание подписчика XML-документа
var signedXml = new PrefixedSignedXml(xdoc,"ds")
{
// Установка ключа для создания подписи
SigningKey = certificate.PrivateKey,
SignedInfo =
{
// Установка алгоритма нормализации узла SignedInfo (в соответствии с методическими рекомендациями СМЭВ)
CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl,
// Установка алгоритма хэширования (в соответствии с методическими рекомендациями СМЭВ)
SignatureMethod = CPSignedXml.XmlDsigGost3410_2012_256Url
}
};
// Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования
var dataReference = new Reference
{
Uri = "#body",
DigestMethod = CPSignedXml.XmlDsigGost3411_2012_256Url
};
// Метод преобразования, применяемый к данным перед их подписью (в соответствии с методическими рекомендациями СМЭВ)
dataReference.AddTransform(new XmlDsigExcC14NTransform());
dataReference.AddTransform(new XmlDsigSmevTransform());
signedXml.SafeCanonicalizationMethods.Add("urn://smev-gov-ru/xmldsig/transform");
// Установка ссылки на узел
signedXml.AddReference(dataReference);
// Установка информации о сертификате, который использовался для создания подписи
var keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certificate));
signedXml.KeyInfo = keyInfo;
// Вычисление подписи
signedXml.ComputeSignature();
// Получение XML-представления подписи
var signatureXml = signedXml.GetXml();
//// Добавление подписи в исходный документ
xdoc.GetElementsByTagName("ns:CallerSignature")[0].AppendChild(xdoc.ImportNode(signatureXml, true));
// Охраняем документ в выходной файл
if (!saveFormat)
{
var settings = new XmlWriterSettings
{
Indent = false,
NewLineChars = Empty
};
using var writer = XmlWriter.Create(requestSignedFileName, settings);
xdoc.Save(writer);
}
else
xdoc.Save(requestSignedFileName);
}
}
Доброго дня!
Спасибо за продукт! Очень выручаете!
Хотел попросить рассмотреть возможность поддержки работы с префиксом на блок Signature лично столкнулся с проблемой на примере сервиса ГИИС ДМДК https://dmdk.ru они отступают от стандарта и требуют префикс причем только "ds" пока решил временным костылём но хочется видеть интегрированное в библиотеку, более изящное и лаконичное решение так как не имею опыта работы с xml прикладываю то, что у меня работает.
Работающий код:
` public static void SignDmdkXml(string requestFileName, string requestSignedFileName, X509Certificate2 certificate, bool saveFormat = true) { // Подгружаем документ var xdoc = new XmlDocument { PreserveWhitespace = saveFormat };
`
Использую обвертку над XmlSigned:
` ///
/// Thx https://stackoverflow.com/a/12343267
///
public class PrefixedSignedXml : SignedXml
{
private readonly string _prefix;
`