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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline ДмитрийУникальный  
#1 Оставлено : 5 мая 2016 г. 10:32:32(UTC)
ДмитрийУникальный

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

Группы: Участники
Зарегистрирован: 05.05.2016(UTC)
Сообщений: 3
Российская Федерация
Откуда: Россия

Здравствуйте!
Выполняем подписание хэша документа. Хэш получен по ГОСТ Р 34.11-94.
Функция получения хэша по документу
Код:
public HashResult GetHashDocument(ReplayDocument repDoc)
        {
            HashResult result = new HashResult();
            SPSecurity.RunWithElevatedPrivileges(delegate()
            {
                try
                {
                    using (SPSite site = new SPSite(new Guid(repDoc.siteID)))
                    {
                        using (SPWeb web = site.OpenWeb())
                        {
                            SPList list = web.Lists[new Guid(repDoc.listID)];
                            SPFile file = list.GetItemById(Int32.Parse(repDoc.itemID)).File;
                            HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
                            myhash.ComputeHash(file.OpenBinaryStream());
                            byte[] hashValue = myhash.Hash;
                            result.result = "0";
                            //result.hash = hashValue; //Это пока запасной вариант, потом надо будет удалить
                            result.data = Convert.ToBase64String(hashValue); //Переводим байты в Base64 string. эту последовательность и будем подписывать
                            //for (int i = 0; i < hashValue.Length; i++)
                            //    Console.Write("{0:X2}", hashValue[i]);
                        }
                    }
                }
                catch (Exception ex) {
                    result.result = "Error";
                    result.data = ex.Message + " |&| " + ex.StackTrace;
                }
            });
            return result;
        }

Функция JavaScript для подписания полученного хэша:
Код:
function StartSign() {
            var ReplayDocument = {
                SiteID: globalVari.SiteID,
                ListID: globalVari.ListID,
                ItemID: globalVari.ItemID
            };
            var myJson = JSON.stringify(ReplayDocument);
            var completeUrl = _spPageContextInfo.webAbsoluteUrl + "/_vti_bin/ItemsService/Copy.svc/GetHashDocument";
            $.ajax({
                url: completeUrl,
                contentType: "application/json",
                type: "POST",
                dataType: "Json",
                data: myJson,
                cache: false,
                error: function (err) {
                    alert(err.toString());
                },
                success: function (result) {
                    if (result.Result == "Error") {
                        alert(result.Data);
                    }
                    else {
                        //var el = document.getElementById(<%= tbHash.ClientID %>);
                        $('#<%= tbHashTxt.ClientID %>').val(result.Data);
                        var dd = document.getElementById("<%=ddlSelectSignature.ClientID%>");
                        var signedData = SignCreate($("#<%=ddlSelectSignature.ClientID%> option:selected").val(), result.Data); //Получаем подписанный хэш. result.Data это строка Base64

                        $('#<%= tbHash.ClientID %>').val(signedData); //Выводим подписанный хэш на форму

                        //$('#<%= tbHash.ClientID %>').val(result.Hash);
                    }
                }
            });
        };

Функция подписания последовательности Base64 указанным сертификатом:
Код:
 function SignCreate(certSubjectName, dataToSign) {
            var oStore = cadesplugin.CreateObject("CAPICOM.Store");
            oStore.Open(CAPICOM_CURRENT_USER_STORE, CAPICOM_MY_STORE,
            CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED);

            //var oCertificates = oStore.Certificates.Find(
            //CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME, certSubjectName);
            var oCerts = new Enumerator(oStore.Certificates);
            var cert = null;
            for (; !oCerts.atEnd() ; oCerts.moveNext()) {
                
                if (oCerts.item().SerialNumber == certSubjectName)
                    cert = oCerts.item();
            }
            if (cert == null) {
                alert("Certificate not found: " + certSubjectName);
                return;
            }
            //var oCertificate = oCertificates.Item(1);
            var oSigner = cadesplugin.CreateObject("CAdESCOM.CPSigner");
            oSigner.Certificate = cert;

            var oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");
            // Значение свойства ContentEncoding должно быть задано
            // до заполнения свойства Content
            oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
            oSignedData.Content = dataToSign;

            var sSignedMessage = "";
            try {
                sSignedMessage = oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
            } catch (err) {
                alert("Failed to create signature. Error: " + GetErrorMessage(err));
                return;
            }

            oStore.Close();

            return sSignedMessage;
        }


Функция проверки подписи хэша:
Код:
function Verify(sSignedMessage, dataToVerify) {
            var oSignedData = cadesplugin.CreateObject("CAdESCOM.CadesSignedData");
            try {
                // Значение свойства ContentEncoding должно быть задано
                // до заполнения свойства Content
                oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
                oSignedData.Content = dataToVerify;
                oSignedData.VerifyCades(sSignedMessage, CADESCOM_CADES_BES, true);
            } catch (err) {
                alert("Failed to verify signature. Error: " + GetErrorMessage(err));
                return false;
            }

            return true;
        }


В при работе функции StartSign() получаем хэш:
2Hb8FREIO5YV1Y4Uado8Jp945lphHVo0G3Y5sVpz5Cc=
И сама последовательность подписи, там много символов, не стал сюда писать.

При вызове функции и передачи в неё подписанного хэша и исходного хэша возникает ошибка: Процесс отмены не может быть продолжен - проверка сертификата недоступна (-2146762482)

Внедряем ЭЦП для документооборота на предприятии. Помогите понять, что не так? Делаем все по SDK.

Отредактировано пользователем 5 мая 2016 г. 11:56:04(UTC)  | Причина: Не указана

Offline ДмитрийУникальный  
#2 Оставлено : 5 мая 2016 г. 11:51:20(UTC)
ДмитрийУникальный

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

Группы: Участники
Зарегистрирован: 05.05.2016(UTC)
Сообщений: 3
Российская Федерация
Откуда: Россия

Еще странность. Делаем все на базе SharePoint 2013. Вычисление хэша от документа всегда возвращает разные значения, при этом документ сам не меняется. Есть мысль, что SharePoint меняет какие-то свои атрибуты документа.

Код:
HashAlgorithm myhash = HashAlgorithm.Create("GOST3411");
myhash.ComputeHash(file.OpenBinaryStream());
byte[] hashValue = myhash.Hash; //Каждый раз разное значение.


Это уже второй вопрос. Как в SharePoint тогда делать подписи?

Возвращаясь к первому вопросу, не работает даже пример из SDK: http://cpdn.cryptopro.ru...mples-sign-detached.html
Offline cross  
#3 Оставлено : 10 мая 2016 г. 13:25:22(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
У вас произошла ошибка при проверке сертификата подписанта. Либо не установлен корневой сертификат в хранилище "Доверенных корневых сертификатов" или нет CRL.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
Offline ДмитрийУникальный  
#4 Оставлено : 11 мая 2016 г. 9:00:14(UTC)
ДмитрийУникальный

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

Группы: Участники
Зарегистрирован: 05.05.2016(UTC)
Сообщений: 3
Российская Федерация
Откуда: Россия

Автор: cross Перейти к цитате
У вас произошла ошибка при проверке сертификата подписанта. Либо не установлен корневой сертификат в хранилище "Доверенных корневых сертификатов" или нет CRL.


Спасибо за ответ! Сертификат установлен. Через ПО на C# проходит успешно. ПО написал сам, проблем не возникло. Проблема только через JavaScript.
Про CRL можно подробнее?
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.