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

Уведомление

Icon
Error

3 Страницы<123>
Опции
К последнему сообщению К первому непрочитанному
Offline Вычеслав  
#11 Оставлено : 24 декабря 2013 г. 16:36:42(UTC)
Вычеслав

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

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

Всем спасибо за помощь, завтра буду проверять.
Offline Андрей Писарев  
#12 Оставлено : 24 декабря 2013 г. 17:02:23(UTC)
Андрей *

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

Группы: Участники
Зарегистрирован: 26.07.2011(UTC)
Сообщений: 13,255
Мужчина
Российская Федерация

Сказал «Спасибо»: 545 раз
Поблагодарили: 2193 раз в 1712 постах
Автор: Новожилова Елена Перейти к цитате
Автор: Андрей * Перейти к цитате

Потому что в XML идет не PKCS7, а значение подписи.
Значение подписи - можно получить:
1) CryptSignHash
2) CryptSignMessage - и извлечь из PKCS7(CMS) - значение подписи...


В пункте 2, если в сообщении будут подписанные атрибуты, подпись XMLDSig не проверится.


Да, но это мы уже углубились в тему... Anxious
Техническую поддержку оказываем тут
Наша база знаний
Offline Вычеслав  
#13 Оставлено : 26 декабря 2013 г. 15:11:13(UTC)
Вычеслав

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

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

Код:

function SignMessage(Data, CertHash)
...
  hStore := CertOpenSystemStore(0, 'MY');
  if hStore <> nil then
    try
      pCertificate := find_certificate(hStore, nil, CertHash);
      if pCertificate <> nil then
        try
          if CryptAcquireContext(hContext, nil, nil, PROV_GOST_2001_DH, CRYPT_VERIFYCONTEXT) then
            try
              dwKeySpec := AT_KEYEXCHANGE;
              if CryptAcquireCertificatePrivateKey(pCertificate, CRYPT_ACQUIRE_COMPARE_KEY_FLAG, nil, hContext, @dwKeySpec, nil) then
                try
                  if CryptCreateHash(hContext, CALG_GR3411, 0, 0, hHash) then
                    try
                      CryptHashData(hHash, Pointer(Data), StrLen(Data), 0);
                      if CryptSignHash(hHash, AT_KEYEXCHANGE, nil, 0, nil, @dwSize) then
                        begin
                          Buf := AllocMem(dwSize);
                          try
                            if CryptSignHash(hHash, AT_KEYEXCHANGE, nil, 0, Buf, @dwSize) then
                              Result := crypto_binary_to_string(Buf, dwSize);
                          finally
                            FreeMem(Buf);
                          end;
...

Функция возвращает подпись в Base64 нужной длины (88 байт), которая верифицируется при помощи CryptVerifySignature
Тем не менее, подпись, созданную через SmevSignedXml я этими же средствами верифицировать не смог. В чем может быть причина?
Offline yes146n  
#14 Оставлено : 3 апреля 2014 г. 14:04:48(UTC)
yes146n

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

Группы: Участники
Зарегистрирован: 24.03.2014(UTC)
Сообщений: 6
Откуда: Пермь

Просьба помочь!!!
Требуется подписать ЭЦП небольшой soap. Формирую строку, на ее основе формирую XML документ, нахожу сертификат (пароль для сертификата запрашивается при вызове формы и опознается корректно), передаю документ и сертификат в SignedXml. Выисляю подпись, сразу же ее проверяю и получаю false. Где копать? По формированию подписи руководствовался: http://msdn.microsoft.co...edxml%28v=vs.100%29.aspx

