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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline zer0c14  
#1 Оставлено : 23 октября 2014 г. 18:18:22(UTC)
zer0c14

Статус: Участник

Группы: Участники
Зарегистрирован: 25.05.2012(UTC)
Сообщений: 27
Мужчина
Российская Федерация
Откуда: Нижний Новгород

Сказал «Спасибо»: 4 раз
Необходимо найти сертификат по издателю и серийному номеру (СertFindCertificateInStore, CERT_FIND_CERT_ID). В хранилище пользователя установлены сертификаты, среди которых встречается сертификат из вложения. С ним возникают проблемы - с кодировкой после вызова функции CertNameToStr() и следующем OID-ом. Приведу код на PHP, но особой разницы нет, так как функции являются полными аналогами CryptoApi.

Код:

$certContext = null;
$serialNumber = '011BAA';
$systemStore = GostCsp\certOpenSystemStore(null, 'MY');
while(($certContext = GostCsp\certEnumCertificatesInStore($systemStore, $certContext))) {
    if (strrev(hex2bin($serialNumber)) == $certContext->getCertInfo()->getSerialNumber()) {
        $certStr = GostCsp\certNameToStr(
            GostCsp\X509_ASN_ENCODING,
            $certContext->getCertInfo()->getIssuer(),
            GostCsp\CERT_X500_NAME_STR
        );
        // ВОПРОС №2
        $certStr = str_replace('#1309536572766572204341', 'Server CA', $certStr);
        $certName = GostCsp\certStrToName(
            GostCsp\X509_ASN_ENCODING,
            // ВОПРОС №1
            iconv('utf-8', 'windows-1251', $certStr),
            GostCsp\CERT_X500_NAME_STR
        );
        $certId = new GostCsp\CertId(
            GostCsp\CERT_ID_ISSUER_SERIAL_NUMBER,
            new GostCsp\CertIssuerSerialNumber(
                $certName,
                strrev(hex2bin($serialNumber))
            )
        );
        $actualCertContext = GostCsp\certFindCertificateInStore(
            $systemStore,
            GostCsp\PKCS_7_ASN_ENCODING | GostCsp\X509_ASN_ENCODING,
            0, GostCsp\CERT_FIND_CERT_ID, $certId, null
        );
        if (!is_null($actualCertContext)) {
            echo base64_encode($certContext->getContent()) . "\n";
            break;
        }
    }
}


1. Вопрос связан с кодировкой, так например если я не использую iconv(), то получаю $certName в неверной кодировке. Веротяно функция certStrToName() внутри себя делает перевод из windows-1251 в utf-8, и если я передаю туда сразу utf-8 - то неправильно кодирует (сравнивал с оригинальным blob из $certContext->getCertInfo()->getIssuer()). В чем может быть проблема, как её можно исправить и убрать дополнительный вызов iconv()?

Цитата:
0.^Ac1^X0^V^F^E*.^Cd^A^R^M10276007879941^Z0^X^F^H*.^C^C.^C^A^A^R^L0076050160301402^F^CU^D<----->^L+Московский проспект д.121#0!^F<----->*.H..^M^A<----->^A^V^Troot@nalog.tensor.ru1^K0<>^F^CU^D^F^S^BRU110/^F
^L$ООО Компания Тензор100.^F^CU^D^K^L'Удостоверяющий центр1^R0^P^F^CU^D^C^S<--->TENSORCA3

Цитата:
0.^B^O1^X0^V^F^E*.^Cd^A^R^M10276007879941^Z0^X^F^H*.^C^C.^C^A^A^R^L0076050160301\0Z^F^CU^D<---->^LSМосковский проспект д.121#0!^F<-->*.H..^M^A<----->^A^V^Troot@nalog.tensor.ru1^K0<>^F^CU
^LFООО Компания Тензор1[0Y^F^CU^D^K^LRУдостоверяющий центр1^R0^P^F^CU^D^C^S>TENSORCA3


2. Вторая проблема связана с тем, что в issuer присутствует 1.2.840.113549.1.9.2="#1309536572766572204341", и вопрос заключается в том, что могу я как-нибудь зарегестрировать данный OID наравне с Email, CN, чтобы он сам кодировался и декодировался этой функцией. Т.к. поиск сертификата не происходит, потому что cert name blob-ы отличаются друг от друга (Server CA и #1309536572766572204341). Как мне и могу ли я зарегестрировать свои OID, чтобы они автоматически кодировались и декодировались функциями CertStrToName(), CertNameToStr()?

Цитата:
CN=УЦ Федерального казначейства, O=Федеральное казначейство, C=RU, L=Москва, STREET="улица Ильинка, дом 7", OGRN=1047797019830, INN=007710568760, S=77 г. Москва, E=uc_fk@roskazna.ru, 1.2.840.113549.1.9.2="
0.^A]1^X0^V^F<->*.H..^M^A<----->^B^S<-->Server CA1 0^^^F<------>*.H..^M^A<----->^A^V^Quc_fk@roskazna.ru1^\0^Z^F^CU^D^H^L^S77 г. Москва1^Z0^X^F^H*.^C^C.^C^A^A^R^L0077105687601^X0^V^F^E*.^Cd^A^R^M10477970198
^L/Федеральное казначейство1?0=^F^CU^D^C^L6УЦ Федерального казначейства

Цитата:
0.^Ak1&0$^F<--->*.H..^M^A<----->^B^L^W#13095365727665722043411 0^^^F<-->*.H..^M^A<----->^A^V^Quc_fk@roskazna.ru1^\0^Z^F^CU^D^H^L^S77 г. Москва1^Z0^X^F^H*.^C^C.^C^A^A^R^L0077105687601^X0^V^F^E*.^Cd^A^R^M104
^L/Федеральное казначейство1?0=^F^CU^D^C^L6УЦ Федерального казначейства

Отредактировано пользователем 27 октября 2014 г. 16:24:36(UTC)  | Причина: Не указана

Вложение(я):
charset.cer.txt (3kb) загружен 3 раз(а).
oid.cer.txt (3kb) загружен 5 раз(а).

У Вас нет прав для просмотра или загрузки вложений. Попробуйте зарегистрироваться.
Offline cross  
#2 Оставлено : 28 октября 2014 г. 14:15:58(UTC)
Анатолий Беляев

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

Группы: Администраторы, Участники
Зарегистрирован: 24.11.2009(UTC)
Сообщений: 965
Откуда: Crypto-Pro

Сказал(а) «Спасибо»: 3 раз
Поблагодарили: 174 раз в 152 постах
1) CertStrToName принимает Null Terminated string как ее прототип из CryptoAPI. UTF-8 кодировка при это исключается.
2) К сожалению просто зарегистрировать OID не получится, так как с ним еще нужно "регистрировать" тип asn1 кодирования данного атрибута. Наиболее широко используемые OID и их структуры зашиты в код.

Отредактировано пользователем 28 октября 2014 г. 14:16:58(UTC)  | Причина: Не указана

Техническую поддержку оказываем тут.
Наша база знаний.
Наша страничка в Instagram.
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Guest
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.