marcelxyz/php-xml-digital-signature

一个用于使用数字签名对XML文档进行签名的PHP库

v1.0 2017-04-07 15:43 UTC

This package is not auto-updated.

Last update: 2024-09-17 22:31:52 UTC


README

此库旨在使用PHP根据W3推荐在XML数字签名下对任意数据和整个XML文档进行签名。此类的代码灵感来源于xmlseclibs库,但由于其缺乏文档以及产生的签名文档无法正确验证,我发现它难以使用。

如果此类生成的文档无法验证(因为存在许多不同的签名规范,而我只测试了其中的一小部分),请与我联系,我将尽力满足您的需求。

安装

使用composer

php composer.phar require "marcelxyz/php-xml-digital-signature"

或者将src/XmlDigitalSignature.php文件要求在您的项目中。

示例

以下是如何使用此库的基本概述

$dsig = new XmlDsig\XmlDigitalSignature();

$dsig->loadPrivateKey('path/to/private/key', 'passphrase');
$dsig->loadPublicKey('path/to/public/key');

$dsig->addObject('I am a data blob.');
$dsig->sign();

$result = $dsig->getSignedDocument();

请参阅examples/文件夹以获取更多详细示例。

API文档

要签名一个XML文档,您需要回答以下问题

  1. 您将使用哪种签名算法(RSA/DSA/ECDSA等)?
  2. 您将使用哪种摘要(散列)方法?
  3. 您将使用哪种C14N(规范化)方法?
  4. 您想在结果XML文档中包含公钥信息吗?

以下各小节将进行介绍。

配置

签名算法

以下签名算法目前受到支持

  • DSA (XmlDsig\XmlDigitalSignature::DSA_ALGORITHM)
  • RSA (XmlDsig\XmlDigitalSignature::RSA_ALGORITHM)
  • 椭圆曲线DSA (XmlDsig\XmlDigitalSignature::ECDSA_ALGORITHM)
  • HMAC (XmlDsig\XmlDigitalSignature::HMAC_ALGORITHM)

使用带有适当XmlDsig\XmlDigitalSignature::*_ALGORITHM常量的XmlDsig\XmlDigitalSignature.setCryptoAlgorithm(algo)方法指定适当的算法。

默认值:RSA。

摘要方法

此库目前支持四种摘要方法,分别是

  • SHA1 (XmlDsig\XmlDigitalSignature::DIGEST_SHA1)
  • SHA256 (XmlDsig\XmlDigitalSignature::DIGEST_SHA256)
  • SHA512 (XmlDsig\XmlDigitalSignature::DIGEST_SHA512)
  • RIPMED-160 (XmlDsig\XmlDigitalSignature::DIGEST_RIPEMD160)

您使用的PHP版本必须支持您选择的摘要方法。此库将自动检查此问题,但您也可以通过调用PHP的hash_algos()函数来自行执行此操作。

通过使用带有适当XmlDsig\XmlDigitalSignature::DIGEST_*常量的XmlDsig\XmlDigitalSignature.setDigestMethod(digest)方法指定适当的摘要。

要添加对不同哈希方法的支持(前提是您的PHP版本支持它),请添加一个新的XmlDsig\XmlDigitalSignature::DIGEST_*常量,其值由hash_algos()定义。请记住,将适当的映射值添加到以下类属性中:$digestMethodUriMapping$openSSLAlgoMapping$digestSignatureAlgoMapping(阅读这些属性注释中的@see笔记以获取更多信息)。

默认值:SHA1。

C14N方法

此库目前支持以下规范化方法

这些可以通过添加必要的类常量进行扩展。如果您添加了新的C14N方法,请记住将其特定选项添加到XmlDsig\XmlDigitalSignature::$c14nOptionMapping数组中。

要指定不同的C14N方法,请使用适当的XmlDsig\XmlDigitalSignature::C14N_*常量调用XmlDsig\XmlDigitalSignature.setCanonicalMethod(c14n)方法。

默认值:规范化XML。

独立XML

要强制生成的XML包含设置为yes的独立伪属性,只需调用XmlDsig\XmlDigitalSignature.forceStandalone()方法。

默认值:no

节点命名空间前缀

要指定不同的ns前缀(或者您根本不想使用),只需将适当的值传递给XmlDsig\XmlDigitalSignature.setNodeNsPrefix(prefix)方法。

默认值:dsig

公钥/私钥生成

如果您的密钥对已经生成,请跳过本节,转到使用

生成密钥对有多种方法,但是以下是在Unix终端中使用OpenSSL生成RSA密钥对的示例。

私钥RSA

openssl genrsa -aes256 -out private.pem 2048

上述命令将生成一个2048模数的私钥AES256 RSA密钥。设置密码非常推荐。

公钥(PEM格式)

openssl rsa -in private.pem -pubout -out public.pem

上述命令基于先前生成的(或已存在的)私钥生成PEM格式的公证书。

公钥(X.509格式)

openssl req -x509 -new -key private.pem -days 3650 -out public.crt

上述命令生成一个有效期为3650天的公钥X.509证书。您将还会被提示输入生成此证书所需的一些基本信息(CSR)。生成的密钥也称为自签名证书。

公钥(XML格式)

如果您需要将公钥以XML格式附加到签名的XML文档中,您首先必须生成一个公证书(PEM或X.509格式)。完成此操作后,您可以将您的密钥转换为XML格式。

使用http://tools.ailon.org/tools/XmlKey可以将公RSA X.509证书转换为XML格式。

另一方面,可以使用https://superdry.apphb.com/tools/online-rsa-key-converter将公RSA PEM证书转换为XML格式。

使用方法

生成密钥并配置环境后,您就可以开始加载密钥和添加对象了。方法将在下面进行说明。

加载生成的密钥

一旦生成了适当的私钥、公钥和XML密钥(如果需要),您可以使用XmlDsig\XmlDigitalSignature.loadPrivateKey()XmlDsig\XmlDigitalSignature.loadPublicKey()XmlDsig\XmlDigitalSignature.loadPublicXmlKey()方法分别加载它们。

添加对象

对象数据(字符串或DOM节点)可以通过使用XmlDsig\XmlDigitalSignature.addObject()方法添加到XML文档中。如果需要对对象的值进行哈希处理,请确保将上述方法的第三个参数传递为true

结果数据将放置在<Object/>节点内部,并生成一个适当的<Reference/>元素集,其中包含对象的摘要。

签署文档

现在可能看起来很简单,您可以使用XmlDsig\XmlDigitalSignature.sign()方法签署生成的XML文档。当然,请注意该方法返回的值以及可能抛出的任何异常。

验证签名

反过来,可以使用XmlDsig\XmlDigitalSignature.verify()方法验证签名。

此外,您还可以使用Aleksey验证器来检查签名。但是,请注意,此验证器存在故障。具体来说

  1. 公钥必须嵌入到XML标记中。
  2. 经过“美化打印”的有效文档将无法通过验证,但一旦移除额外的制表符和新行,则可以通过验证。
  3. 它仅适用于RSA加密。

返回文档

XmlDsig\XmlDigitalSignature.getSignedDocument()返回作为字符串的规范化的XML标记。