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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline s.sokolko  
#1 Оставлено : 20 октября 2015 г. 12:08:14(UTC)
s.sokolko

Статус: Активный участник

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

Сказал(а) «Спасибо»: 15 раз
Добрый день, уважаемые участники форума!

Благодаря помощи и оперативным ответом на данном форуме, мне удалось написать код на JavaScript, который способен успешно создавать запросы на сертификат через CertEnroll. Данный код тестируется на Крипто ПРО browser plugin 2 и Firefox 41. При этом наблюдается странная ситуация: все идеально работает на Windowx XP/Windows 2003 Server, но не работает на Windows 7. При этом версии плагина и браузера совершенно идентичны. Для тестирования я даже развернул несколько "чистых" виртуальных машин с Windows 7. К сожалению, при генерации запроса вызовом var pkcs10 = objEnroll.CreateRequest(3); Я неизменно получаю ошибку Error: Error calling method on NPObject!

Прошу Вашей помощи. Возможно, есть какая-то специфика работы с CertEnroll под Windows 7? Буду признателен за любые идеи: в том числе как диагностировать проблему более детально, какие параметры стоит попробовать изменить. Исходный код моей программы приводится ниже.

Заранее благодарю всех за помощь!

Код:


function isIE() {
    var retVal = (("Microsoft Internet Explorer" == navigator.appName) || // IE < 11
        navigator.userAgent.match(/Trident\/./i)); // IE 11
    return retVal;
}

function isIOS() {
    var retVal = (navigator.userAgent.match(/ipod/i) ||
      navigator.userAgent.match(/ipad/i) ||
      navigator.userAgent.match(/iphone/i));
    return retVal;
}

// Функция активации объектов КриптоПро ЭЦП Browser plug-in
function CreateObject(name) {
    if (isIOS()) {
        // На iOS для создания объектов используется функция
        // call_ru_cryptopro_npcades_10_native_bridge, определенная в IOS_npcades_supp.js
        return call_ru_cryptopro_npcades_10_native_bridge("CreateObject", [name]);
    }
    if (!isIE()) {
        // В Firefox, Opera, Chrome, Safari создаются объекты NPAPI
        var pluginObject = document.getElementById("cadesplugin");
        return pluginObject.CreateObject(name);
    }
    // В Internet Explorer создаются COM-объекты
    if (name.match(/X509Enrollment/i)) {
        try {
            // Объекты CertEnroll создаются через CX509EnrollmentWebClassFactory
            var objCertEnrollClassFactory = document.getElementById("certEnrollClassFactory");
            return objCertEnrollClassFactory.CreateObject(name);
        }
        catch (e) {
            throw("Для создания обьектов X509Enrollment следует настроить веб-узел на использование проверки подлинности по протоколу HTTPS");
        }
    }
    // Объекты CAPICOM и CAdESCOM создаются обычным способом
    return new ActiveXObject(name);
}

function CreateRequest(dn) {
    var objCSP = CreateObject("X509Enrollment.CCspInformation");
    var objCSPs = CreateObject("X509Enrollment.CCspInformations");
    var objPrivateKey = CreateObject("X509Enrollment.CX509PrivateKey");
    var objRequest = CreateObject("X509Enrollment.CX509CertificateRequestPkcs10")
    var objObjectIds = CreateObject("X509Enrollment.CObjectIds");
    var objObjectId = CreateObject("X509Enrollment.CObjectId");
    var objX509ExtensionEnhancedKeyUsage = CreateObject("X509Enrollment.CX509ExtensionEnhancedKeyUsage");
    var objExtensionTemplate = CreateObject("X509Enrollment.CX509ExtensionTemplate");
    var objDn = CreateObject("X509Enrollment.CX500DistinguishedName");
    var objEnroll = CreateObject("X509Enrollment.CX509Enrollment");
    var objExtensionKeyUsage = CreateObject("X509Enrollment.CX509ExtensionKeyUsage");

    objCSP.InitializeFromName("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider");
    objCSPs.Add(objCSP);
    objPrivateKey.Length = 512;
    objPrivateKey.KeySpec = 1;
    objPrivateKey.ExportPolicy = 1;
    objPrivateKey.Existing = false;
    //objPrivateKey.CspInformations = objCSPs;
    objPrivateKey.ProviderName = "Crypto-Pro GOST R 34.10-2001 KC1 CSP";
    objPrivateKey.ProviderType = 75;
    objRequest.InitializeFromPrivateKey(1, objPrivateKey, "");
    objObjectId.InitializeFromValue("1.3.6.1.5.5.7.3.2");
    objObjectIds.Add(objObjectId);
    objX509ExtensionEnhancedKeyUsage.InitializeEncode(objObjectIds);
    objRequest.X509Extensions.Add(objX509ExtensionEnhancedKeyUsage);
    objDn.Encode(dn, 0x100000); // XCN_CERT_NAME_STR_NONE = 0 XCN_CERT_NAME_STR_DISABLE_UTF8_DIR_STR_FLAG  = 0x100000
    objRequest.Subject = objDn;
    objRequest.SmimeCapabilities = true; //SMIME
    objExtensionKeyUsage.InitializeEncode(0x80|0x40|0x20|0x10); // Электронная подпись, Неотрекаемость, Шифрование ключей, Шифрование данных (F0)
    objRequest.X509Extensions.Add(objExtensionKeyUsage);
    objEnroll.InitializeFromRequest(objRequest);
    var pkcs10 = objEnroll.CreateRequest(3); //<---вот строка, на которой возникает ошибка
    return pkcs10;
}

    $('#btn_request').on('click', function () {
        var dn = '2.5.4.4="Иванов";2.5.4.42="Иван Иванович";2.5.4.12="Директор";1.2.840.113549.1.9.2="Нестр имя";2.5.4.9="ул. Ак. Королева, 12";2.5.4.3="Иванов Иван Иванович";2.5.4.11="Отдел кадров";2.5.4.10="тестовая";2.5.4.6="RU";1.2.643.3.131.1.1="720720720720";1.2.643.100.1="4564564564545";1.2.643.100.3="456456456453345";';
        var request = CreateRequest(dn);
        return false;
    });
});



