我需要从pkcs7签名文件中提取用户证书。我可以使用以下命令行来完成此操作:
openssl pkcs7 -in somesign.pks7 -inform PEM -print_certs这将给我整个证书链,我可以处理结果文件来提取我想要的东西。
有没有办法用openssl_pkcs7_命令做到这一点?我看到openssl_pkcs7_verify有存储证书的$outfilename,但我没有签名的消息,但似乎$filename应该同时拥有签名和消息,这不是我的情况(签名在单独的文件中)。
发布于 2017-06-12 18:07:46
我不知道有一个PHP库有简单的API来做这件事。
不过,我已经实现了几个库,它们可以帮助完成这项任务。asn1、crypto-util和x509可以通过composer获得。
下面是从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结构提供一些指导。
发布于 2017-06-12 16:07:41
我已经通过exec()函数使用过了。
exec('../../apache/bin/openssl.exe pkcs7 -in D:/mypkcs7.p7b -inform DER -print_certs').但我认为,最好的选择是使用SMIME文件的结构。您可以通过分析OpenSSL的源代码来了解其结构。找到它可能很困难,但是一旦你找到它,你就可以在任何地方使用它。OpenSSL GitHub源代码可从here获得
https://stackoverflow.com/questions/18700851
复制相似问题