Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро CSP 5.0
»
Ошибка "Объект или свойство не найдено. (0x80092004)" при поиске сертификата для подписания [JS]
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.01.2025(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 4 раз
|
Как получить общую информацию из ЭЦП это понятно: Код: var subjectName = yield oCertificate.SubjectName;
var issuerName = yield oCertificate.IssuerName;
var validFrom = yield oCertificate.ValidFromDate;
var validTo = yield oCertificate.ValidToDate;
var serialNumber = yield oCertificate.SerialNumber;
Как получить, например, конкретно ФИО из SubjectName? На демо-странице (async_code) нашел что-то, похожее на правду: Код:CertificateAdjuster.prototype.GetCertInfoString = function (
certSubjectName,
certFromDate
) {
return (
this.extract(certSubjectName, "CN=") +
"; Дата выдачи:" +
this.GetCertDate(certFromDate)
);
};
Пытаться адаптировать этот блок кода в свой? Где найти информацию про тот же самый "GetCertDate()"?И в примере используется ФИО из SubjectName или просто SubjectName со всей внутри информацией? Отредактировано пользователем 21 января 2025 г. 11:19:54(UTC)
| Причина: Не указана
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.01.2025(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 4 раз
|
UPD:Взял с async_code примеры кода для извлечения данных из ЭЦП:
Код://МЕТОДЫ ASYNC_CODE
function extract(from, what) {
var certName = "";
var begin = from.indexOf(what);
if (begin >= 0) {
var end = from.indexOf(", ", begin);
while (end > 0) {
if (this.checkQuotes(from.substr(begin, end - begin))) break;
end = from.indexOf(", ", end + 1);
}
certName = end < 0 ? from.substr(begin) : from.substr(begin, end - begin);
}
return certName;
}
function checkQuotes(str) {
var result = 0,
i = 0;
for (i; i < str.length; i++) if (str[i] === '"') result++;
return !(result % 2);
}
//МОЙ КОД
function showCertificateDetails(oCertificate, isFromContainer) {
...
this.currentSubjectNameFIO = this.extract(
yield oCertificate.SubjectName,
"CN="
); // Сохраняем текущий subjectName в глобальной переменной
...
}
function SignCreate(currentSubjectNameFIO, dataToSign) {
return new Promise(function (resolve, reject) {
cadesplugin.async_spawn(
function* (args) {
var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(
cadesplugin.CAPICOM_CURRENT_USER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED
);
var oStoreCerts = yield oStore.Certificates;
var oCertificates = yield oStoreCerts.Find(
cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,
currentSubjectNameFIO
);
var certsCount = yield oCertificates.Count;
if (certsCount === 0) {
err = "Certificate not found: " + currentSubjectNameFIO;
alert(err);
args[1](err);
}
var oCertificate = yield oCertificates.Item(1);
var oSigner = yield cadesplugin.CreateObjectAsync("CAdESCOM.CPSigner");
yield oSigner.propset_Certificate(oCertificate);
yield oSigner.propset_CheckCertificate(true);
yield oSigner.propset_TSAAddress("http://cryptopro.ru/tsp/");
var oSignedData = yield cadesplugin.CreateObjectAsync(
"CAdESCOM.CadesSignedData"
);
yield oSignedData.propset_Content(dataToSign);
try {
var sSignedMessage = yield oSignedData.SignCades(
oSigner,
cadesplugin.CADESCOM_CADES_X_LONG_TYPE_1
);
} catch (e) {
err = cadesplugin.getLastError(e);
alert("Failed to create signature. Error: " + err);
args[1](err);
}
yield oStore.Close();
return args[0](sSignedMessage);
},
resolve,
reject
);
});
Пытался передавать ФИО строкой, пытался передавать сертификат напрямую и из него доставать только SubjectName, пытался передавать SubjectName полностью в виде строки. В любом случае в консоли две ошибки: Код:Uncaught (in promise) Certificate not found: CN=... Ярослав Игоревич
Uncaught (in promise) {message: 'Объект или свойство не найдено. (0x80092004)', requestid: 41, type: 'error'}
В CAPICOM_CURRENT_USER_STORE ТОЧНО есть сертификат, с такими ФИО. Подскажите, в чем проблема и в каком направлении двигаться?
|
|
|
|
Статус: Новичок
Группы: Участники
Зарегистрирован: 10.01.2025(UTC) Сообщений: 8
Сказал(а) «Спасибо»: 4 раз
|
Не знаю, в чем была проблема, но поиск сертификата работает. Может быть кому-то пригодится код: Код:
var oStore = yield cadesplugin.CreateObjectAsync("CAdESCOM.Store");
yield oStore.Open(
cadesplugin.CAPICOM_CURRENT_USER_STORE,
cadesplugin.CAPICOM_MY_STORE,
cadesplugin.CAPICOM_STORE_OPEN_MAXIMUM_ALLOWED
);
var oStoreCerts = yield oStore.Certificates;
var currentUserCertCnt = yield oStoreCerts.Count;
var oCertificates = yield oStoreCerts.Find(
cadesplugin.CAPICOM_CERTIFICATE_FIND_SUBJECT_NAME,
currentSubjectNameFIO
);
console.log(currentUserCertCnt);
if (currentUserCertCnt === 0) {
err = "Certificate not found.";
alert(err);
args[1](err);
}
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 26.07.2011(UTC) Сообщений: 13,444 Сказал «Спасибо»: 552 раз Поблагодарили: 2235 раз в 1743 постах
|
Здравствуйте.
Теперь представьте, что пользователь получил ещё один сертификат с тем же currentSubjectNameFIO и бонусом - он тестовый или от УЦ, сертификатом от которого "нельзя подписывать" документы, а сайт молча его найдёт и будет использовать.
Почему не используется отпечаток, как уникальность сертификата? |
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
КриптоПро CSP 5.0
»
Ошибка "Объект или свойство не найдено. (0x80092004)" при поиске сертификата для подписания [JS]
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close