Offline s.sokolko  
#2 Оставлено : 22 октября 2015 г. 7:26:30(UTC)
s.sokolko

Статус: Активный участник

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

Сказал(а) «Спасибо»: 15 раз
Ап. Никто не сталкивался с такими проблемами? Может, хоть какие-то идеи есть? Прошу помощи! Проект просто в тупике...
Offline s.sokolko  
#3 Оставлено : 24 октября 2015 г. 10:26:40(UTC)
s.sokolko

Статус: Активный участник

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

Сказал(а) «Спасибо»: 15 раз
Буду продолжать общаться сам с собой: оказалось, что генерация запроса работает только на той машине, где установлен КриптоПРО УЦ. Это WinServer 2003. Там же Mozilla с плагином и все штатно. На любой другой машине - ошибка. Полагаю, дело в том, что установлены какие-то компоненты, которые использует плагин, но с плагином они не устанавливаются. Возможно, дело в незарегистрированных OID в реестре.
Так и не могу детально понять проблему.
Уважаемые представители Крипто ПРО, пожалуйста, ответьте. Скоро сдавать проект, он под угрозой срыва. Хотим использовать Ваш плагин в проекте, но пока не можем
Offline s.sokolko  
#4 Оставлено : 24 октября 2015 г. 19:58:37(UTC)
s.sokolko

Статус: Активный участник

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

Сказал(а) «Спасибо»: 15 раз
Сам себе и отвечу: ошибка была в строках установки криптопровайдера:
objPrivateKey.ProviderName = "Crypto-Pro GOST R 34.10-2001 KC1 CSP";
objPrivateKey.ProviderType = 75;

ProviderName почему-то везде разное (на разных установках КриптоПРО). Закомментировал строчку с ProviderName, оставив только ProviderType, и все заработало
Offline Андрей Писарев  
#5 Оставлено : 24 октября 2015 г. 21:22:50(UTC)
Андрей *

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

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

Сказал «Спасибо»: 500 раз
Поблагодарили: 2044 раз в 1585 постах
Автор: s.sokolko Перейти к цитате
Сам себе и отвечу: ошибка была в строках установки криптопровайдера:
objPrivateKey.ProviderName = "Crypto-Pro GOST R 34.10-2001 KC1 CSP";
objPrivateKey.ProviderType = 75;

ProviderName почему-то везде разное (на разных установках КриптоПРО). Закомментировал строчку с ProviderName, оставив только ProviderType, и все заработало


Можно так:
ProviderName = Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider
Техническую поддержку оказываем тут
Наша база знаний
Offline bstas  
#6 Оставлено : 10 апреля 2017 г. 10:41:09(UTC)
bstas

Статус: Активный участник

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

Сказал(а) «Спасибо»: 13 раз
Поблагодарили: 5 раз в 5 постах
Здравствуйте!
Дабы не создавать новую ветку, спрошу здесь.

Пишу функцию по созданию запроса на js (для КриптоПро УЦ 2.0). Код впринципе не вызывает вопросов, т.к. есть примеры на vbs

Код:
function GenerateSelfSignedCertRequest(sEKU, ContainerName){
	Pkcs10Request = new ActiveXObject("X509Enrollment.CX509CertificateRequestPkcs10");
	Pkcs10Request.Initialize(ContextUser)
	var PrivateKey = Pkcs10Request.PrivateKey
	PrivateKey.ProviderType = PROV_GOST_2001_DH
	PrivateKey.ProviderName = "Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider"
	PrivateKey.KeySpec = AT_KEYEXCHANGE
	PrivateKey.ContainerName = ContainerName
	var objObjectId = new ActiveXObject("X509Enrollment.CObjectId");
        objObjectId.InitializeFromValue(sEKU) 
        var objTemplateExt  = new ActiveXObject("X509Enrollment.CX509ExtensionTemplate") ;
try {  ObjTemplateExt.InitializeEncode(objObjectId, 1, 0) ;
} catch(e) {alert(e)}	
  Pkcs10Request.X509Extensions.Add(objTemplateExt)
  Pkcs10Request.Encode()
	
	return  Pkcs10Request.RawData
}


Для CObjectId инициализация отрабатывает, т.к. последующий вывод objObjectId.Value показывает OID корректно. Однако при инициализации шаблона , выделен try, выходит ошибка: "objTemplateExt" не определено. В чем может быть причина?
Offline cross  
#7 Оставлено : 10 апреля 2017 г. 15:49:23(UTC)
Анатолий Беляев

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

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

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
У вас при создании объекта имя с маленькой буквы.
Цитата:
var objTemplateExt = new ActiveXObject("X509Enrollment.CX509ExtensionTemplate") ;

а при использовании с большой
Цитата:
ObjTemplateExt.InitializeEncode(objObjectId, 1, 0) ;

Это разные объекты.
Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
thanks 1 пользователь поблагодарил Анатолий Беляев за этот пост.
bstas оставлено 11.04.2017(UTC)
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.