marcelxyz / php-xml-digital-signature
一个用于使用数字签名对XML文档进行签名的PHP库
Requires
- php: >= 5.3
Suggests
- ext-mcrypt: MCrypt extension
- ext-openssl: OpenSSL extension
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文档,您需要回答以下问题
- 您将使用哪种签名算法(RSA/DSA/ECDSA等)?
- 您将使用哪种摘要(散列)方法?
- 您将使用哪种C14N(规范化)方法?
- 您想在结果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方法
此库目前支持以下规范化方法
- 规范化XML(
XmlDsig\XmlDigitalSignature::C14N
) - 带注释的规范化XML(
XmlDsig\XmlDigitalSignature::C14N_COMMENTS
) - 排除性规范化XML(
XmlDsig\XmlDigitalSignature::C14N_EXCLUSIVE
) - 带注释的排除性规范化XML(
XmlDsig\XmlDigitalSignature::C14N_EXCLUSIVE_COMMENTS
)
这些可以通过添加必要的类常量进行扩展。如果您添加了新的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验证器来检查签名。但是,请注意,此验证器存在故障。具体来说
- 公钥必须嵌入到XML标记中。
- 经过“美化打印”的有效文档将无法通过验证,但一旦移除额外的制表符和新行,则可以通过验证。
- 它仅适用于RSA加密。
返回文档
XmlDsig\XmlDigitalSignature.getSignedDocument()
返回作为字符串的规范化的XML标记。