Я столкнулся с проблемой при попытке подписать файл XML, чтобы сделать запрос мыла.
Вот функция, которую я использую, чтобы получить подпись в переменной:
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 совпадает, и на сервере возникает внутренняя ошибка.
Вот стандарты, которые я должен использовать:
Key Identifiert Type => Двоичный токен безопасности
Алгоритм подписи => http://www.w3.org/2000/09/xmldsig#rsa-sha1
Подпись Каноникализация => http://www.w3.org/2001/10/xml-exc-c14n#
Алгоритм дайджеста => sha1
Часть подписанного сообщения => Тело
Задача ещё не решена.
Других решений пока нет …