Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Поиск по CERT_ID не срабатывает при наличии ИНН, СНИЛС и т.д.
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.10.2010(UTC) Сообщений: 47  Сказал(а) «Спасибо»: 11 раз
|
Доброго времени суток! Для поиска сертификата, заполняю структуру CERT_ID. Все работает отлично и даже с кириллицей в значениях атрибутов. Но когда в Issuer появляются атрибуты в кириллице (а может и не в ней дело), например ИНН, СНИЛС и т.д., то сертификат не находится. Вот код создания CERT_ID. Тип CertId - это smart pointer на CERT_ID PS: Функция crypto_cast<QByteArray>() преобразует строковое представление серийного номера в массив байт, а CertId.add<BYTE>() копирует данные к себе в хранилище. То есть проблем с серийником и с памятью здесь нет :-) Код:
template<> CertId crypto_cast(const CertificateDescriptionPtr& cert) {
DWORD issuerSize {};
if(!::CertStrToNameW(X509_ASN_ENCODING,
cert->issuerName().toStdWString().c_str(),
CERT_X500_NAME_STR,
nullptr,
nullptr,
&issuerSize,
nullptr)) {
throw Exception(QObject::tr("crypto_cast<CertId>(const CertificateDescriptionPtr& cert): Error %1").arg(getLastErrorStr()));
}
TypedBuffer<BYTE> issuer(issuerSize);
if(!::CertStrToNameW(X509_ASN_ENCODING,
cert->issuerName().toStdWString().data(),
CERT_X500_NAME_STR,
nullptr,
issuer.ptr(),
&issuerSize,
nullptr)) {
throw Exception(QObject::tr("crypto_cast<CertId>(const CertificateDescriptionPtr& cert): Error %1").arg(getLastErrorStr()));
}
QByteArray snData = crypto_cast<QByteArray>(BigInt { cert->serialNumber().toStdString() });
CertId id {};
id.get().dwIdChoice = CERT_ID_ISSUER_SERIAL_NUMBER;
#ifdef _WIN32
id.get().IssuerSerialNumber.Issuer.cbData = issuerSize;
id.get().IssuerSerialNumber.Issuer.pbData = id.add<BYTE>(issuerSize, issuer.data());
id.get().IssuerSerialNumber.SerialNumber.cbData = snData.size();
id.get().IssuerSerialNumber.SerialNumber.pbData = id.add<BYTE>(snData.size(), snData.data());
#else
id.get().f_name.IssuerSerialNumber.Issuer.cbData = issuerSize;
id.get().f_name.IssuerSerialNumber.Issuer.pbData = id.add<BYTE>(issuerSize, issuer.data());
id.get().f_name.IssuerSerialNumber.SerialNumber.cbData = snData.size();
id.get().f_name.IssuerSerialNumber.SerialNumber.pbData = id.add<BYTE>(snData.size(), snData.data());
#endif
return id;
}
Отредактировано пользователем 5 февраля 2016 г. 9:10:58(UTC)
| Причина: Разъяснения по коду
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.10.2010(UTC) Сообщений: 47  Сказал(а) «Спасибо»: 11 раз
|
Вот сертификаты, с которыми есть проблемы  certs.zip (5kb) загружен 3 раз(а).. Пытаюсь найти пользовательский (golovanov2015.cer)
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Функция crypto_cast<QByteArray>() преобразует строковое представление серийного номера в массив байт Может быть в этом проблема? ИНН и СНИЛС должны кодироваться как numeric string, а для этого они должны быть правильно зарегистрированы в реестре (с правильным значением ExtraInfo). |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.10.2010(UTC) Сообщений: 47  Сказал(а) «Спасибо»: 11 раз
|
Цитата:Может быть в этом проблема? ИНН и СНИЛС должны кодироваться как numeric string, а для этого они должны быть правильно зарегистрированы в реестре (с правильным значением ExtraInfo). ИНН и СНИЛС зарегистрированы нормально, просматриваются в сертификате по своим наименованиям, а не как OID-ы. А эта функция работает с серийным номером, а не с именем, имелось в виду это место: Код:QByteArray snData = crypto_cast<QByteArray>(BigInt { cert->serialNumber().toStdString() });
Отредактировано пользователем 5 февраля 2016 г. 14:37:05(UTC)
| Причина: Не указана
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Если ОС х64, то и окно просмотра показывает 64битный процесс, соответственно берется 64битная ветка реестра. А если при этом код компилируется для х86, то при выполнении читается 32битная ветка, состав которой может отличаться. Можете показать, что находится в issuer после выполнения двух вызовов CertStrToNameW? |
|
|
|
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.10.2010(UTC) Сообщений: 47  Сказал(а) «Спасибо»: 11 раз
|
Во вложении два файла. issuer_linux.bin - это то что вернула функция CertStrToNameW на Linux (Ubuntu 14.04, CSP 4). И там все работает как надо. issuer_windows.bin - это Windows XP, CSP 3.9.  issuer.zip (1kb) загружен 1 раз(а).Сам посмотрел декодером, различия видны невооруженным глазом. Linux:  issuer_linux.png (73kb) загружен 22 раз(а).Windows:  issuer_windows.png (59kb) загружен 20 раз(а).
|
|
|
|
|
|
Статус: Сотрудник
Группы: Участники
Зарегистрирован: 25.12.2007(UTC) Сообщений: 1,733  Откуда: КРИПТО-ПРО Поблагодарили: 177 раз в 168 постах
|
Цитата:Сам посмотрел декодером, различия видны невооруженным глазом. Подход правильный, только сравнивать надо было не с Linux, а с полем issuer в сертификате, который Вы ищите. Добавьте флаг CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG в вызов CertStrToName. |
|
 1 пользователь поблагодарил Кирилл Соболев за этот пост.
|
vega оставлено 08.02.2016(UTC)
|
|
|
Статус: Активный участник
Группы: Участники
Зарегистрирован: 22.10.2010(UTC) Сообщений: 47  Сказал(а) «Спасибо»: 11 раз
|
|
|
|
|
|
|
Форум КриптоПро
»
Средства криптографической защиты информации
»
Встраивание
»
Поиск по CERT_ID не срабатывает при наличии ИНН, СНИЛС и т.д.
Быстрый переход
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.
Important Information:
The Форум КриптоПро uses cookies. By continuing to browse this site, you are agreeing to our use of cookies.
More Details
Close