falseclock / advanced-cms
一个PHP库,允许您解码和操作符合ETSI标准TS 101 733的CAdES或CMS高级电子签名。
Requires
- php: >=7.2
- adapik/cms: ^0.2
- adapik/phpasn1: ^2.3
Requires (Dev)
- ext-curl: *
- php-coveralls/php-coveralls: ^2.4.3
- phpunit/phpunit: ^9.5.10
This package is auto-updated.
Last update: 2024-09-15 22:54:25 UTC
README
一个PHP库,允许您解码和操作符合ETSI标准TS 101 733的CAdES或CMS高级电子签名。
这是一个库,它允许您操作CAdES或CMS电子签名标准(代表加密消息语法CMS的扩展版本),由ETSI制定。
安装
composer require falseclock/advanced-cms
背景
当在哈萨克斯坦和俄罗斯积极推广电子数字签名(电子签名)时,我意外地发现PHP中没有库可以实现以下功能:不仅将ASN.1签名记录形式化为对象,还可以通过添加OCSP检查或TSP标记来修改它,删除电子内容以仅保留签名,或简单地合并两个相同数据的不同签名。起点是adapik/cms库,在那个时期,它没有详细说明CAdES中所有可能的字段和数据。于是开始了漫长而艰辛的阅读RFC和编写代码的过程,以数千行代码详细描述了这些建议。但是,按照与Александр Данилов的协议,我们决定,原始库将像以前一样仅以读取模式工作,而我可以通过一个单独的包来实现其他所有功能。这正是我们最终所做的事情。
对于那些不理解电子签名如何工作、如何验证签名的合法性和可信度的人来说,理解这个库的本质和意义可能会相当困难。尽管如此,我还是尽力编写了所有可能的单元测试,并完全覆盖了代码。有关如何处理CMS文件、修改或创建新文件的信息,您可以根据test文件夹中的测试进行了解。未来的计划是实现签名操作,以及将CAdES形式的电子签名。在这方面,传递密码或私钥并不总是最佳实践,但既然PHP至今还没有这样的实现,为什么不试试看呢。
操作符
EncapsulatedContentInfo
EncapsulatedContentInfo - 根据RFC5652 - 存储签名数据的场所。将数据存储在电子签名的副本中不是必需的,因此可以删除或替换它们。
方法
setEContent
setEContent - 将内容记录为简单的字节序列(八进制序列)。
描述
public function setEContent(OctetString $octetString): self
如果签名数据和签名本身分开存储,但需要生成完整的CMS文件,该方法允许将内容嵌入到签名中。请注意,此方法不检查文件哈希和签名中的哈希,因为哈希算法可能不在openssl的标准供应中。
unSetEContent
unSetEContent - 从电子签名中删除签名数据。
描述
public function unSetEContent(): self
电子签名可以包含也可以不包含数据,因为数字签名是基于数据哈希生成的。为了可以分别存储数据和签名,合理地将它们分开是有意义的,特别是如果数据量非常大,因为它们总是可以通过签名中使用的哈希进行检查。
SignedData
signedData — 包含所有数字签名数据的对象。
方法
mergeCMS
mergeCMS — 合并摘要、公钥证书和已撤销证书,以及签名本身。
描述
public function mergeCMS(SignedData $signedData): SignedData
此方法允许将多个 CMS 文件合并为一个,如果同一个文件被不同的系统签名,或者每个签名都单独存储。
SignedDataContent
SignedDataContent — 根据 RFC5652,这是一系列元素,包括摘要、签名数据、证书、证书撤销和签名数据。
方法
appendDigestAlgorithmIdentifier
appendDigestAlgorithmIdentifier — 向当前哈希算法列表添加一个额外用于签名中的一个的算法。
描述
public function appendDigestAlgorithmIdentifier(AlgorithmIdentifier $algorithmIdentifier): self
未排序的摘要集合(哈希算法)用于签名。如果 CMS 中有两个或更多使用相同哈希算法的签名,则集合可能会重复。此集合中算法序列的数量对应于签名的数量。
appendCertificate
appendCertificate — 添加公钥证书,作为签名之一,以及其他辅助签名。
描述
public function appendCertificate(Certificate $certificate): self
请注意,CMS 中存在公钥证书不是强制性的,因为根据 RFC,此字段是可选的。根据相同的 RFC5652,此集合可以包含签名证书本身以及必要时的中间或根证书。
appendSignerInfo
appendSignerInfo — 将签名添加到 CMS,该签名包括哈希算法、签名和签名/未签名的属性。
描述
public function appendSignerInfo(Certificate $certificate): self
这是开发该库的主要原因之一。它允许将多个签名合并到一个 CMS 文件中。
SignerInfo
SignerInfo — 根据 RFC5652,签名可以包含未签名的数据。例如,OCSP 检查或 TSP 标记。尽管这些数据也可以在签名数据中找到,但并非所有签名工具都实现将附加属性保存到签名块中。为此,在 SignerInfo 中提供了一个未签名属性块,可以在此之后添加用于验证签名有效性的重要数据。有关属性的更多信息,请参阅 RFC5126。
方法
addUnsignedAttribute
addUnsignedAttribute — 添加未签名属性
描述
public function addUnsignedAttribute(UnsignedAttribute $newAttribute): SignerInf
通常,这是 OCSP 和 TSP 数据。实际上,属性不仅限于这些检查和标记。不过,相同类型的数据存储在一个未排序的序列集合中,该集合具有 OID 标识符,指示哪个序列包含哪个数据集。换句话说,例如,OCSP 标记将存储在具有 OID 1.2.840.113549.1.9.16.2.24 (revocationValues) 的 SEQUENCE SET 字段中,而 TSP 标记将存储在具有 OID 1.2.840.113549.1.9.16.2.14 (timeStampToken) 的序列集合中。
createUnsignedAttributes
createUnsignedAttributes — 创建未签名属性集
描述
protected function createUnsignedAttributes(): ?UnsignedAttributes
电子数字签名不必要包含未签名数据,但此集合可以添加到电子签名中而不破坏其数据完整性。
deleteUnsignedAttributes
deleteUnsignedAttributes — 删除未签名属性
描述
public function deleteUnsignedAttributes(): SignerInfo
与添加附加属性一样,它们可以轻松删除,而不会破坏签名的完整性和真实性。