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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline blagorod  
#1 Оставлено : 25 марта 2013 г. 10:51:32(UTC)
blagorod

Статус: Участник

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

В виндовсе ок, подписывает.
Где искать причину?

Код:
Код:

function sign( certificate, document, signature) {
	
	// Создаем объект сертификата
	try {
		var oCert = ObjCreator("CAPICOM.Certificate");        
	}
	catch (e) {
	    alert('Не удалось создать CAPICOM.Certificate: ' + e.number);
	    return false;
	}

	// Импортируем сертификат в объект
	oCert.Import( $('#' + certificate).val() );
	
	// Создаем подписчик
	try {
	    var oSigner = ObjCreator("CAdESCOM.CPSigner");        
	}
	catch (e) {
        alert('Не удалось создать CAdESCOM.CPSigner: ' + e.number);
        return false;
	}

	// Помещаем объект сертификата в подписчик
    if (oSigner) {
    	oSigner.Certificate = oCert;
    }
    else {
        alert("Не удалось поместить сертификат в подписчик");
        return false;
    }
    
    var oSignedData = ObjCreator("CAdESCOM.CadesSignedData");

    var data = $('#' + document).val();

    // Подписываем документ
    if (data) {

		oSignedData.ContentEncoding = 1; // CADESCOM_BASE64_TO_BINARY;
        oSignedData.Content = data;
        
		oSigner.Options = 1; // CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN;
		
		try {
			//var sSignedData = oSignedData.SignCades(oSigner, CADESCOM_CADES_BES, true);
			var sSignedData = oSignedData.SignCades(oSigner, 1, true);
		}
		catch (e) {
			alert("Не удалось создать подпись. Ошибка: " + GetErrorMessage(e));
			return false;
		}
		
		$('#' + signature).val(sSignedData); // Помещаем подпись в элемент
        
    }
    else {
        alert("Отсутствуют данные для подписания.");
        return false;
    }
    
    return true;
}

function ObjCreator(name) {
    switch (navigator.appName) {
        case 'Microsoft Internet Explorer':
            return new ActiveXObject(name);          
        default:
	    var userAgent = navigator.userAgent;
            if(userAgent.match(/ipod/i) ||userAgent.match(/ipad/i) || userAgent.match(/iphone/i)) {
             return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
            }
            var cadesobject = document.getElementById('cadesplugin');
            return cadesobject.CreateObject(name);
            
    }
}
Offline blagorod  
#2 Оставлено : 25 марта 2013 г. 12:45:23(UTC)
blagorod

Статус: Участник

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

Подпись обычная.
Тему по ошибке создал в ветке "Усовершенствованной подписи".
Просьба администратору, перенести тему в соответствующий раздел.
Offline blagorod  
#3 Оставлено : 26 марта 2013 г. 10:43:55(UTC)
blagorod

Статус: Участник

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

Почему спустя 24ч нет ответа?
Offline blagorod  
#4 Оставлено : 26 марта 2013 г. 11:15:59(UTC)
blagorod

Статус: Участник

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

Самое удивительное, что с помощью этой функции данные подписываются в Линуксе.

Код:

function sign_button_click(select, data, sign, cert) {
	
    var e = document.getElementById(select);
    
    var selectedCertID = e.selectedIndex;
    
    if (selectedCertID == -1) {
        alert("Выберите сертификат");
        return;
    }
    
    var thumbprint = e.options[selectedCertID].value.split(" ").reverse().join("").replace(/\s/g, "").toUpperCase();
    try {
        var oStore = ObjCreator("CAPICOM.store");
        oStore.Open();
    } catch (e) {
        alert('Failed to create CAPICOM.store: ' + e.number);
        return false;
    }

    var CAPICOM_CERTIFICATE_FIND_SHA1_HASH = 0;    
    var oCerts = oStore.Certificates.Find(CAPICOM_CERTIFICATE_FIND_SHA1_HASH, thumbprint);

    if (oCerts.Count == 0) {
        alert("Сертификат не найден");
        return false;
    }
    var oCert = oCerts.Item(1);
    try {
        var oSigner = ObjCreator("CAdESCOM.CPSigner");        
    } catch (e) {
        alert('Failed to create CAdESCOM.CPSigner: ' + e.number);
        return false;
    }
    if (oSigner) {
        oSigner.Certificate = oCert;
		
		try {
			oCPAttribute = ObjCreator("CAdESCOM.CPAttribute"); 
		} catch (e) {
			alert('Failed to create CAdESCOM.CPAttribute: ' + e.number);
			return false;
		}
		
		for (i = 1; i <= oSigner.Certificate.ExtendedKeyUsage().EKUs.Count; i++) {
			
			oCPAttribute.OID.Value = oSigner.Certificate.ExtendedKeyUsage().EKUs.Item(i).OID;
		}
		
    }
    else {
        alert("Failed to create CPSigner");
        return false;
    }
       
    var oSignedData = ObjCreator("CAdESCOM.CadesSignedData");

    var txtDataToSign = document.getElementById(data).value;

    var CADES_BES = 1;
    var CADESCOM_CADES_DEFAULT = 0;

        if (txtDataToSign) {
            // Данные на подпись ввели
			oSignedData.ContentEncoding = CADESCOM_BASE64_TO_BINARY;
            oSignedData.Content = txtDataToSign;
            
			//document.getElementById(SignTypeId).value = 0;
			oSigner.Options = 1; //CAPICOM_CERTIFICATE_INCLUDE_WHOLE_CHAIN
			try {
				var sSignedData = oSignedData.SignCades(oSigner, CADES_BES, true);
			}
			catch (e) {
				alert("Не удалось создать подпись из-за ошибки: " + GetErrorMessage(e));
				return false;
			}
			
			$('#' + sign).val(sSignedData);
			$('#' + cert).val( oSigner.Certificate.Export(0) );

        } else {
            alert("Отсутствуют данные для подписания.");
            return false;
        }

    oStore.Close();
    
    return true;
}



