我正在尝试将标签中的 url 添加到我的 xml 结构中。我总是得到这个:
<pt:SignedInfo>
<pt: www.w3.org TR 2001 REC-xml-c14n-20010315#WithComments"/>
<pt: www.w3.org 2001 04 xmldsig-more#rsa-sha256"/>
我需要:
<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"/>
尝试创建我正在做的结构:
$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' => '',
)
),
我尝试使用以下代码将空数组传递给生成 xml 的函数:
$wrapper4 = $xml->addChild('pt:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315#WithComments"');
$this->signatureStructure($signatureStructure, $xml, $wrapper4);
但这会返回正确的结构,但是超出了我的标签:
<pt:Signature xmlns="http://www.w3.org/2000/09/xmldsig#">
例如,使用标签
SignedInfo
我正在这样做:
$wrapper4 = $xml->addChild('pt:SignedInfo');
$this->signedInfo($signedInfo, $xml, $wrapper4);
我的回报是:
<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/>** this it´s out of signature
我需要创建这个结构:
<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
合作
更新:
我发现我的问题了。这是 simpleXMLElement 从我的网址中删除
http://
,如果我删除 http://
,请正确设置此属性。我不知道这个库是否有办法解决这个问题
谢谢你的自述,抱歉我的英语不好
SimpleXML 是基本、简单 XML 结构的抽象 - 对所有功能使用 DOM。此外,属性需要单独设置,而不是作为节点名称的一部分。 XML 使用命名空间,因此您应该使用命名空间感知方法来创建元素节点。
在 DOM 中,创建和附加节点是两个单独的调用。您可以使用文档对象的方法创建节点,并使用父节点对象追加/插入它。
$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";
// define a variable for the namespace URI
$XMLNS_SIGNATURE = 'http://www.w3.org/2000/09/xmldsig#';
$document = new DOMDocument();
/* append the node */
$document->appendChild(
/* create an element node inside the namespace and store it for later use */
$signature = $document->createElementNS($XMLNS_SIGNATURE, 'Signature')
);
$signature->appendChild(
$signedInfo = $document->createElementNS($XMLNS_SIGNATURE, 'SignedInfo')
);
$signedInfo->appendChild(
$canonicalizationMethod = $document->createElementNS($XMLNS_SIGNATURE, 'CanonicalizationMethod')
);
// set an attribute without a namespace
$canonicalizationMethod->setAttribute('Algorithm', $algorithm1);
$signedInfo->appendChild(
$signatureMethod = $document->createElementNS($XMLNS_SIGNATURE, 'SignatureMethod')
);
$signatureMethod->setAttribute('Algorithm', $algorithm2);
$signedInfo->appendChild(
$reference = $document->createElementNS($XMLNS_SIGNATURE, 'Reference')
);
$reference->setAttribute('Id', 'main_sign');
$reference->setAttribute('URI', '');
$reference->appendChild(
$document->createElementNS($XMLNS_SIGNATURE, 'Transforms')
);
$reference->appendChild(
$digestMethod = $document->createElementNS($XMLNS_SIGNATURE, 'DigestMethod')
);
$digestMethod->setAttribute('Algorithm', $algorithm3);
$reference->appendChild(
$digestValue = $document->createElementNS($XMLNS_SIGNATURE, 'DigestValue')
);
/* set text content (replaces current content and child nodes) */
$digestValue->textContent = '123456...';
$signature
->appendChild(
$document->createElementNS($XMLNS_SIGNATURE, 'SignatureValue')
)
->appendChild(
/* create a text node */
$document->createTextNode('123456...')
);
$document->formatOutput = true;
echo $document->saveXML();
输出:
<?xml version="1.0"?>
<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/>
<DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha256"/>
<DigestValue>123456...</DigestValue>
</Reference>
</SignedInfo>
<SignatureValue>123456...</SignatureValue>
</Signature>