You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

求助:PHP中使用RSASSA-PSS(SHA256-RSA-MGF1)签名XML失败问题

在PHP中使用RSASSA-PSS(SHA256-RSA-MGF1)签名XML文档的问题

背景

我尝试在PHP中用RSASSA-PSS(SHA256-RSA-MGF1)算法给XML文档签名,已通过以下OpenSSL命令生成证书和私钥:

openssl req -newkey rsa-pss -new -nodes -x509 -days 3650 -pkeyopt rsa_keygen_bits:4096 -sigopt rsa_pss_saltlen:32 -keyout key.pem -out cert.pem

生成证书后,我用robrichards/xmlseclibs库尝试签名,但在将<Reference>关联到<Object>时出现Digest错误,签名验证失败,且发现该库本身不支持RSASSA-PSS算法。

我了解到PHP的ext-openssl扩展对该算法支持不完善,因此改用phpseclib库,还找到了针对xmlseclibs的RSASSA-PSS适配代码,但始终无法复现成功效果。

相关PHP代码

$objDSig = new XMLSecurityDSig();

$objDSig->setCanonicalMethod(XMLSecurityDSig::C14N);
$objDSig->addObject($dip,null,null);
$objDSig->addReference(
    $xmlDoc,
    XMLSecurityDSig::SHA256,
    array('http://www.w3.org/2000/09/xmldsig#enveloped-signature')
);

// 基于phpseclib实现的XMLSecurityKey::RSASSA_PSS自定义代码
$objKey = new XMLSecurityKey(XMLSecurityKey::RSASSA_PSS, array('type'=>'private'));
$objKey->loadKey($this->primary_key, TRUE);
$objDSig->sign($objKey);
$objDSig->add509Cert(file_get_contents($this->certificate), true, false, ['subjectName'=>true]);
$objDSig->appendSignature($xmlDoc->documentElement);

问题现象

  • 当<ds:Reference>元素的URI为空字符串(如URI="")时,Digest验证可通过,但使用带锚点的URI(比如URI="#pfx784add6d-1227-7ac4-10a0-ce5532815998")会出现错误
  • 即便Digest验证通过,签名也从未通过Chilkat XML数字签名验证工具的验证

生成的签名片段

<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:dpi="urn:oecd:ties:dpi:v1">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2007/05/xmldsig-more#sha256-rsa-MGF1"/>
<ds:Reference URI="#pfx784add6d-1227-7ac4-10a0-ce5532815998">
<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<ds:DigestValue>47DEQpj8HBSa+/TImW+5JCeuQeRkm5NMpJWZG3hSuFU=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>OrCZl+uY69KxnSQnoXw3...</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data>
<ds:X509SubjectName>TEST</ds:X509SubjectName>
<ds:X509Certificate>MIIGWTCCBBGgAwIBAgIUPqVSOTIBUtd6BkNxaEsusYuKEZAwPQYJKo...</ds:X509Certificate>
</ds:X509Data>
</ds:KeyInfo>
<ds:Object Id="pfx784add6d-1227-7ac4-10a0-ce5532815998">
...
</ds:Object>
</ds:Signature>

核心疑问

  • 有没有人成功在PHP中用RSASSA-PSS(SHA256-RSA-MGF1)算法签名XML文档?
  • phpseclib在这个场景下有没有已知问题?
  • 应该用什么特定方法或库才能确保签名通过验证?

内容的提问来源于stack exchange,提问作者K. Evgeny

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.19 07:24:53