Статус: Новичок
Группы: Участники
Зарегистрирован: 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)
| Причина: Не указана
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 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
|
|
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
У вас произошла ошибка при проверке сертификата подписанта. Либо не установлен корневой сертификат в хранилище "Доверенных корневых сертификатов" или нет CRL. |
|
|
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 05.05.2016(UTC) Сообщений: 3  Откуда: Россия
|
Автор: cross  У вас произошла ошибка при проверке сертификата подписанта. Либо не установлен корневой сертификат в хранилище "Доверенных корневых сертификатов" или нет CRL. Спасибо за ответ! Сертификат установлен. Через ПО на C# проходит успешно. ПО написал сам, проблем не возникло. Проблема только через JavaScript. Про CRL можно подробнее?
|
|
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close