Ключевое слово в защите информации
КЛЮЧЕВОЕ СЛОВО
в защите информации
Получить ГОСТ TLS-сертификат для домена (SSL-сертификат)
Добро пожаловать, Гость! Чтобы использовать все возможности Вход или Регистрация.

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline DVAckom  
#1 Оставлено : 2 марта 2012 г. 18:42:43(UTC)
DVAckom

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.05.2011(UTC)
Сообщений: 102

Сказал(а) «Спасибо»: 17 раз
Поблагодарили: 56 раз в 18 постах
Добрый день,
пытаюсь подписать SOAP запрос, имея ряд определенных требований:

Цитата:
Структура электронной подписи информационной системы должна соответствовать стандарту OASIS Standard 200401 (http://docs.oasisopen.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0.pdf) с профилем X.509
Certificate Token Profile (http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-tokenprofile-1.0.pdf).
Используются следующие соответствия:
soapenv - http://schemas.xmlsoap.org/soap/envelope/
ds - http://www.w3.org/2000/09/xmldsig#
wsse - http://docs.oasis-open.o...ssecurity-secext-1.0.xsd
wsu - http://docs.oasis-open.o...security-utility-1.0.xsd
В процессе создания электронной подписи информационной системы должны использоваться следующие алгоритмы для расчета хеш-сумм, формирования подписи и
канонизации:
Расчет хэш-сумм ГОСТ Р 34.11-94 - http://www.w3.org/2001/04/xmldsigmore#gostr3411
Формирования подписи ГОСТ Р 34.10-2001 - http://www.w3.org/2001/0...#gostr34102001-gostr3411
Канонизация Exclusive XML Canonicalization от 18 July 2002 - http://www.w3.org/2001/10/xml-exc-c14n#
В <wsse:BinarySecurityToken/> добавляются атрибуты форматов и собственно сам сертификат и атрибут wsu:Id. Формат сертификат должен соответствовать спецификации X.509 и быть
представленным в формате Base64. Добавляется ссылка на токен в раздел <ds:KeyInfo>. Значение атрибута URI элемента wsse:Reference должно соответствовать значению
атрибута wsu:Id элемента wsse:BinarySecurityToken без лидирующего знака '#'
Значение атрибута URI элемента ds:Reference должно соответствовать значению
атрибута wsu:Id элемента soapenv:Body без лидирующего знака '#'.
К элементу <soapenv:Body> и его потомкам, включая атрибуты, применяется
каноникализация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата
рассчитывается хэш по алгоритму ГОСТ Р 34.11-94 и заносится в <ds:DigestValue> в
формате Base64.
К элементу <ds:SignedInfo> и его потомкам, включая атрибуты, применяется
каноникалилзация http://www.w3.org/2001/10/xml-exc-c14n#, на основе результата
рассчитывается электронная подпись по алгоритму ГОСТ Р 34.11-94 и заносится в
<ds:SignatureValue> в формате Base64.


Для подписания использую самый свежий Sharpei, RTE в демо-режиме, КриптоПро CSP 3.6, MS Visual C# 2010.
Исходя из описанных требований и примеров из Sharpei SDK, составил следующий код приложения, которое открывает входной файл, подписывает его и сохраняет в него же.

Код:

using System;
using System.Collections.Generic;
using System.Text;
using System.Xml;
using System.Security.Cryptography.X509Certificates;
using System.Security.Cryptography.Xml;

namespace ConsoleApplication1
{
    class Program
    {
        static bool SignXML(XmlDocument xmlDoc, X509Certificate2 Cert, out XmlDocument xml_out)
        {
            xml_out = xmlDoc;
            try
            {
                xmlDoc.PreserveWhitespace = true;
                SignedXml sgnDoc = new SignedXml(xmlDoc);

                X509Store x509s = new X509Store(StoreName.My, StoreLocation.CurrentUser);
                x509s.Open(OpenFlags.ReadOnly);

                sgnDoc.SigningKey = Cert.PrivateKey;
                
                Reference reference = new Reference();
                reference.Uri = "#body";

                reference.DigestMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3411UrlObsolete;

                XmlDsigEnvelopedSignatureTransform anv = new XmlDsigEnvelopedSignatureTransform();
                reference.AddTransform(anv);

                XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform(false);

                reference.AddTransform(c14);

                sgnDoc.AddReference(reference);

                sgnDoc.SignedInfo.CanonicalizationMethod = SignedXml.XmlDsigExcC14NTransformUrl;
                sgnDoc.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410UrlObsolete;
                sgnDoc.ComputeSignature();
                XmlElement xmlSignature = sgnDoc.GetXml();

                xmlDoc.GetElementsByTagName("ds:Signature")[0].AppendChild(xmlSignature.GetElementsByTagName("SignedInfo")[0]);
                xmlDoc.GetElementsByTagName("ds:Signature")[0].AppendChild(xmlSignature.GetElementsByTagName("SignatureValue")[0]);


                xmlDoc.GetElementsByTagName("wsse:BinarySecurityToken")[0].InnerText = Convert.ToBase64String(Cert.Export(X509ContentType.Cert));
                xml_out = xmlDoc;
                return true;
            }
            catch (Exception ex)
            {
                Console.Write(ex.Message);
                Console.ReadKey();
                return false;
            }
        }

        static void Main(string[] args)
        {

            if (args.Length > 0)
            {
                XmlDocument xml = new XmlDocument();
                xml.Load(args[0]);
                
                X509Store x509s = new X509Store("MY");
                x509s.Open(OpenFlags.ReadOnly);
                X509Certificate2 x509 = new X509Certificate2(X509Certificate2UI.SelectFromCollection(x509s.Certificates, "Выберите сертификат", "Выбор", X509SelectionFlag.SingleSelection)[0]);
                
                SignXML(xml, x509 , out xml);
                
                xml.Save(args[0]);
            }
        }
    }
}


Пробую подписать следующий файл XML:

Код:
<?xml version="1.0" encoding="UTF-8" standalone="no"?>
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd">
	<SOAP-ENV:Header>
		<wsse:Security>
			<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
				<KeyInfo>
					<wsse:SecurityTokenReference><wsse:Reference URI="#SenderCertificate"/></wsse:SecurityTokenReference>
				</KeyInfo>
			</ds:Signature>
			<wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" Id="SenderCertificate"></wsse:BinarySecurityToken>
		</wsse:Security>
	</SOAP-ENV:Header>
	<SOAP-ENV:Body Id="body">
			<req:testRequest xmlns:req="http://www.ackom.net/testRequest">
				<param1>param1text</param1>
				<param2>
					<param21 name="paramattrib"/>
					<param22 name="moreattrib">
					<param23>3</param23>
				</param2>
			</req:testRequest>
	</SOAP-ENV:Body>
</SOAP-ENV:Envelope>


На выходе получаю следующее:
Код:
<?xml version="1.0" encoding="UTF-8" standalone="no"?><SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd"><SOAP-ENV:Header><wsse:Security><ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#"><KeyInfo><wsse:SecurityTokenReference><wsse:Reference URI="#SenderCertificate" /></wsse:SecurityTokenReference></KeyInfo><SignedInfo xmlns="http://www.w3.org/2000/09/xmldsig#"><CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /><SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411" /><Reference URI="#body"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature" /><Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" /></Transforms><DigestMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#gostr3411" /><DigestValue>ywkC+nIBu6F0nAYSNNzw+nv8RBjU+G1aNHhXLBH/C+E=</DigestValue></Reference></SignedInfo><SignatureValue xmlns="http://www.w3.org/2000/09/xmldsig#">bwXZl56cdnf7yhQSPUyNA5kytstmVqTyKgKeF7TPTADLyOuhzBYVvnrk50Y9gLNQ9Py0BAKCKvpzWNEQXyirCg==</SignatureValue></ds:Signature><wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" Id="SenderCertificate">MIIFVjCCBQOgAwIBAgIKVmhH7gABAABMsDAKBgYqhQMCAgMFADCCAQYxCzAJBgNVBAYTAlJVMS4wLAYDVQQIDCXQodGC0LDQstGA0L7Qv9C+0LvRjNGB0LrQuNC5INC60YDQsNC5MR0wGwYDVQQHDBTQodGC0LDQstGA0L7Qv9C+0LvRjDFGMEQGA1UECgw90J7QntCeINCj0LTQvtGB0YLQvtCy0LXRgNGP0Y7RidC40Lkg0YbQtdC90YLRgCDCq9CQ0KHQmtCe0JzCuzEfMB0GCSqGSIb3DQEJARYQc3RhdnVjQGFja29tLm5ldDE/MD0GA1UEAww20KPQtNC+0YHRgtC+0LLQtdGA0Y/RjtGJ0LjQuSDRhtC10L3RgtGAIMKr0JDQodCa0J7QnMK7MB4XDTExMDQyMTA5MDEwMFoXDTEyMDQyMTA5MTEwMFowggFuMRgwFgYIKoUDA4EDAQETCjI2MzUwNDk4NTIxIDAeBgkqhkiG9w0BCQEWETI2OTk5OTNAYWNrb20ubmV0MQswCQYDVQQGEwJSVTE1MDMGA1UECB4sADIANgAgBCEEQgQwBDIEQAQ+BD8EPgQ7BEwEQQQ6BDgEOQAgBDoEQAQwBDkxHTAbBgNVBAceFAQhBEIEMAQyBEAEPgQ/BD4EOwRMMUkwRwYDVQQKHkAEHgQeBB4AIAQjBDQEPgRBBEIEPgQyBDUEQARPBE4ESQQ4BDkAIARGBDUEPQRCBEAAIACrBBAEIQQaBB4EHAC7MQowCAYDVQQLEwEwMSswKQYDVQQDHiIEIAQwBDcEQAQwBDEEPgRCBEcEOAQ6ACAEHwQeACAhFgAxMRgwFgYJKoZIhvcNAQkIEwkyNjM1MDEwMDExLzAtBgNVBAweJgQYBD0ENgQ1BD0ENQRAAC0EPwRABD4EMwRABDAEPAQ8BDgEQQRCMGMwHAYGKoUDAgITMBIGByqFAwICJAAGByqFAwICHgEDQwAEQHAfNtG6ZyPKUW6Bl7EGIRQwfMlBNXUdyHnltLnhscAInSsioT4kbokzHEKsq/AsAf/s+pFzXQiPYtOaNi3MsomjggHhMIIB3TAOBgNVHQ8BAf8EBAMCBPAwGQYJKoZIhvcNAQkPBAwwCjAIBgYqhQMCAhUwgZQGA1UdJQSBjDCBiQYHKoUDAzgDDAYHKoUDAzgBBAYIKwYBBQUHAwQGByqFAwM4AwIGByqFAwM4BQQGByqFAwICIgYGByqFAwM4Aw4GByqFAwM4AwoGByqFAwM4BQUGCCsGAQUFBwMCBgcqhQMDOAUGBgcqhQMDOAMDBgcqhQMDOAMHBgcqhQMDOAECBgcqhQMDOAMNMB0GA1UdDgQWBBQtznOCoLkR1KutD/aKhuQUVdiUXjAfBgNVHSMEGDAWgBTMI1EA+Ynom35GoEg4NcBf8GQ+kDBgBgNVHR8EWTBXMFWgU6BRhiNodHRwOi8vc3RhdnVjLnJ1L2NkcC9zdGF2dWMyMDEwLmNybIYqaHR0cDovL3N0YXZ1Yy5hY2tvbS5uZXQvY2RwL3N0YXZ1YzIwMTAuY3JsMHcGCCsGAQUFBwEBBGswaTA0BggrBgEFBQcwAoYoaHR0cDovL3N0YXZ1Yy5hY2tvbS5uZXQvY2RwL3N0YXZ1YzEwLmNydDAxBggrBgEFBQcwAoYlaHR0cDovL3d3dy5zdGF2dWMucnUvY2RwL3N0YXZ1YzEwLmNydDAKBgYqhQMCAgMFAANBAFUS5Kez4gtsSwNTfTAEPKGEHTl99ycZ45swDGYq4ojA6Go/e4aoB1UFtGXe03sxcJ4YRUKBm9UJPpIOAfvSfhI=</wsse:BinarySecurityToken></wsse:Security></SOAP-ENV:Header><SOAP-ENV:Body Id="body"><req:testRequest xmlns:req="http://www.ackom.net/testRequest"><param1>param1text</param1><param2><param21 name="paramattrib" /><param22 name="moreattrib" /><param23>3</param23></param2></req:testRequest></SOAP-ENV:Body></SOAP-ENV:Envelope>


Но запрос с такой подписью не проходит проверку. ЭЦП не верна.
Помогите разобраться, что я делаю не так?
Вложение(я):
запрос.xml (2kb) загружен 28 раз(а).
запрос_ЭЦП.xml (4kb) загружен 40 раз(а).
Program.cs (3kb) загружен 23 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline DVAckom  
#2 Оставлено : 6 марта 2012 г. 15:13:47(UTC)
DVAckom

Статус: Активный участник

Группы: Участники
Зарегистрирован: 27.05.2011(UTC)
Сообщений: 102

Сказал(а) «Спасибо»: 17 раз
Поблагодарили: 56 раз в 18 постах
Проверяю подпись своего запроса следующим кодом:

Код:
 XmlDocument xdoc = new XmlDocument();
            xdoc.PreserveWhitespace=true;
            xdoc.LoadXml(xmlstring);

            XmlNamespaceManager nsm=new XmlNamespaceManager(xdoc.NameTable);
            nsm.AddNamespace("ds", "http://www.w3.org/2000/09/xmldsig#");
            
            MySignedXml sgnXML = new MySignedXml(xdoc);
            XmlNodeList nodelist = xdoc.GetElementsByTagName("ds:Signature");
 
            sgnXML.LoadXml((XmlElement)nodelist[0]);

            X509Store x509s = new X509Store("MY");
            x509s.Open(OpenFlags.ReadOnly);

            X509Certificate2 x509 = new X509Certificate2();
            x509.Import(System.Text.Encoding.UTF8.GetBytes(xdoc.GetElementsByTagName("wsse:BinarySecurityToken")[0].InnerText));

            bool res = sgnXML.CheckSignature(x509,true);


в переменную res возвращается true, то есть подпись верна. Тем не менее сервис подпись проверить не может.
Аналогично, не могу проверить подпись примера ответа с сервиса.

В wsdl сервиса присутствует следующий комментарий:
Цитата:
<!-- Published by JAX-WS RI at http://jax-ws.dev.java.net. RI's version is Metro/2.1.1 (branches/2.1-6844; 2011-07-29T12:07:24+0000) JAXWS-RI/2.2.5 JAXWS/2.2. -->

То есть сделан он явно не на .net и КриптоПро Sharpei. Догадываюсь, использован JAX-WS + КриптоПро JCP.
Разработчики сервиса советуют "перевернуть подпись".
Подскажи пожалуйста, как можно "перевернуть подпись" средствами КриптоПро Sharpei?

Отредактировано пользователем 6 марта 2012 г. 15:19:12(UTC)  | Причина: Не указана

Offline velikoros  
#3 Оставлено : 24 июля 2012 г. 15:16:27(UTC)
velikoros

Статус: Новичок

Группы: Участники
Зарегистрирован: 24.07.2012(UTC)
Сообщений: 3

А может надо сначала добавить сертификат в BinarySecurityToken, в только потом подписывать body? И почему в атрибутах BinarySecurityToken присутствуют полные пространства имен, а не псевдонимы?
Offline Максим Коллегин  
#4 Оставлено : 24 июля 2012 г. 16:08:47(UTC)
Максим Коллегин

Статус: Сотрудник

Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC)
Сообщений: 6,405
Мужчина
Откуда: КРИПТО-ПРО

Сказал «Спасибо»: 37 раз
Поблагодарили: 720 раз в 624 постах
Знания в базе знаний, поддержка в центре поддержки
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.