使用SimpleXMLElement生成含URL属性XML的异常问题求助
使用SimpleXMLElement生成XML签名结构的问题
我想用SimpleXMLElement生成符合XMLDSig标准的签名结构,但始终得到错误结果,具体问题如下:
错误输出与期望输出对比
实际生成的XML片段:
<pt:SignedInfo> <pt: www.w3.org TR 2001 REC-xml-c14n-20010315#WithComments"/> <pt: www.w3.org 2001 04 xmldsig-more#rsa-sha256"/> </pt:SignedInfo>
期望的正确XML片段:
<SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> </SignedInfo>
尝试的代码
我通过定义数组结构,调用addChild方法生成XML,相关代码如下:
$algorithm1 = "http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"; $algorithm2 = "http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"; $algorithm3 = "http://www.w3.org/2001/04/xmlenc#sha256"; $signatureStructure = array( 'SignedInfo' => array( 'CanonicalizationMethod Algorithm="'.$algorithm1.'"' => "", 'SignatureMethod Algorithm="'.$algorithm2.'"' => "", 'Reference Id="main_sign" URI=""' => array( 'Transforms' => '', 'DigestMethod Algorithm="'.$algorithm3.'"' => "", 'DigestValue' => '', ) ),
其他问题
除了属性生成错误,还遇到节点位置错误:SignedInfo被生成到Signature节点外部:
<pt:Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <pt:SignatureValue/> <pt:KeyInfo> <pt:X509Data> <pt:X509Certificate/> </pt:X509Data> </pt:KeyInfo> </pt:Signature> <pt:SignedInfo/> <!-- 该节点位于Signature外部 -->
完整期望结构
我需要生成的完整XML签名结构如下:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <SignedInfo> <CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"/> <SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha256"/> <Reference Id="main_sign" URI=""> <Transforms> <Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/> </Transforms> <DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/> <DigestValue>74aHiOhEsIwaRwbWLLfwQsfafGWARZJMbEu7X2nMasw=</DigestValue> </Reference> </SignedInfo> <SignatureValue>AARgcTwana1w....GdFBEN/3P /FDJUHQw63h/T4ghVWs=</SignatureValue> <KeyInfo> <X509Data> <X509Certificate>MIID....AyzVyw==</X509Certificate> </X509Data> </KeyInfo> </Signature>
当前实际完整结构
目前实际生成的结构:
<pt:Signature xmlns="http://www.w3.org/2000/09/xmldsig#"> <pt:SignedInfo> <pt: www.w3.org TR 2001 REC-xml-c14n-20010315#WithComments"/> <pt: www.w3.org 2001 04 xmldsig-more#rsa-sha256"/> <pt:Reference Id="main_sign" URI=""> <pt:Transforms/> <pt: www.w3.org 2001 04 xmlenc#sha256"/> <pt:DigestValue/> </pt:Reference> </pt:SignedInfo> <pt:SignatureValue/> <pt:KeyInfo> <pt:X509Data> <pt:X509Certificate/> </pt:X509Data> </pt:KeyInfo> </pt:Signature>
问题排查更新
我发现问题根源:SimpleXMLElement会自动删除URL中的http://前缀,移除该前缀后属性能正常设置,但我需要保留http://,请问如何用这个库解决?
内容的提问来源于stack exchange,提问作者scorpions77
相关产品推荐
相关产品推荐

