我在尝试签署XML文件以发出soap请求时遇到问题。 这是我用来在变量中获取签名的函数:
private function signXml() {
$doc = new DOMDocument();
$doc->loadXML($this->xml);
foreach($doc->getElementsByTagNameNS('*', 'SignedInfo') as $elm) {
$SignedInfo = $elm->c14n();
$key = openssl_pkey_get_private ( file_get_contents($this->lc_key) , $this->lc_Password); //file_get_contents($this->key);
if ( openssl_sign($SignedInfo, $crypt, $key, OPENSSL_ALGO_SHA1) ) {
$this->data['SignatureValue'] = base64_encode($crypt);
} else {
throw new Exception('XML signature failed !');
}
}
}
当我使用SoapUI生成签名时,服务器会成功处理该请求。但是当我使用我的php脚本时,我会得到一个不同的签名,虽然digestValues是相同的,服务器会出现内部错误。
这是我应该使用的标准:
密钥标识类型=>二进制安全令牌
签名算法=> http://www.w3.org/2000/09/xmldsig#rsa-sha1
签名规范化=> http://www.w3.org/2001/10/xml-exc-c14n#
摘要算法=> SHA1
签名消息部分=>体