private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, X509Certificate2 signingCertificate) { // Создание подписчика XML-документа var signedXml = new GostSignedXml(xmlDocument); // Установка ключа для создания подписи signedXml.SetSigningCertificate(signingCertificate); // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования var dataReference = new Reference { Uri = "#Id1", DigestMethod = GostSignedXml.XmlDsigGost3411Url }; // Установка ссылки на узел signedXml.AddReference(dataReference); // Установка информации о сертификате, который использовался для создания подписи var keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(signingCertificate)); signedXml.KeyInfo = keyInfo; // Вычисление подписи signedXml.ComputeSignature(); // Получение XML-представления подписи var signatureXml = signedXml.GetXml(); // Добавление подписи в исходный документ xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true)); return(xmlDocument); }
private void SignHeaderSmev() { Log(" подписание заголовка"); XmlDocument signNode = new XmlDocument(); signNode.InnerXml = Resources.SMEVHeader; // Создание подписчика XML-документа var signedXml = new GostSignedXml(file) { GetIdElementHandler = GetSmevIdElement }; // Установка ключа для создания подписи signedXml.SetSigningCertificate(certSP); // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования ГОСТ Р 34.11-94 (в соответствии с методическими рекомендациями СМЭВ) var dataReference = new Reference { Uri = "#body", DigestMethod = GostSignedXml.XmlDsigGost3411ObsoleteUrl }; // Метод преобразования, применяемый к данным перед их подписью (в соответствии с методическими рекомендациями СМЭВ) // dataReference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); dataReference.AddTransform(new XmlDsigExcC14NTransform()); // Установка ссылки на узел signedXml.AddReference(dataReference); // Установка алгоритма нормализации узла SignedInfo (в соответствии с методическими рекомендациями СМЭВ) signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl; // Установка алгоритма подписи ГОСТ Р 34.10-2001 (в соответствии с методическими рекомендациями СМЭВ) signedXml.SignedInfo.SignatureMethod = GostSignedXml.XmlDsigGost3410ObsoleteUrl; // Вычисление подписи signedXml.ComputeSignature("ds"); // Получение XML-представления подписи var signatureXml = signedXml.GetXml("ds"); // Добавление подписи в исходный документ signNode.GetElementsByTagName("ds:SignedInfo")[0].ParentNode.RemoveChild(signNode.GetElementsByTagName("ds:SignedInfo")[0]); signNode.GetElementsByTagName("ds:SignatureValue")[0].InnerText = signatureXml.GetElementsByTagName("ds:SignatureValue")[0].InnerText; signNode.GetElementsByTagName("ds:Signature")[0].PrependChild(signNode.ImportNode(signatureXml.GetElementsByTagName("ds:SignedInfo")[0], true)); signNode.GetElementsByTagName("wsse:BinarySecurityToken")[0].InnerText = Convert.ToBase64String(certSP.RawData); file.DocumentElement.PrependChild(file.CreateElement(file.DocumentElement.Prefix, "Header", "http://schemas.xmlsoap.org/soap/envelope/")); file.GetElementsByTagName(file.DocumentElement.Prefix + ":Header")[0].PrependChild(file.ImportNode(signNode.GetElementsByTagName("wsse:Security")[0], true)); Log(VerifySmevRequestSignature(file) ? " подпись корректна" : " !подпись некорректна"); }
private static XmlDocument SignSmevRequest(XmlDocument smevRequest, X509Certificate2 signingCertificate) { // Создание подписчика XML-документа var signedXml = new GostSignedXml(smevRequest) { GetIdElementHandler = GetSmevIdElement }; // Установка ключа для создания подписи signedXml.SetSigningCertificate(signingCertificate); // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования ГОСТ Р 34.11-94 (в соответствии с методическими рекомендациями СМЭВ) var dataReference = new Reference { Uri = "#body", DigestMethod = GostSignedXml.XmlDsigGost3411ObsoleteUrl }; // Метод преобразования, применяемый к данным перед их подписью (в соответствии с методическими рекомендациями СМЭВ) var dataTransform = new XmlDsigExcC14NTransform(); dataReference.AddTransform(dataTransform); // Установка ссылки на узел signedXml.AddReference(dataReference); // Установка алгоритма нормализации узла SignedInfo (в соответствии с методическими рекомендациями СМЭВ) signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl; // Установка алгоритма подписи ГОСТ Р 34.10-2001 (в соответствии с методическими рекомендациями СМЭВ) signedXml.SignedInfo.SignatureMethod = GostSignedXml.XmlDsigGost3410ObsoleteUrl; // Вычисление подписи signedXml.ComputeSignature(); // Получение XML-представления подписи var signatureXml = signedXml.GetXml(); // Добавление подписи в исходный документ smevRequest.GetElementsByTagName("ds:Signature")[0].PrependChild(smevRequest.ImportNode(signatureXml.GetElementsByTagName("SignatureValue")[0], true)); smevRequest.GetElementsByTagName("ds:Signature")[0].PrependChild(smevRequest.ImportNode(signatureXml.GetElementsByTagName("SignedInfo")[0], true)); smevRequest.GetElementsByTagName("wsse:BinarySecurityToken")[0].InnerText = Convert.ToBase64String(signingCertificate.RawData); return(smevRequest); }
private static XmlDocument SignXmlDocument(XmlDocument xmlDocument, X509Certificate2 certificate) { // Создание подписчика XML-документа var signedXml = new GostSignedXml(xmlDocument); // Установка ключа для создания подписи signedXml.SetSigningCertificate(certificate); // Ссылка на весь документ и указание алгоритма хэширования var dataReference = new Reference { Uri = "", DigestMethod = GetDigestMethod(certificate) }; // Метод преобразования для подписи всего документа dataReference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); // Установка ссылки на узел signedXml.AddReference(dataReference); // Установка информации о сертификате, который использовался для создания подписи var keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(certificate)); signedXml.KeyInfo = keyInfo; // Вычисление подписи signedXml.ComputeSignature(); // Получение XML-представления подписи var signatureXml = signedXml.GetXml(); // Добавление подписи в исходный документ xmlDocument.DocumentElement.AppendChild(xmlDocument.ImportNode(signatureXml, true)); return(xmlDocument); }
private void SignGisGpm(XmlNodeList signNodeList) { if (signNodeList.Count != 0) { Log(" подписание сущности/запроса"); var namespaceManager = new XmlNamespaceManager(file.NameTable); namespaceManager.AddNamespace("ds", SignedXml.XmlDsigNamespaceUrl); foreach (XmlElement signNode in signNodeList) { // получаем ID подписываемого документа string refId = signNode.GetAttribute("Id"); // Создание подписчика XML-документа var signedXml = new GostSignedXml(file) /*{ GetIdElementHandler = GetSmevIdElement }*/; // Установка ключа для создания подписи signedXml.SetSigningCertificate(certOV); // Ссылка на узел, который нужно подписать, с указанием алгоритма хэширования ГОСТ Р 34.11-94 (в соответствии с методическими рекомендациями СМЭВ) var dataReference = new Reference { Uri = "#" + refId, DigestMethod = GostSignedXml.XmlDsigGost3411ObsoleteUrl }; // Методы преобразования, применяемый к данным перед их подписью dataReference.AddTransform(new XmlDsigEnvelopedSignatureTransform()); dataReference.AddTransform(new XmlDsigExcC14NTransform()); // Установка ссылки на узел signedXml.AddReference(dataReference); // Установка алгоритма нормализации узла SignedInfo (в соответствии с методическими рекомендациями СМЭВ) signedXml.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl; // Установка алгоритма подписи ГОСТ Р 34.10-2001 (в соответствии с методическими рекомендациями СМЭВ) // signedXml.SignedInfo.SignatureMethod = GostSignedXml.XmlDsigGost3410ObsoleteUrl; // Установка информации о сертификате, который использовался для создания подписи var keyInfo = new KeyInfo(); keyInfo.AddClause(new KeyInfoX509Data(certOV)); signedXml.KeyInfo = keyInfo; // Вычисление подписи signedXml.ComputeSignature("ds"); // "ds" // Получение XML-представления подписи var signatureXml = signedXml.GetXml("ds"); // Добавление подписи в исходный документ file.SelectSingleNode("//*[@Id='" + refId + "']").AppendChild(file.ImportNode(signatureXml, true)); // Проверим подпись // VerifSign(file); } Log(VerifGisGmpSign() ? " подпись корректна" : " !подпись некорректна"); } else { // log(" сущность/запрос не обнаружен"); } }