То ли дело в платформе?
Если да, тогда почему во второй функции подпись работает?
Если причина в 1-й функции - почему она работает только в виндусе?

Эксперты, что скажете?

Отредактировано пользователем 26 марта 2013 г. 11:19:35(UTC)  | Причина: Не указана

Offline Новожилова Елена  
#5 Оставлено : 26 марта 2013 г. 13:01:26(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Цитата:
Почему спустя 24ч нет ответа?


У вас есть сертификат на годовую техническую поддержку "КриптоПро SDK"?

В вашем случае причина в том, что для создания подписи необходима ссылка на закрытый ключ сертификата. Понятно, что в сертификате, взятом из файла, этой ссылки нет.

На Windows и Linux по разному реализован алгоритм "поиска" данной ссылки:
1. На Windows осуществляется кэширование ссылки на закрытый ключ сертификата при его установке в хранилище с привязкой к закрытому ключу - путем создания KeyIdentifier.
2. Кроме того, даже если на Windows такой сертификат из хранилища "Личные" удалить, то по нашим наблюдениям, ссылка на закрытый ключ в KeyIdentifier останется.

Отредактировано пользователем 26 марта 2013 г. 14:33:40(UTC)  | Причина: Не указана

Offline blagorod  
#6 Оставлено : 26 марта 2013 г. 15:41:17(UTC)
blagorod

Статус: Участник

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

У меня нет сертификата на тех поддержку. Я не компания, а индивидуальный разработчик.

Подскажите, где почитать документацию о формировании ссылки на ключ и передачи ее объекту CAPICOM.Certificate?
Offline Новожилова Елена  
#7 Оставлено : 28 марта 2013 г. 13:26:18(UTC)
Новожилова Елена

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

Группы: Администраторы, Участники
Зарегистрирован: 10.12.2008(UTC)
Сообщений: 924
Женщина
Откуда: Крипто-Про

Поблагодарили: 99 раз в 95 постах
Почитать можно здесь http://msdn.microsoft.co...us/library/aa388162.aspx

Объект CAPICOM.Certificate.

Если сертификат получен из хранилища и в хранилище он установлен со ссылкой на закрытый ключ, то никакую ссылку ему дополнительно передавать не нужно.

Если сертификат импортирован из файла, то способов создать для него связь с закрытым ключом при помощи плагина в Linux в настоящий момент нет и пока не планируется.
Offline Hyperc0der  
#8 Оставлено : 28 марта 2013 г. 14:00:42(UTC)
Hyperc0der

Статус: Участник

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

Сказал(а) «Спасибо»: 2 раз
Поблагодарили: 1 раз в 1 постах
Автор: Новожилова Елена Перейти к цитате
Почитать можно здесь http://msdn.microsoft.co...us/library/aa388162.aspx

Объект CAPICOM.Certificate.

Если сертификат получен из хранилища и в хранилище он установлен со ссылкой на закрытый ключ, то никакую ссылку ему дополнительно передавать не нужно.

Если сертификат импортирован из файла, то способов создать для него связь с закрытым ключом при помощи плагина в Linux в настоящий момент нет и пока не планируется.


Насколько я понимаю, тогда не только на Linux, но и на Windows нельзя сделать ЯВНО ссылку на закрытый ключ в таком случае. Потому что нельзя создать отдельно объект CAPICOM.PrivateKey в плагине (в CAPICOM можно), исходя из SDK. (То что кэшируется ссылка на Windows можно назвать особенностью)

Как вариант, попробовать:

  1. Создать объект CAPICOM.Certificate, импортировать в него открытый ключ.
  2. Получить из сертификата thumbrint (отпечаток)
  3. Инициализировать хранилище сертификатов, и найти в хранилище уже этот сертификат по отпечатку с привязкой к закрытому ключу.

Отредактировано пользователем 28 марта 2013 г. 14:09:58(UTC)  | Причина: Не указана

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