2013-09-09 5 views
13

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

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

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

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

+1

Вы не могли бы просто вызвать эту командную строку из 'system()' –

+0

Вы видели этот вопрос? https://stackoverflow.com/questions/29102564/php-how-to-parse-pkcs7-signature-blob –

ответ

1

У меня уже используется функция exec().

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

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

1

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

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

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

<?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, не полагаясь на внешние программы.

+0

Спасибо, это достаточно близко к тому, что я был после. Я продолжу использовать командную строку для чего-либо связанного с производством (через Symfony Process), но для моих экспериментальных целей эти библиотеки помогут понять и сломать процесс. –