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

Уведомление

Icon
Error

Опции
К последнему сообщению К первому непрочитанному
Offline GTAlex  
#1 Оставлено : 12 января 2022 г. 7:27:16(UTC)
GTAlex

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

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

Сказал(а) «Спасибо»: 19 раз
Уважаемые знатоки, помогите пожалуйста разобраться с документацией.

В данный момент ТЗ - вытащить из присоединённой подписи ИНН, ФИО, КПП, ОРГН (для дальнейшей сверки подписанта с данными организации)
Подпись проходит проверку, а так же вытаскиваю время подписи



Изучаю данный код и не могу разобраться с документацией, например хочу посмотреть методы и свойства класса CPSignedData ...
нашел в документации нечто похожее
https://docs.cryptopro.r...om_class/cadessigneddata
метод VerifyCades() есть, но не вижу метода get_Signers() - какой объект возвращает?

поиском нашел get_Signers тут, но судя по описанию - не то, возвращает HRESULT и вообще метод не того интерфейса
https://docs.cryptopro.r...erface/isignedxmlsigners

далее вопросы по цепочке - результирующий объект какого класса? как найти описание метода get_Item() ?
поиском нашел get_Item
https://docs.cryptopro.r...erface/icpattributesitem

и окончательно запутался :( и это рабочий код ...

в доке cadessigneddata тыкаю на свойство Signers - кидает на сайт майкрософта, хотя вроде это объект cpsigners
и на сайте есть к нему дока https://docs.cryptopro.r...cadescom_class/cpsigners



как получить ИНН ?

PS
все эти интересующие меня поля легко получаются с ком.строки
/opt/cprocsp/bin/amd64/cryptcp -nochain -vsignf blank.pdf -f blank.pdf.sgn
но раз уж связался с phpcades - хочу добиться получения нужных данных именно с помощью этого расширения

PPS
в идеале ещё бы и примеры в документации глянуть к данным классам

я так полагаю далее нужно получить сертификат подписанта
$certObj = $sObj->get_Certificate();
и какими то методами оттуда достать ИНН?

попробую пойти снизу вверх от CPSignedData через подписантов
ИНН, КПП и т.д. - это какой то OID (можно найти) https://docs.cryptopro.r...escom/cadescom_class/oid
OID - это свойство объекта класса CPAttribute https://docs.cryptopro.r...descom_class/cpattribute
...
далее нужно как то до CPSignedData добраться (напрямую от CPSignedData до OID не получается)

если сверху вниз скорее всего так
CPSignedData -> get_Signers()
CPSigners -> get_Item(1)
CPSigner -> get_AuthenticatedAttributes()
CPAttributes -> get_Item(1) (тут цикл по всем)
CPAttribute -> get_OID()
CPOID -> get_Value()

получил такое :)

1.2.840.113549.1.9.32
1.2.840.113549.1.9.53
1.3.6.1.4.1.311.88.2.14
1.2.840.113549.1.9.45
1.2.840.113549.1.9.16.2.47

