mirror of
https://github.com/crypto-pro-web/crypto-pro-php.git
synced 2025-01-18 11:25:50 +03:00
Частичное описание класса сертификата
This commit is contained in:
parent
48ef22c948
commit
16c2b4755c
34
src/AbstractAlgorithmInfo.php
Executable file
34
src/AbstractAlgorithmInfo.php
Executable file
@ -0,0 +1,34 @@
|
||||
<?php
|
||||
|
||||
namespace Webmasterskaya\CryptoPro;
|
||||
|
||||
/**
|
||||
* @property-read $algorithm
|
||||
* @property-read $oid
|
||||
*/
|
||||
abstract class AbstractAlgorithmInfo implements AlgorithmInfoInterface
|
||||
{
|
||||
protected $algorithm;
|
||||
protected $oid;
|
||||
|
||||
public function __construct($algorithm, $oid)
|
||||
{
|
||||
$this->algorithm = $algorithm;
|
||||
$this->oid = $oid;
|
||||
}
|
||||
|
||||
/**
|
||||
* @param $name
|
||||
*
|
||||
* @return string|void
|
||||
*/
|
||||
public function __get($name)
|
||||
{
|
||||
switch ($name)
|
||||
{
|
||||
case 'algorithm':
|
||||
case 'oid':
|
||||
return $this->{$name};
|
||||
}
|
||||
}
|
||||
}
|
8
src/AlgorithmInfoInterface.php
Executable file
8
src/AlgorithmInfoInterface.php
Executable file
@ -0,0 +1,8 @@
|
||||
<?php
|
||||
|
||||
namespace Webmasterskaya\CryptoPro;
|
||||
|
||||
interface AlgorithmInfoInterface
|
||||
{
|
||||
public function __construct(string $algorithm, string $oid);
|
||||
}
|
@ -2,6 +2,14 @@
|
||||
|
||||
namespace Webmasterskaya\CryptoPro;
|
||||
|
||||
use Webmasterskaya\CryptoPro\Constants\OIDsDictionary;
|
||||
use Webmasterskaya\CryptoPro\Helpers\ArrayHelper;
|
||||
use Webmasterskaya\CryptoPro\Helpers\CertificateHelper;
|
||||
use Webmasterskaya\CryptoPro\Helpers\ErrorMessageHelper;
|
||||
use Webmasterskaya\CryptoPro\Tags\IssuerTagsTranslations;
|
||||
use Webmasterskaya\CryptoPro\Tags\SubjectTagsTranslations;
|
||||
use Webmasterskaya\CryptoPro\Tags\TagsTranslationsInterface;
|
||||
|
||||
class Certificate
|
||||
{
|
||||
|
||||
@ -35,19 +43,51 @@ class Certificate
|
||||
/**
|
||||
* возвращает флаг действительности сертификата
|
||||
*
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
* @return bool
|
||||
*/
|
||||
public function isValid()
|
||||
{
|
||||
try
|
||||
{
|
||||
$isValid = $this->_cadesCertificate->IsValid();
|
||||
$isValid = (bool) $isValid->get_Result();
|
||||
}
|
||||
catch (\Throwable $e)
|
||||
{
|
||||
throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при проверке сертификата'));
|
||||
}
|
||||
|
||||
return $isValid;
|
||||
}
|
||||
|
||||
/**
|
||||
* возвращает указанное внутренее свойство у сертификата в формате Cades
|
||||
*
|
||||
* @return void
|
||||
* @param string $propName наименование свойства
|
||||
*
|
||||
* @throws \Exception
|
||||
* @return mixed
|
||||
*/
|
||||
public function getCadesProp()
|
||||
public function getCadesProp(string $propName)
|
||||
{
|
||||
try
|
||||
{
|
||||
if (method_exists($this->_cadesCertificate, 'get_' . $propName))
|
||||
{
|
||||
$propertyValue = call_user_func([$this->_cadesCertificate, 'get_' . $propName]);
|
||||
}
|
||||
else
|
||||
{
|
||||
throw new \Exception();
|
||||
}
|
||||
}
|
||||
catch (\Throwable $e)
|
||||
{
|
||||
throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при обращении к свойству сертификата'));
|
||||
}
|
||||
|
||||
return $propertyValue;
|
||||
}
|
||||
|
||||
/**
|
||||
@ -62,54 +102,160 @@ class Certificate
|
||||
/**
|
||||
* возвращает информацию об алгоритме сертификата
|
||||
*
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
* @return AlgorithmInfoInterface
|
||||
*/
|
||||
public function getAlgorithm()
|
||||
{
|
||||
try
|
||||
{
|
||||
$cadesPublicKey = $this->_cadesCertificate->PublicKey();
|
||||
$cadesPublicKeyAlgorithm = $cadesPublicKey->get_Algorithm();
|
||||
$algorithmInfo = new class(
|
||||
$cadesPublicKeyAlgorithm->get_FriendlyName(),
|
||||
$cadesPublicKeyAlgorithm->get_Value()) extends AbstractAlgorithmInfo {
|
||||
};
|
||||
}
|
||||
catch (\Throwable $e)
|
||||
{
|
||||
throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при получении алгоритма'));
|
||||
}
|
||||
|
||||
return $algorithmInfo;
|
||||
}
|
||||
|
||||
/**
|
||||
* возвращает расшифрованную информацию о владельце сертификата
|
||||
*
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
* @return array|array[]
|
||||
*/
|
||||
public function getOwnerInfo()
|
||||
{
|
||||
return $this->getInfo(SubjectTagsTranslations::class, 'SubjectName');
|
||||
}
|
||||
|
||||
/**
|
||||
* @param string $tags
|
||||
* @param string $entitiesPath
|
||||
*
|
||||
* @throws \Exception
|
||||
* @return array|array[]
|
||||
*/
|
||||
protected function getInfo(string $tags, string $entitiesPath)
|
||||
{
|
||||
if (!is_subclass_of($tags, TagsTranslationsInterface::class))
|
||||
{
|
||||
throw new \TypeError(
|
||||
sprintf(
|
||||
'Argument 1 passed to %s::getInfo() must be an instance of \Webmasterskaya\CryptoPro\Tags\TagsTranslationsInterface, instance of %s given.',
|
||||
get_called_class(), $tags
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
{
|
||||
try
|
||||
{
|
||||
$entities = $this->getCadesProp($entitiesPath);
|
||||
}
|
||||
catch (\Throwable $e)
|
||||
{
|
||||
throw new \Exception(ErrorMessageHelper::getErrorMessage($e, 'Ошибка при извлечении информации из сертификата'));
|
||||
}
|
||||
}
|
||||
|
||||
return CertificateHelper::parseCertInfo($tags, $entities);
|
||||
}
|
||||
|
||||
/**
|
||||
* возвращает расшифрованную информацию об издателе сертификата
|
||||
*
|
||||
* @return void
|
||||
* @throws \Exception
|
||||
* @return array|array[]
|
||||
*/
|
||||
public function getIssuerInfo()
|
||||
{
|
||||
return $this->getInfo(IssuerTagsTranslations::class, 'IssuerName');
|
||||
}
|
||||
|
||||
/**
|
||||
* возвращает ОИД'ы сертификата
|
||||
*
|
||||
* @return void
|
||||
* @return array
|
||||
*/
|
||||
public function getExtendedKeyUsage()
|
||||
{
|
||||
$OIDs = [];
|
||||
|
||||
try
|
||||
{
|
||||
$cadesExtendedKeysUsage = $this->_cadesCertificate->ExtendedKeyUsage();
|
||||
$cadesExtendedKeysUsage = $cadesExtendedKeysUsage->get_EKUs();
|
||||
$cadesExtendedKeysUsageCount = $cadesExtendedKeysUsage->get_Count();
|
||||
|
||||
if ($cadesExtendedKeysUsageCount > 0)
|
||||
{
|
||||
while ($cadesExtendedKeysUsageCount)
|
||||
{
|
||||
$cadesExtendedKeyUsage = $cadesExtendedKeysUsage->get_Item($cadesExtendedKeysUsageCount);
|
||||
$OIDs[] = $cadesExtendedKeyUsage->get_OID();
|
||||
|
||||
$cadesExtendedKeysUsageCount--;
|
||||
}
|
||||
}
|
||||
}
|
||||
catch (\Throwable $e)
|
||||
{
|
||||
throw new \Exception(ErrorMessageHelper::getErrorMessage($e, "Ошибка при получении ОИД'ов"));
|
||||
}
|
||||
|
||||
return $OIDs;
|
||||
}
|
||||
|
||||
/**
|
||||
* возвращает расшифрованные ОИД'ы
|
||||
*
|
||||
* @return void
|
||||
* @return array
|
||||
*/
|
||||
public function getDecodedExtendedKeyUsage()
|
||||
{
|
||||
$certOIDs = $this->getExtendedKeyUsage();
|
||||
|
||||
$decodedOIDs = [];
|
||||
|
||||
foreach ($certOIDs as $OID)
|
||||
{
|
||||
$decodedOIDs[$OID] = OIDsDictionary::MAP[$OID] ?? null;
|
||||
}
|
||||
|
||||
return $decodedOIDs;
|
||||
}
|
||||
|
||||
/**
|
||||
* проверяет наличие ОИД'а (ОИД'ов) у сертификата
|
||||
*
|
||||
* @return void
|
||||
* @param string|array $OIDs
|
||||
*
|
||||
* @throws \Exception
|
||||
* @return bool
|
||||
*/
|
||||
public function hasExtendedKeyUsage()
|
||||
public function hasExtendedKeyUsage($OIDs)
|
||||
{
|
||||
$certOIDs = $this->getExtendedKeyUsage();
|
||||
|
||||
if (is_string($OIDs))
|
||||
{
|
||||
$OIDs = [$OIDs];
|
||||
}
|
||||
|
||||
if (!is_array($OIDs))
|
||||
{
|
||||
$OIDs = (array) $OIDs;
|
||||
}
|
||||
|
||||
return ArrayHelper::every($OIDs, function ($oidToCheck) use ($certOIDs) {
|
||||
return in_array($oidToCheck, $certOIDs);
|
||||
});
|
||||
}
|
||||
}
|
62
src/Constants/OIDsDictionary.php
Executable file
62
src/Constants/OIDsDictionary.php
Executable file
@ -0,0 +1,62 @@
|
||||
<?php
|
||||
|
||||
namespace Webmasterskaya\CryptoPro\Constants;
|
||||
|
||||
class OIDsDictionary
|
||||
{
|
||||
public const MAP
|
||||
= [
|
||||
'1.2.643.2.2.34.6' => 'Пользователь Центра Регистрации',
|
||||
'1.2.643.2.39.1.1' => 'Использование в программных продуктах системы "1С:Предприятие 8"',
|
||||
'1.2.643.3.131.1.1' => 'ИНН',
|
||||
'1.2.643.3.141.1.1' => 'РНС ФСС',
|
||||
'1.2.643.3.141.1.2' => 'КП ФСС',
|
||||
'1.2.643.3.2.100.65.13.11' => 'Использование в системе АИС "Госзакупки" Сахалинской области.',
|
||||
'1.2.643.3.8.100.1' => 'Сертификат типа "ekey-ГОСТ"',
|
||||
'1.2.643.3.8.100.1.1' => 'Общее использование в системах ИОК без права заверения финансовых документов',
|
||||
'1.2.643.3.8.100.1.10' =>
|
||||
'Для участия в электронных торгах и подписания государственного контракта в информационных системах Тендерного комитета города Москвы уполномоченными лицами участников размещения государственного заказа города Москвы',
|
||||
'1.2.643.3.8.100.1.11' =>
|
||||
'Подписание электронных документов в автоматизированной информационной системе размещения государственного и муниципального заказа Саратовской области',
|
||||
'1.2.643.3.8.100.1.12' => 'Использование в системе государственного заказа Иркутской области',
|
||||
'1.2.643.3.8.100.1.13' =>
|
||||
'Использование в электронной торговой площадке агентства государственного заказа Красноярского края',
|
||||
'1.2.643.3.8.100.1.14' => 'Использование в электронной торговой площадке "Тендер"',
|
||||
'1.2.643.3.8.100.1.2' => 'Передача отчетности по ТКС',
|
||||
'1.2.643.3.8.100.1.3' => 'Оформление взаимных обязательств, соглашений, договоров, актов и т.п.',
|
||||
'1.2.643.3.8.100.1.4' => 'Внутрикорпоративный документооборот',
|
||||
'1.2.643.3.8.100.1.5' => 'Использование в системах электронной торговли',
|
||||
'1.2.643.3.8.100.1.6' => 'Использование в торгово-закупочной системе "ЭЛЕКТРА"',
|
||||
'1.2.643.3.8.100.1.7' => 'Использование в системе Портал государственных закупок Ставропольского края.',
|
||||
'1.2.643.3.8.100.1.8' => 'Использование в Единой системе электронной торговли B2B-Center и B2G.',
|
||||
'1.2.643.3.8.100.1.9' =>
|
||||
'Для участия в электронных торгах и подписания государственного контракта в электронной площадке ОАО «ЕЭТП» уполномоченными лицами участников размещения государственного или муниципального заказа',
|
||||
'1.2.643.5.1.24.2.1.3' =>
|
||||
'Формирование документов для получения государственных услуг в сфере ведения государственного кадастра недвижимости со стороны заявителя',
|
||||
'1.2.643.5.1.24.2.1.3.1' =>
|
||||
'Формирование кадастровым инженером документов для получения государственных услуг в сфере ведения государственного кадастра недвижимости со стороны заявителя',
|
||||
'1.2.643.5.1.24.2.2.2' => 'Формирование документов как результата оказания услуги со стороны органов регистрации прав',
|
||||
'1.2.643.5.1.24.2.2.3' =>
|
||||
'Формирование документов для получения государственных услуг в сфере государственной регистрации прав на недвижимое имущество и сделок с ним со стороны заявителя',
|
||||
'1.2.643.6.2.1.7.1' =>
|
||||
'Использование единоличным исполнительным органом юридического лица или уполномоченными представителями юридического лица в отношениях, связанных с возникновением, исполнением (осуществлением) и прекращением гражданских и иных прав и обязанностей в сфере негосударственного пенсионного обеспечения, негосударственного пенсионного страхования, в сфере деятельности паевых инвестиционных фондов, акционерных инвестиционных фондов, профессиональных участников рынка ценных бумаг, а также связанной с обслуживанием указанной деятельности услуг кредитных и иных организаций',
|
||||
'1.2.643.6.2.1.7.2' =>
|
||||
'Использование физическим лицом в отношениях, связанных с возникновением, исполнением (осуществлением) и прекращением гражданских прав и обязанностей в отношении инвестиционных паев паевых инвестиционных фондов, в том числе отношения, связанные с учетом и/или фиксацией прав на инвестиционные паи паевых инвестиционных фондов',
|
||||
'1.2.643.6.3' =>
|
||||
'Использование в электронных торговых системах и в программном обеспечении, связанным с обменом электронных сообщений',
|
||||
'1.2.643.6.3.1.1' => 'Использование на электронных площадок отобранных для проведения аукционах в электронной форме',
|
||||
'1.2.643.6.3.1.2.1' => 'Тип участника - Юридическое лицо',
|
||||
'1.2.643.6.3.1.2.2' => 'Тип участника - Физическое лицо',
|
||||
'1.2.643.6.3.1.2.3' => 'Тип участника - Индивидуальный предприниматель',
|
||||
'1.2.643.6.3.1.3.1' => 'Участник размещения заказа',
|
||||
'1.2.643.6.3.1.4.1' => 'Администратор организации',
|
||||
'1.2.643.6.3.1.4.2' => 'Уполномоченный специалист',
|
||||
'1.2.643.6.3.1.4.3' => 'Специалист с правом подписи контракта',
|
||||
'1.2.840.113549.1.9.2' => 'Неструктурированное имя',
|
||||
'1.3.6.1.4.1.24138.1.1.8.1' => 'Обеспечение юридической значимости в Системе "Электронная Торговая Площадка"',
|
||||
'1.3.6.1.4.1.29919.21' => 'Использование в системе Портал государственных закупок Ростовской области "Рефери".',
|
||||
'1.3.6.1.5.5.7.3.2' => 'Проверка подлинности клиента',
|
||||
'1.3.6.1.5.5.7.3.4' => 'Защищенная электронная почта',
|
||||
'1.3.643.3.8.100.15' => 'Использование в ЭТП "uTender"',
|
||||
];
|
||||
}
|
32
src/Helpers/ArrayHelper.php
Executable file
32
src/Helpers/ArrayHelper.php
Executable file
@ -0,0 +1,32 @@
|
||||
<?php
|
||||
|
||||
namespace Webmasterskaya\CryptoPro\Helpers;
|
||||
|
||||
class ArrayHelper
|
||||
{
|
||||
public static function any(array $array, callable $fn)
|
||||
{
|
||||
foreach ($array as $value)
|
||||
{
|
||||
if ($fn($value))
|
||||
{
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
return false;
|
||||
}
|
||||
|
||||
public static function every(array $array, callable $fn)
|
||||
{
|
||||
foreach ($array as $value)
|
||||
{
|
||||
if (!$fn($value))
|
||||
{
|
||||
return false;
|
||||
}
|
||||
}
|
||||
|
||||
return true;
|
||||
}
|
||||
}
|
@ -8,8 +8,18 @@ use Webmasterskaya\CryptoPro\Tags\TagsTranslationsInterface;
|
||||
|
||||
class CertificateHelper
|
||||
{
|
||||
public static function parseCertInfo(TagsTranslationsInterface $tagsTranslations, string $rawInfo)
|
||||
public static function parseCertInfo($tagsTranslations, string $rawInfo)
|
||||
{
|
||||
if (!is_subclass_of($tagsTranslations, TagsTranslationsInterface::class))
|
||||
{
|
||||
throw new \TypeError(
|
||||
sprintf(
|
||||
'Argument 1 passed to %s::parseCertInfo() must be an instance of \Webmasterskaya\CryptoPro\Tags\TagsTranslationsInterface, instance of %s given.',
|
||||
get_called_class(), $tagsTranslations
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
$extractedEntities = [];
|
||||
|
||||
preg_match_all('/([а-яА-Яa-zA-Z0-9\s.]+)=(?:("[^"]+?")|(.+?))(?:,|$)/', $rawInfo, $extractedEntities, PREG_SET_ORDER, 0);
|
||||
|
Loading…
Reference in New Issue
Block a user