Пробую адаптировать такой код проверки подписи и получения данных
(на основании примера
https://docs.cryptopro.ru/cades/phpcades/phpcades-samples)
$signedData = new \CPSignedData();
$signedData->set_ContentEncoding(BASE64_TO_BINARY);
try {
// если сингатура не передана - считаем, что подпись Присоединенная
if (isset($this->signerParams['signin']) || $signature === null) {
$signedData->VerifyCades($content, 0x01, 0); // 0 - Присоединенная
} else {
$signedData->set_Content($content);
$signedData->VerifyCades($signature, CADES_BES, 1); // 1 - отсоединенная
}
} catch (\Throwable $e) {
$error = $e->getMessage();
LoggerHelper::getInstance()->error('$signedData->VerifyCades',[
'$e->getMessage()' => $e->getMessage(),
]);
if (strpos($e->getMessage(), '0x800B010A') !== false) {
$error = 'Не удается построить цепочку сертификатов для доверенного корневого центра';
}
if (Options::getInstance()->isSignTestMode()) {
if ( strpos($e->getMessage(), '0x80090006') !== false
|| strpos($e->getMessage(), '0x800B010A') !== false
) {
$error = '';
}
}
}
// получаем подписантов
$cpSigners = $signedData->get_Signers(); // CPSigners
if ($cpSigners) {
// первый подписант
$cpSigner = $cpSigners->get_Item(1); // CPSigner
if ($cpSigner) {
try {
$this->signingTime = $cpSigner->get_SigningTime(); // в формате 10.01.2022 15:01:37
} catch (\Throwable $e) {
LoggerHelper::getInstance()->error('$cpSigner->get_SigningTime()',[
'$e->getMessage()' => $e->getMessage(),
]);
}
try {
$cpCertificate = $cpSigner->get_Certificate();
} catch (\Throwable $e) {
throw new \Exception('Ошибка получения сертификата подписанта');
}
$this->isValid = false;
try {
$cpCertificateStatus = $cpCertificate->IsValid();
if ($cpCertificateStatus) {
$this->isValid = true;
}
} catch (\Throwable $e) {
throw new \Exception('Подпись недействительна');
}
if ($this->isValid && !Options::getInstance()->isSignTestMode()) {
try {
$certBase64 = $cpCertificate->Export(0);
$certPEM = "-----BEGIN CERTIFICATE-----\n" . $certBase64 . "\n" . "-----END CERTIFICATE-----\n";
$res = openssl_x509_read($certPEM);
if ($res) {
$CertData = openssl_x509_parse($res);
$authorityKeyIdentifier = substr(
str_replace(
":",
"",
str_replace("keyid:", "", $CertData['extensions']['authorityKeyIdentifier'])
),
0,
40
);
}
} catch (\Throwable $e) {
$resultFunction['error'] = 'Ошибка получения сертификата';
}
if (empty($authorityKeyIdentifier)) {
throw new \Exception('Ошибка получения идентификатора ключа удостоверяющего центра сертификата');
}
if (!CProSCP::checkAuthorityKeyIdentifierToAuthorizedCA($authorityKeyIdentifier)) {
throw new \Exception('Файл подписан ЭЦП не авторизованного удостоверяющего центра');
}
}
try {
// в этом поле информация подписанта ИНН, ФИО, КПП, ОРГН
$this->subjectName = $cpCertificate->get_SubjectName();
} catch (\Throwable $e) {
throw new \Exception('Ошибка получения информации о подписанте');
}
try {
$this->issuerName = $cpCertificate->get_IssuerName();
$this->fromDate = $cpCertificate->get_ValidFromDate();
$this->toDate = $cpCertificate->get_ValidToDate();
$this->serialNumber = $cpCertificate->get_SerialNumber();
$this->thumbPrint = $cpCertificate->get_Thumbprint();
} catch (\Throwable $e) {
throw new \Exception('Ошибка получения информации сертификата');
}
}
сразу затык - не могу найти аналог
$signedData->set_ContentEncoding(BASE64_TO_BINARY);
ну и дальше, тоже не понятно какие аналоги этого кода
$signedData->VerifyCades($content, 0x01, 0); // 0 - Присоединенная
} else {
$signedData->set_Content($content);
$signedData->VerifyCades($signature, CADES_BES, 1); // 1 - отсоединенная
пробую так
CMSSignedData cmsSignedData = new CMSSignedData(Base64.decode(fileContent));
в fileContent - подписанный файл с присоединённой подписью
// тут надо вставить аналог $signedData->set_ContentEncoding(BASE64_TO_BINARY);
подобного метода для cmsSignedData я не нашел
cmsSignedData.verifySignatures(....);
тут не понятно какой параметр передать
// получил подписанта
SignerInformation signer = cmsSignedData.getSignerInfos().getSigners().iterator().next();
тут тоже сомневаюсь, что правильно получил т.к. на php другие методы
$cpSigners = $signedData->get_Signers(); // CPSigners
$cpSigner = $cpSigners->get_Item(1); // CPSigner
но у cmsSignedData.getSigner() метод отсутствует
как получить сертификат?
метод signer.getCertificate() отсутствует
попробовал метод cmsSignedData.getCertificates() - возвращает пустую коллекцию
Отредактировано пользователем 9 декабря 2024 г. 10:56:04(UTC)
| Причина: Не указана