我已经签署了XML,但我不知道如何在签名中包含KeyValue元素。有一些文档会节省很多时间。
下面的代码(如果您感兴趣的话)是我到目前为止用xmlseclibs做的事情:
<?php
require('xmlseclibs.php');
XML字符串
$getToken = '<getToken>
<item>
<Semilla>Random string</Semilla>
</item>
</getToken>';
创建XML对象(签名)
$getToken_DOMDocument = new DOMDocument();
$getToken_DOMDocument -> loadXml($getToken);
使用xmlseclibs
创建签名对象$getToken_XMLSecurityDSig = new XMLSecurityDSig();
$getToken_XMLSecurityDSig -> setCanonicalMethod(XMLSecurityDSig::C14N);
尝试关闭无效的ds:前缀
$options['prefix'] = '';
$options['prefix_ns'] = '';
$options['force_uri'] = TRUE;
$options['id_name'] = 'ID';
$getToken_XMLSecurityDSig -> addReference($getToken_DOMDocument, XMLSecurityDSig::SHA1, array('http://www.w3.org/2000/09/xmldsig#enveloped-signature', 'http://www.w3.org/TR/2001/REC-xml-c14n-20010315'), $options);
访问必要的密钥数据
$XMLSecurityKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type'=>'private'));
$XMLSecurityKey -> loadKey('../../DTE/certificado/firma/certificado.pem', TRUE);
/* if key has Passphrase, set it using $objKey -> passphrase = <passphrase> */
签署XML对象
$getToken_XMLSecurityDSig -> sign($XMLSecurityKey);
添加公钥
$getToken_XMLSecurityDSig -> add509Cert(file_get_contents('../../DTE/certificado/firma/certificado.pem'));
将封装签名附加到XML对象
$getToken_XMLSecurityDSig -> appendSignature($getToken_DOMDocument -> documentElement);
将签名的XML代码保存到文件
$getToken_DOMDocument -> save('sign-basic-test.xml');
?>
Additionaly也希望从这个图书馆:
提前致谢。
答案 0 :(得分:2)
以下是可能有助于解决这些问题的链接列表:
How to validate signature with phpseclib, in a XML signature message?
http://code.google.com/p/xmlseclibs/issues/detail?id=13
Which is the proper XML exclusive canonicalization?
不确定它会解决所有问题,但应该帮助你。
答案 1 :(得分:2)
我编写了一个名为xmldsig的外观库,以简化下划线XMLSecLibs的使用
使用此库,代码结果如下:
public function testSign()
{
$getToken = '<getToken>
<item>
<Semilla>Random string</Semilla>
</item>
</getToken>';
$data = new DOMDocument();
$data->loadXml($getToken);
$adapter = new XmlseclibsAdapter();
$adapter
->setPrivateKey(file_get_contents('privateKey.pem'))
->setPublicKey(file_get_contents('publicKey.pem'))
->setCanonicalMethod('http://www.w3.org/2001/10/xml-exc-c14n#')
->sign($data);
echo $data->saveXML();
);
}