в другой ветке читал, что OID ИНН = 1.2.643.3.131.1.1
тут такого нет
но у меня сомненья - я брал AuthenticatedAttributes это коллекция аутентифицированных атрибутов, по идее это атрибут подписанный т.е. AuthenticatedAttributes2
но ->get_AuthenticatedAttributes2() не отработал :(

Отредактировано пользователем 12 января 2022 г. 8:55:11(UTC)  | Причина: Не указана

Offline TolikTipaTut1  
#2 Оставлено : 12 января 2022 г. 9:06:51(UTC)
TolikTipaTut1

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

Группы: Участники
Зарегистрирован: 05.07.2018(UTC)
Сообщений: 318

Сказал(а) «Спасибо»: 35 раз
Поблагодарили: 35 раз в 32 постах
Автор: GTAlex Перейти к цитате
Уважаемые знатоки, помогите пожалуйста разобраться с документацией.

В данный момент ТЗ - вытащить из присоединённой подписи ИНН, ФИО, КПП, ОРГН (для дальнейшей сверки подписанта с данными организации)
Подпись проходит проверку, а так же вытаскиваю время подписи



Изучаю данный код и не могу разобраться с документацией, например хочу посмотреть методы и свойства класса CPSignedData ...
нашел в документации нечто похожее
https://docs.cryptopro.r...om_class/cadessigneddata
метод VerifyCades() есть, но не вижу метода get_Signers() - какой объект возвращает?

поиском нашел get_Signers тут, но судя по описанию - не то, возвращает HRESULT и вообще метод не того интерфейса
https://docs.cryptopro.r...erface/isignedxmlsigners

далее вопросы по цепочке - результирующий объект какого класса? как найти описание метода get_Item() ?
поиском нашел get_Item
https://docs.cryptopro.r...erface/icpattributesitem

и окончательно запутался :( и это рабочий код ...

в доке cadessigneddata тыкаю на свойство Signers - кидает на сайт майкрософта, хотя вроде это объект cpsigners
и на сайте есть к нему дока https://docs.cryptopro.r...cadescom_class/cpsigners



как получить ИНН ?

PS
все эти интересующие меня поля легко получаются с ком.строки
/opt/cprocsp/bin/amd64/cryptcp -nochain -vsignf blank.pdf -f blank.pdf.sgn
но раз уж связался с phpcades - хочу добиться получения нужных данных именно с помощью этого расширения

PPS
в идеале ещё бы и примеры в документации глянуть к данным классам

я так полагаю далее нужно получить сертификат подписанта
$certObj = $sObj->get_Certificate();
и какими то методами оттуда достать ИНН?

попробую пойти снизу вверх от CPSignedData через подписантов
ИНН, КПП и т.д. - это какой то OID (можно найти) https://docs.cryptopro.r...escom/cadescom_class/oid
OID - это свойство объекта класса CPAttribute https://docs.cryptopro.r...descom_class/cpattribute
...
далее нужно как то до CPSignedData добраться (напрямую от CPSignedData до OID не получается)

если сверху вниз скорее всего так
CPSignedData -> get_Signers()
CPSigners -> get_Item(1)
CPSigner -> get_AuthenticatedAttributes()
CPAttributes -> get_Item(1) (тут цикл по всем)
CPAttribute -> get_OID()
CPOID -> get_Value()

получил такое :)

1.2.840.113549.1.9.32
1.2.840.113549.1.9.53
1.3.6.1.4.1.311.88.2.14
1.2.840.113549.1.9.45
1.2.840.113549.1.9.16.2.47

в другой ветке читал, что OID ИНН = 1.2.643.3.131.1.1
тут такого нет
но у меня сомненья - я брал AuthenticatedAttributes это коллекция аутентифицированных атрибутов, по идее это атрибут подписанный т.е. AuthenticatedAttributes2
но ->get_AuthenticatedAttributes2() не отработал :(


Добрый день!

Мне кажется, что ИНН надо извлекать не из подписи самой, а из сертификата подписанта.
thanks 1 пользователь поблагодарил TolikTipaTut1 за этот пост.
GTAlex оставлено 12.01.2022(UTC)
Offline GTAlex  
#3 Оставлено : 12 января 2022 г. 9:27:18(UTC)
GTAlex

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

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

Сказал(а) «Спасибо»: 19 раз
вроде правильно - посмотрел в конце ветки, там так получают атрибуты

на уровень OID не нужно выходить, сразу при переборе атрибутов можно получать из имена и значения

$attrObj = $attrsObj->get_Item($i);
echo $attrObj->get_Name()."<br>";
echo $attrObj->get_ValueEncoding()."<br><br>";

только вот ничего похожего на ИНН и ФИО там нету :(

вообще непонятно что получил



видимо какие то не те атрибуты получил
Offline GTAlex  
#4 Оставлено : 12 января 2022 г. 9:32:56(UTC)
GTAlex

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

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

Сказал(а) «Спасибо»: 19 раз
Автор: TolikTipaTut1 Перейти к цитате
Добрый день!

Мне кажется, что ИНН надо извлекать не из подписи самой, а из сертификата подписанта.


Вы правы!

$certObj = $sObj->get_Certificate();
var_dump(iconv('windows-1251', 'utf-8', $certObj->GetInfo(CERT_INFO_SUBJECT_SIMPLE_NAME)));

ура! получил таки ФИО
теперь ИНН надыть найти :)

Offline GTAlex  
#5 Оставлено : 12 января 2022 г. 9:51:18(UTC)
GTAlex

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

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

Сказал(а) «Спасибо»: 19 раз
уффф, наконец то нашел
var_dump($certObj->get_SubjectName());

такую документацию врагу не пожелаешь
благо на форуме похожую ветку нашел

Отредактировано пользователем 12 января 2022 г. 9:52:15(UTC)  | Причина: Не указана

Offline Андрей *  
#6 Оставлено : 12 января 2022 г. 10:10:12(UTC)
Андрей *

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

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

Сказал «Спасибо»: 425 раз
Поблагодарили: 1718 раз в 1324 постах
Вот так ещё можно:
Цитата:
function getOID($OID, $certificate)
{
preg_match('/\/' . $OID . '=([^\/]+)/', $certificate, $matches);
if ($matches)
return $matches[1];

return "";
}
$certBase64 = $cert->Export(0);
//echo ', "Certificate": '. json_encode($certBase64);
$certPEM = "-----BEGIN CERTIFICATE-----\n" . $certBase64 . "\n" . "-----END CERTIFICATE-----\n";
$res = openssl_x509_read($certPEM);

$CertData = openssl_x509_parse($res);
$SNILS = getOID('1.2.643.100.3',$CertData['name'] );
$INN = getOID('1.2.643.3.131.1.1',$CertData['name'] );
$OGRN = getOID('1.2.643.100.1',$CertData['name'] );
Техническую поддержку оказываем тут
Наша база знаний
thanks 1 пользователь поблагодарил Андрей * за этот пост.
GTAlex оставлено 12.01.2022(UTC)
Offline GTAlex  
#7 Оставлено : 12 января 2022 г. 10:26:57(UTC)
GTAlex

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

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

Сказал(а) «Спасибо»: 19 раз
Автор: Андрей * Перейти к цитате
Вот так ещё можно:
Цитата:
function getOID($OID, $certificate)
{
preg_match('/\/' . $OID . '=([^\/]+)/', $certificate, $matches);
if ($matches)
return $matches[1];

return "";
}
$certBase64 = $cert->Export(0);
//echo ', "Certificate": '. json_encode($certBase64);
$certPEM = "-----BEGIN CERTIFICATE-----\n" . $certBase64 . "\n" . "-----END CERTIFICATE-----\n";
$res = openssl_x509_read($certPEM);

$CertData = openssl_x509_parse($res);
$SNILS = getOID('1.2.643.100.3',$CertData['name'] );
$INN = getOID('1.2.643.3.131.1.1',$CertData['name'] );
$OGRN = getOID('1.2.643.100.1',$CertData['name'] );


так не взлетело $CertData['name'] в какой то кодировке, регулярка не отрабатывает

'name' => string '/ST=54 \xD0\x9E\xD0\x91\xD0\x9B\xD0\x90\xD0\xA1\xD0\xA2\xD0\xAC \xD0\x9D\xD0\x9E\xD0\x92\xD0\x9E ....
RSS Лента  Atom Лента
Пользователи, просматривающие эту тему
Быстрый переход  
Вы не можете создавать новые темы в этом форуме.
Вы не можете отвечать в этом форуме.
Вы не можете удалять Ваши сообщения в этом форуме.
Вы не можете редактировать Ваши сообщения в этом форуме.
Вы не можете создавать опросы в этом форуме.
Вы не можете голосовать в этом форуме.