Beispiel #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);
        }
Beispiel #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) ? "   подпись корректна" : "  !подпись некорректна");
        }
Beispiel #3
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);
        }
        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);
        }
Beispiel #5
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(" сущность/запрос не обнаружен");
            }
        }