Статус: Участник
Группы: Участники
Зарегистрирован: 18.05.2009(UTC) Сообщений: 10 Откуда: Russia
|
Ситуация следующая: Есть стандартный механизм подписи и проверки подписи через CAPICOM (на клиенте и на сервере). Возникла необходимость использовать для подписи на клиенте Sharpei. Были испробованы несколько вариантов, но не один не проходит проверку на сервере через CAPICOM.
При подписи данных через, как в примере SingleSigner.cs, но с отделенной подписью, Sharpei дает очень похожий (визуально) результат на таковой от CAPICOM, но не проходит проверку.
Куда можно посмотреть и где "поковырять"?
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
И c присоединенной подписью не проходит проверку? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 18.05.2009(UTC) Сообщений: 10 Откуда: Russia
|
Kirill Sobolev написал:И c присоединенной подписью не проходит проверку? Нет. Никак не проходит, если это важно могу опубликовать JScript выполняющий подпись с помощью CAPICOM
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,732  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Лучше выложите результат, который Вы хотите проверить с помощью CAPICOM. Да - то что получается самим шарпеем проверяется? |
|
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 18.05.2009(UTC) Сообщений: 10 Откуда: Russia
|
Kirill Sobolev написал:Лучше выложите результат, который Вы хотите проверить с помощью CAPICOM. Да - то что получается самим шарпеем проверяется? Вот в том и загвоздка, что сам Sharpei прекрасно гоняет подпись туда-сюда. Ок, завтра с работы попробую выложить вариант подписи.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Проблема скорее всего в кодировании исходного сообщения. На вход CAPICOM необходимо передавать текст в текущей кодировке, а при подписи в Sharpei (а-ля SingleSigner.cs) - Unicode. Прикрепил пример detached подписи из Sharpei. Если запустить пример (C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\Security\capicom\vbs\CSignData.vbs) из Microsoft Platform SDK: Код:cscript CSignData.vbs Verify -detached aaa.sgn aaa.bin
, то подпись проверяется. Отредактировано пользователем 18 мая 2009 г. 21:34:14(UTC)
| Причина: Не указана Вложение(я):  SingleSigner.cs (13kb) загружен 93 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться. |
С уважением, Александр. |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 18.05.2009(UTC) Сообщений: 10 Откуда: Russia
|
Челпанов А. написал:Проблема скорее всего в кодировании исходного сообщения. На вход CAPICOM необходимо передавать текст в текущей кодировке, а при подписи в Sharpei (а-ля SingleSigner.cs) - Unicode. Гм, странно, вот тут тоже были сомнения... Я думаю, что, всетаки, в CAPICOM передается COM'овский BSTR, который по-определению внутри является UNICODE'ом. Иначе как объяснить, что в одном случае мы подписываем массив байт полученый с юникода, а проверяем непойми что? Проверка должна идти тоже массива полученного из юникода. Челпанов А. написал:Прикрепил пример detached подписи из Sharpei. Если запустить пример (C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\Security\capicom\vbs\CSignData.vbs) из Microsoft Platform SDK: Код:cscript CSignData.vbs Verify -detached aaa.sgn aaa.bin
, то подпись проверяется. Да, в таком виде подпись вроде прошла, тестирую дальше. Непонятно еще зачем такие сложности по преобразованию в Base64 в методе EncodeToFile? По крайней мере, строку можно получить проще через Код:Convert.ToBase64String(someData);
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Цитата:Гм, странно, вот тут тоже были сомнения... Я думаю, что, всетаки, в CAPICOM передается COM'овский BSTR, который по-определению внутри является UNICODE'ом. Иначе как объяснить, что в одном случае мы подписываем массив байт полученый с юникода, а проверяем непойми что? Проверка должна идти тоже массива полученного из юникода. Можно так. Только читать Вы должны из файла Unicode строку, без лишних преобразований. Цитата:Непонятно еще зачем такие сложности по преобразованию в Base64 в методе EncodeToFile? По крайней мере, строку можно получить проще через В данном случае незачем, люблю поточные преобразования |
С уважением, Александр. |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 18.05.2009(UTC) Сообщений: 10 Откуда: Russia
|
Всем спасибо за помощь. Все заработало.
Остался один интересный момент: подпись прекрасно выполняется таким способом даже на машине, на которой не установлен Sharpei RTE и нет ни одной библиотеки Sharpei. Вот...
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Для подписи CMS Sharpei и не нужен. Microsoft реализовал эту часть через криптопровайдеры аккуратно. А вот проверка без Sharpei не работает. Вообще-то и при проверке CMS подписи (и еще в паре мест, например при двухсторонней аудентификации в TLS) почти все работает корректно. Вот это почти Sharpei и исправляет; не реализует, а именно чуть правит.
|
С уважением, Александр. |
|
|
|
Статус: Участник
Группы: Участники
Зарегистрирован: 18.05.2009(UTC) Сообщений: 10 Откуда: Russia
|
Челпанов А. написал:Вообще-то и при проверке CMS подписи (и еще в паре мест, например при двухсторонней аудентификации в TLS) почти все работает корректно. Вот это почти Sharpei и исправляет; не реализует, а именно чуть правит.
Гм. Тогда встречный вопрос: Является ли установка Sharpei RTE строгонеобходимым действием или можно обойтись простым перетаскиванием библиотек (сборок) в папке с программой? Там что-то серьезное при инсталяции происходит, кроме регистрации сборок в GAC?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы
Зарегистрирован: 12.12.2007(UTC) Сообщений: 6,168  Откуда: КРИПТО-ПРО Сказал «Спасибо»: 20 раз Поблагодарили: 635 раз в 562 постах
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 29.04.2009(UTC) Сообщений: 2
|
Здравствуйте. У меня возникла похожая проблема. Мне необходимо подписать XML файл и отправить его на сайт для проверки. В JavaScript это делается через CAPICOM: А на C# подготавливаю SignedXML так: Код:
string dsigObjectId = "TS_SO_Zayavka_polzovatelya";
SignedXml signedXml = new SignedXml();
signedXml.SignedInfo.CanonicalizationMethod = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315";
signedXml.SignedInfo.SignatureMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr34102001-gostr3411";
signedXml.SigningKey = x509.PrivateKey;
Reference reference = new Reference("#TS_SO_Zayavka_polzovatelya");
reference.DigestMethod = "http://www.w3.org/2001/04/xmldsig-more#gostr3411";
reference.Type = "http://www.w3.org/2000/09/xmldsig#;Object";
signedXml.AddReference(reference);
XmlDocument xdoc = new XmlDocument();
xdoc.PreserveWhitespace = false;
string normilize_xmlstring = xmlstring.Replace("<", "<").Replace(""", "\"");
xdoc.LoadXml(normilize_xmlstring);
DataObject dataObject = new DataObject(dsigObjectId, "text/plain", "", xdoc.DocumentElement);
signedXml.AddObject(dataObject);
signedXml.KeyInfo = new KeyInfo();
KeyInfoX509Data keyX509 = new KeyInfoX509Data();
keyX509.AddCertificate(x509);
signedXml.KeyInfo.AddClause(keyX509);
signedXml.ComputeSignature();
XmlElement xelement = signedXml.GetXml();
XmlDocument xd = new XmlDocument();
xd.AppendChild(xd.ImportNode(xelement, true));
xmlsingnedstring = xd.InnerXml;
И отправляю на сервер, но на сервере проверка не проходит. В чем может быть проблема? Может есть примеры, как это делать? Вложение(я):  JavaScriptCAPICOM.txt (4kb) загружен 81 раз(а).У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 24.12.2007(UTC) Сообщений: 390  Откуда: КриптоПро Поблагодарили: 2 раз в 2 постах
|
Не понял какими средствами Вы проверяете подпись (У вас в тексте и через CAPICOM и на C# реализована только подпись). Проходит ли подпись на себя (C# на C# и CAPICOM на CAPICOM)? Примеры подписи и проверки подписи на C# есть в КриптоПро Sharpei SDK Simple.zip каталог xml Примеры подписи и проверки подписи через CAPICOM есть в Microsoft Platform SDK C:\Program Files\Microsoft SDKs\Windows\v6.0\Samples\Security\capicom\vbs\CSignData.vbs |
С уважением, Александр. |
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close