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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline vega  
#1 Оставлено : 5 февраля 2016 г. 8:26:57(UTC)
vega

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Разъяснения по коду

Offline vega  
#2 Оставлено : 5 февраля 2016 г. 13:55:55(UTC)
vega

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

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

Сказал(а) «Спасибо»: 11 раз
Вот сертификаты, с которыми есть проблемы certs.zip (5kb) загружен 3 раз(а).. Пытаюсь найти пользовательский (golovanov2015.cer)
Offline Kirill Sobolev  
#3 Оставлено : 5 февраля 2016 г. 14:16:40(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Функция crypto_cast<QByteArray>() преобразует строковое представление серийного номера в массив байт

Может быть в этом проблема? ИНН и СНИЛС должны кодироваться как numeric string, а для этого они должны быть правильно зарегистрированы в реестре (с правильным значением ExtraInfo).
Техническую поддержку оказываем тут
Наша база знаний
Offline vega  
#4 Оставлено : 5 февраля 2016 г. 14:32:53(UTC)
vega

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

Группы: Участники
Зарегистрирован: 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)  | Причина: Не указана

Offline Kirill Sobolev  
#5 Оставлено : 5 февраля 2016 г. 15:01:27(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Если ОС х64, то и окно просмотра показывает 64битный процесс, соответственно берется 64битная ветка реестра.
А если при этом код компилируется для х86, то при выполнении читается 32битная ветка, состав которой может отличаться.
Можете показать, что находится в issuer после выполнения двух вызовов CertStrToNameW?
Техническую поддержку оказываем тут
Наша база знаний
Offline vega  
#6 Оставлено : 8 февраля 2016 г. 7:33:55(UTC)
vega

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

Группы: Участники
Зарегистрирован: 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 раз(а).


Offline Kirill Sobolev  
#7 Оставлено : 8 февраля 2016 г. 9:31:38(UTC)
Кирилл Соболев

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

Группы: Участники
Зарегистрирован: 25.12.2007(UTC)
Сообщений: 1,733
Мужчина
Откуда: КРИПТО-ПРО

Поблагодарили: 177 раз в 168 постах
Цитата:
Сам посмотрел декодером, различия видны невооруженным глазом.

Подход правильный, только сравнивать надо было не с Linux, а с полем issuer в сертификате, который Вы ищите.
Добавьте флаг CERT_NAME_STR_ENABLE_UTF8_UNICODE_FLAG в вызов CertStrToName.
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Кирилл Соболев за этот пост.
vega оставлено 08.02.2016(UTC)
Offline vega  
#8 Оставлено : 8 февраля 2016 г. 10:48:23(UTC)
vega

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

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

Сказал(а) «Спасибо»: 11 раз
Спасибо, помогло!
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.