Статус: Активный участник
Группы: Участники
Зарегистрирован: 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;
});
});
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47 Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Ап. Никто не сталкивался с такими проблемами? Может, хоть какие-то идеи есть? Прошу помощи! Проект просто в тупике...
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47 Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Буду продолжать общаться сам с собой: оказалось, что генерация запроса работает только на той машине, где установлен КриптоПРО УЦ. Это WinServer 2003. Там же Mozilla с плагином и все штатно. На любой другой машине - ошибка. Полагаю, дело в том, что установлены какие-то компоненты, которые использует плагин, но с плагином они не устанавливаются. Возможно, дело в незарегистрированных OID в реестре. Так и не могу детально понять проблему. Уважаемые представители Крипто ПРО, пожалуйста, ответьте. Скоро сдавать проект, он под угрозой срыва. Хотим использовать Ваш плагин в проекте, но пока не можем
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47 Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Сам себе и отвечу: ошибка была в строках установки криптопровайдера: objPrivateKey.ProviderName = "Crypto-Pro GOST R 34.10-2001 KC1 CSP"; objPrivateKey.ProviderType = 75;
ProviderName почему-то везде разное (на разных установках КриптоПРО). Закомментировал строчку с ProviderName, оставив только ProviderType, и все заработало
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 12,709 Сказал «Спасибо»: 500 раз Поблагодарили: 2051 раз в 1591 постах
|
Автор: 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 |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 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" не определено. В чем может быть причина?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
У вас при создании объекта имя с маленькой буквы. Цитата:var objTemplateExt = new ActiveXObject("X509Enrollment.CX509ExtensionTemplate") ; а при использовании с большой Цитата:ObjTemplateExt.InitializeEncode(objObjectId, 1, 0) ; Это разные объекты. |
|
1 пользователь поблагодарил Анатолий Беляев за этот пост.
|
bstas оставлено 11.04.2017(UTC)
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close