Статус: Активный участник
Группы: Участники
Зарегистрирован: 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.xsdwsu - 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 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 24.07.2012(UTC) Сообщений: 3
|
А может надо сначала добавить сертификат в BinarySecurityToken, в только потом подписывать body? И почему в атрибутах BinarySecurityToken присутствуют полные пространства имен, а не псевдонимы?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,405  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 37 раз Поблагодарили: 720 раз в 624 постах
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close