Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47  Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Добрый день, уважаемые участники форума! Я разрабатываю проект с использованием КриптоПРО ЭЦП browser plugin и CertEnroll. Недавно столкнулся с одной очень странной проблемой: я могу успешно сгенерировать запрос на сертификат при одном значении subject: Код:
objDn.Encode("CN=Иванов Иван Иванович", 0);
однако, стоит мне сделать subject сложнее (пример более приближен к реальности), как возникает ошибка: при коде Код:
objDn.Encode("1.2.643.100.3=12345678909/1.2.643.100.1=1234567890987/1.2.643.3.131.1.1=123456789098/emailAddress=sdf@inbox.ru, C=RU, ST=72 Тюменская область, L=Губкинский, O=ООО ТЕСТ, CN=Иванов Иван Иванович/street=мкр. 1-й, 33/unstructuredName=INN=1234567890/KPP=123456789/OGRN=1234567890987/title=Директор, GN=Иван Иванович, SN=Иванов", 0); // XCN_CERT_NAME_STR_NONE = 0
Текст ошибки: Цитата: Error: Error calling method on NPObject!
Я использую браузер Mozilla Firefox под windows с КриптоПРО ЭЦП browser plugin Вот полный листинг моего кода, который выполняет формирование запроса на сертификат: Код:
<html>
<head>
<title>Certificate Request test</title>
</head>
<body>
<style type="text/css">
object.hiddenObject
{
visibility: hidden;
width: 0px;
height: 0px;
margin: 0px;
padding: 0px;
border-style: none;
border-width: 0px;
max-width: 0px;
max-height: 0px;
}
</style>
<object id="cadesplugin" type="application/x-cades" class="hiddenObject">
</object>
<object id='certEnrollClassFactory' classid='clsid:884e2049-217d-11da-b2a4-000e7bbb2b09'>
</object>
<script language="javascript">
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);
}
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");
objCSP.InitializeFromName("Crypto-Pro GOST R 34.10-2001 Cryptographic Service Provider");
objCSPs.Add(objCSP);
objPrivateKey.Length = 512;
objPrivateKey.KeySpec = 2;
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("CN=Иванов Иван Иванович", 0); // XCN_CERT_NAME_STR_NONE = 0
objDn.Encode("1.2.643.100.3=12345678909/1.2.643.100.1=1234567890987/1.2.643.3.131.1.1=123456789098/emailAddress=sdf@inbox.ru, C=RU, ST=72 Тюменская область, L=Губкинский, O=ООО ТЕСТ, CN=Иванов Иван Иванович/street=мкр. 1-й, 33/unstructuredName=INN=1234567890/KPP=123456789/OGRN=1234567890987/title=Директор, GN=Иван Иванович, SN=Иванов", 0); // XCN_CERT_NAME_STR_NONE = 0
objRequest.Subject = objDn;
objEnroll.InitializeFromRequest(objRequest);
var pkcs10 = objEnroll.CreateRequest(3);
document.write("<br><pre>" + pkcs10+"</pre>");
</script>
</body>
</html>
Заранее благодарен за помощь и ответы!
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,752   Сказал «Спасибо»: 577 раз Поблагодарили: 2307 раз в 1807 постах
|
Код:1.2.643.100.3=12345678909/1.2.643.100.1=1234567890987/1.2.643.3.131.1.1=123456789098/emailAddress=sdf@inbox.ru,
Почему так записано? Это же отдельные OID-ы, почему через /, а не через разделитель - запятую? |
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47  Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Это пример из сертификата, который уже был выдан ранее удостоверяющим центром КриптоПРО УЦ. Запрос был почему-то сформирован Центром самостоятельной регистрации КриптоПРО УЦ именно в таком виде. Я пробовал перевести его в более читаемый формат, разделяя все поля запятой, однако, тоже получаю ошибку. Вначале я думал, что строка subject просто слишком длинная, но оказалось, что это не так. Может быть, можно как-то диагностировать проблему? Есть ли способ узнать код и причину ошибки при данном вызове?
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47  Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Сегодня более детально рассмотрел запросы, генерируемые моим кодом из браузера и те, что есть в истории Крипто ПРО УЦ. Заметил, что отличается Public key Parameter Set: у меня получается Parameter set: id-GostR3410-2001-CryptoPro-A-ParamSet, а в правильном запросе Parameter set: id-GostR3410-2001-CryptoPro-XchA-ParamSet. Можно ли как-то изменить Parameter Set из javascript? Какой объект отвечает за данное свойство?
|
|
|
|
Статус: Сотрудник
Группы: Администраторы, Участники Зарегистрирован: 24.11.2009(UTC) Сообщений: 965 Откуда: Crypto-Pro
Сказал(а) «Спасибо»: 3 раз Поблагодарили: 174 раз в 152 постах
|
|
|
 1 пользователь поблагодарил Анатолий Беляев за этот пост.
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 23.09.2015(UTC) Сообщений: 47  Откуда: Тюмень Сказал(а) «Спасибо»: 15 раз
|
Автор: cross  http://cpdn.cryptopro.ru/default.asp?url=content/cades/x509privatekey.html Вам нужно KeySpec свойство. Спасибо! Именно это и было нужно! Если кто-то ещё будет реализовывать подобную функциональность: dn нужно передавать в виде имя="значение"; , пары разделять точкой с запятой. Вместо имени лучше использовать цифровое обозначение свойств, например: 2.5.4.3="ООО Вектор";
|
|
|
|
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close