String id = "315";
String soapS = "";
soapS += "<soap:Envelope xmlns:xsi='http://www.w3.org/2001/XMLSchema-instance' xmlns:ds='http://www.w3.org/2000/09/xmldsig#' xmlns:xsd='http://www.w3.org/2001/XMLSchema' xmlns:soap='http://schemas.xmlsoap.org/soap/envelope/' xmlns:nsi='http://nsi.asur.mos.ru/' 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'>";
soapS += "<soap:Body wsu:Id='body'>";
soapS += "<nsi:receive_changeResponse>";
soapS += "<nsi:receive_changeResult>OK:" + id + "</nsi:receive_changeResult>";
soapS += "</nsi:receive_changeResponse>";
soapS += "</soap:Body>";
soapS += "</soap:Envelope>";

// Создаем файл для подписывания, точнее подписывания его части
XmlDocument document = new XmlDocument();

//Пишем в файл созданную строку(xml)
document.LoadXml(soapS);
document.PreserveWhitespace = false;

// Создаем ссылку с указанием ноды для шифрования (не подписываем, так как подписываем запрос целиком)
Reference reference = new Reference();
reference.Uri = "#body";
reference.Uri = document.GetElementsByTagName("soap:Body").Item(0).BaseURI;

XmlDsigExcC14NTransform c14 = new XmlDsigExcC14NTransform();
reference.AddTransform(c14);

// Создаем экземляр подписываемого файла
SignedXml signedXml = new SignedXml(document);

//Добавляем ссылку на шифруемую часть
signedXml.AddReference(reference);

//Создаем экземпляр хранилища сертификатов и заполняем его из реестра LocalMachine
X509Store certStore = new X509Store(StoreLocation.LocalMachine);
certStore.Open(OpenFlags.OpenExistingOnly | OpenFlags.ReadOnly);

Ручной выбор сертификата, для отладки
X509Certificate2Collection certs = X509Certificate2UI.SelectFromCollection(
certStore.Certificates,
"Выберите сертификат",
"Пожалуйста, выберите сертификат электронной подписи",
X509SelectionFlag.SingleSelection);

//Сертификат доступен - проверено
if (certs.Count == 0)
{
Console.WriteLine("Сертификат не выбран.");
return;
}

//Формируем информацию ключа
KeyInfo keyInfo = new KeyInfo();
keyInfo.AddClause(new KeyInfoX509Data(certs[0]));
signedXml.KeyInfo = keyInfo;
signedXml.SignedInfo.CanonicalizationMethod = c14.Algorithm;

// Явно проставляем алгоритм хеширования,
// по умолчанию SHA1
signedXml.SignedInfo.SignatureMethod = CryptoPro.Sharpei.Xml.CPSignedXml.XmlDsigGost3410Url;

//Передаем закрытый ключ в объект подписи
signedXml.SigningKey = certs[0].PrivateKey;
//Вычисляем подпись
signedXml.ComputeSignature();

//Вытаскиваем представление полученной подписи
XmlElement xmlDigitalSignature = signedXml.GetXml();
SignedXml signedXml_second = new SignedXml(xmlDigitalSignature);
////При проверке оба раза получаем false
bool flag = signedXml_second.CheckSignature();
flag = signedXml_second.CheckSignature(certs[0], true)
Offline yes146n  
#15 Оставлено : 3 апреля 2014 г. 14:40:08(UTC)
yes146n

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

Группы: Участники
Зарегистрирован: 24.03.2014(UTC)
Сообщений: 6
Откуда: Пермь

