Exemple #1
0
        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);
        }
Exemple #2
0
        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 bool VerifyXmlDocumentSignature(XmlDocument signedXmlDocument)
        {
            // Создание подписчика XML-документа
            var signedXml = new GostSignedXml(signedXmlDocument);

            // Поиск узла с подписью
            var nodeList = signedXmlDocument.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);

            // Загрузка найденной подписи
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Проверка подписи
            return(signedXml.CheckSignature());
        }
Exemple #4
0
        private bool VerifGisGmpSign()
        {
            // Создание подписчика XML-документа
            var signedXml = new GostSignedXml(file)
            {
                GetIdElementHandler = GetSmevIdElement
            };

            // Поиск узла с подписью
            var nodeList = file.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);

            // Загрузка найденной подписи
            signedXml.LoadXml((XmlElement)nodeList[0]);

            return(signedXml.CheckSignature());
        }
Exemple #5
0
        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);
        }
Exemple #6
0
        private static bool VerifySmevRequestSignature(XmlDocument signedSmevRequest)
        {
            // Создание подписчика XML-документа
            var signedXml = new GostSignedXml(signedSmevRequest)
            {
                GetIdElementHandler = GetSmevIdElement
            };

            // Поиск узла с подписью
            var nodeList = signedSmevRequest.GetElementsByTagName("Signature", SignedXml.XmlDsigNamespaceUrl);

            // Загрузка найденной подписи
            signedXml.LoadXml((XmlElement)nodeList[0]);

            // Поиск ссылки на BinarySecurityToken
            var references = signedXml.KeyInfo.GetXml().GetElementsByTagName("Reference", WsSecurityExtNamespace);

            if (references.Count > 0)
            {
                // Определение ссылки на сертификат (ссылка на узел документа)
                var binaryTokenReference = ((XmlElement)references[0]).GetAttribute("URI");

                if (!String.IsNullOrEmpty(binaryTokenReference) && binaryTokenReference[0] == '#')
                {
                    // Поиск элемента с закодированным в Base64 сертификатом
                    var binaryTokenElement = signedXml.GetIdElement(signedSmevRequest, binaryTokenReference.Substring(1));

                    if (binaryTokenElement != null)
                    {
                        // Загрузка сертификата, который был использован для подписи
                        var signingCertificate = new X509Certificate2(Convert.FromBase64String(binaryTokenElement.InnerText));

                        // Проверка подписи
                        return(signedXml.CheckSignature(signingCertificate.GetPublicKeyAlgorithm()));
                    }
                }
            }

            return(false);
        }
        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);
        }
Exemple #8
0
        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(" сущность/запрос не обнаружен");
            }
        }