求助: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
相关产品推荐
相关产品推荐

