Подтвердить что ты не робот

Извлечь сертификат из подписи PKCS7 в php

Мне нужно извлечь сертификат пользователя из файла подписи pkcs7. Я могу сделать это через командную строку, используя следующее:

openssl pkcs7 -in somesign.pks7 -inform PEM -print_certs

Это даст мне целую цепочку сертификатов, и я могу обработать полученный файл, чтобы извлечь то, что я хочу.

Есть ли способ сделать это с помощью команд openssl_pkcs7_? Я видел, что openssl_pkcs7_verify имеет $outfilename, где будут храниться сертификаты, но у меня нет подписанного сообщения, но, похоже, имя файла должно иметь как подпись, так и сообщение, что не является моим делом (подпись находится в отдельном файл).

4b9b3361

Ответ 1

Я уже использовал его с помощью функции exec().

exec('../../apache/bin/openssl.exe pkcs7 -in D:/mypkcs7.p7b -inform DER -print_certs').

Но я думаю, лучший выбор - использовать структуру файлов SMIME. Вы можете получить структуру, проанализировав исходный код OpenSSL. Найти это может быть сложно, но как только вы его найдете, вы можете использовать его где угодно. Исходный код OpenSSL GitHub доступен здесь

Ответ 2

Я не знаю о PHP-библиотеке с простым API для этого.

Я реализовал несколько библиотек, однако это могло помочь в решении этой задачи. asn1, crypto-util и x509 доступны через композитор.

Здесь приведено базовое доказательство концепции, которая извлекает все сертификаты из PEM файла PKCS7:

<?php

use ASN1\Element;
use ASN1\Type\Constructed\Sequence;
use CryptoUtil\PEM\PEM;
use X509\Certificate\Certificate;

require __DIR__ . "/vendor/autoload.php";

$pem = PEM::fromFile("path-to-your.p7b");
// ContentInfo: https://tools.ietf.org/html/rfc2315#section-7
$content_info = Sequence::fromDER($pem->data());
// SignedData: https://tools.ietf.org/html/rfc2315#section-9.1
$signed_data = $content_info->getTagged(0)->asExplicit()->asSequence();
// ExtendedCertificatesAndCertificates: https://tools.ietf.org/html/rfc2315#section-6.6
$ecac = $signed_data->getTagged(0)->asImplicit(Element::TYPE_SET)->asSet();
// ExtendedCertificateOrCertificate: https://tools.ietf.org/html/rfc2315#section-6.5
foreach ($ecac->elements() as $ecoc) {
    $cert = Certificate::fromASN1($ecoc->asSequence());
    echo $cert->toPEM() . "\n";
}

Обработка ASN.1 очень подвержена ошибкам. Я пропустил все проверки работоспособности из приведенного выше примера, но основная библиотека будет генерировать исключения при ошибках.

Я надеюсь, что это даст некоторые указатели, если кто-то должен разбирать структуры PKCS # 7, не полагаясь на внешние программы.