http://social.msdn.micro...-fails?forum=xmlandnetfx
http://stackoverflow.com...4-or-4-5-but-works-in-ne
Здесь обсуждается вечный false от функции CheckSignature, но как решили проблему, я не уловил :(

Отредактировано пользователем 3 апреля 2014 г. 14:45:46(UTC)  | Причина: Не указана

Offline Максим Коллегин  
#16 Оставлено : 3 апреля 2014 г. 14:44:39(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 714 раз в 619 постах
Вы подпись не добавляете в результирующий документ - проверить ее не сможете конечно же. Смотрите наши примеры:
http://cpdn.cryptopro.ru...04-a2a6-039aa86daebd.htm
Знания в базе знаний, поддержка в техподдержке
Offline yes146n  
#17 Оставлено : 3 апреля 2014 г. 15:13:12(UTC)
yes146n

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

Группы: Участники
Зарегистрирован: 24.03.2014(UTC)
Сообщений: 6
Откуда: Пермь

По примеру: SignDocument2.cs
добавил подпись в документ
// Добавляем node подписи в XML документ.
document.DocumentElement.PrependChild(document.ImportNode(xmlDigitalSignature, true));

перед куском

//Вытаскиваем представление полученной подписи
XmlElement xmlDigitalSignature = signedXml.GetXml();
SignedXml signedXml_second = new SignedXml(xmlDigitalSignature);
////При проверке оба раза получаем false
bool flag = signedXml_second.CheckSignature();
flag = signedXml_second.CheckSignature(certs[0], true)

И все равно ChckSignature возвращает false

Отредактировано пользователем 3 апреля 2014 г. 18:27:32(UTC)  | Причина: Не указана

Offline yes146n  
#18 Оставлено : 3 апреля 2014 г. 16:26:15(UTC)
yes146n

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

Группы: Участники
Зарегистрирован: 24.03.2014(UTC)
Сообщений: 6
Откуда: Пермь

Полученный XML теперь выглядит так: (стер ключ и значения подписи для DigestValue и SignatureValue)

- <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nsi="http://nsi.asur.mos.ru/" 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">
- <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
- <SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" />
- <Reference URI="">
- <Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue> Потерто </DigestValue>
</Reference>
</SignedInfo>
<SignatureValue> Потерто </SignatureValue>
- <KeyInfo>
- <X509Data>
<X509Certificate> Потерто </X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
- <soap:Body wsu:Id="body">
- <nsi:receive_changeResponse>
<nsi:receive_changeResult>OK:315</nsi:receive_changeResult>
</nsi:receive_changeResponse>
</soap:Body>
</soap:Envelope>
Offline Максим Коллегин  
#19 Оставлено : 3 апреля 2014 г. 19:55:42(UTC)
Максим Коллегин

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

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

Сказал «Спасибо»: 37 раз
Поблагодарили: 714 раз в 619 постах
В Reference же должен быть body, нет?
Знания в базе знаний, поддержка в техподдержке
Offline yes146n  
#20 Оставлено : 4 апреля 2014 г. 9:07:46(UTC)
yes146n

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

Группы: Участники
Зарегистрирован: 24.03.2014(UTC)
Сообщений: 6
Откуда: Пермь

С точным указанием секции я пробовал, но тоже ничего не вышло.
Т.е при формировании Reference код:

//**************************************Добавим атрибут для формирования ссылки
XmlElement body = document.GetElementsByTagName("soap:Body").Item(0) as XmlElement;
body.SetAttribute("id", "Body");
//**************************************

// Создаем ссылку с указанием ноды для шифрования
Reference reference = new Reference();
reference.Uri = "#Body";
//Соответственно, из первоначальной строки удалил wsu:Id='body'

Получил XML:
- <soap:Envelope xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/" xmlns:nsi="http://nsi.asur.mos.ru/" 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">
- <Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
- <SignedInfo>
<CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
<SignatureMethod Algorithm="urn:ietf:params:xml:ns:cpxmlsec:algorithms:gostr34102001-gostr3411" />
- <Reference URI="#Body">
- <Transforms>
<Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#" />
</Transforms>
<DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1" />
<DigestValue> Потерто </DigestValue>
</Reference>
</SignedInfo>
<SignatureValue> Потерто </SignatureValue>
- <KeyInfo>
- <X509Data>
<X509Certificate> Потерто </X509Certificate>
</X509Data>
</KeyInfo>
</Signature>
- <soap:Body id="Body">
- <nsi:receive_changeResponse>
<nsi:receive_changeResult>OK:315</nsi:receive_changeResult>
</nsi:receive_changeResponse>
</soap:Body>
</soap:Envelope>
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest (9)
3 Страницы<123>
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.