首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从PKCS7签名中提取证书

从PKCS7签名中提取证书
EN

Stack Overflow用户
提问于 2013-09-09 22:42:20
回答 2查看 4.2K关注 0票数 13

我需要从pkcs7签名文件中提取用户证书。我可以使用以下命令行来完成此操作:

代码语言:javascript
复制
openssl pkcs7 -in somesign.pks7 -inform PEM -print_certs

这将给我整个证书链,我可以处理结果文件来提取我想要的东西。

有没有办法用openssl_pkcs7_命令做到这一点?我看到openssl_pkcs7_verify有存储证书的$outfilename,但我没有签名的消息,但似乎$filename应该同时拥有签名和消息,这不是我的情况(签名在单独的文件中)。

EN

回答 2

Stack Overflow用户

发布于 2017-06-12 18:07:46

我不知道有一个PHP库有简单的API来做这件事。

不过,我已经实现了几个库,它们可以帮助完成这项任务。asn1crypto-utilx509可以通过composer获得。

下面是从PKCS7 PEM文件中提取所有证书的基本概念证明:

代码语言:javascript
复制
<?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结构提供一些指导。

票数 3
EN

Stack Overflow用户

发布于 2017-06-12 16:07:41

我已经通过exec()函数使用过了。

代码语言:javascript
复制
exec('../../apache/bin/openssl.exe pkcs7 -in D:/mypkcs7.p7b -inform DER -print_certs').

但我认为,最好的选择是使用SMIME文件的结构。您可以通过分析OpenSSL的源代码来了解其结构。找到它可能很困难,但是一旦你找到它,你就可以在任何地方使用它。OpenSSL GitHub源代码可从here获得

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18700851

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档