Мне нужно подписать исходящие запросы на мыло

Я пытаюсь отправить подписанные запросы на мыло, но, похоже, что-то не хватает.

Я пробовал библиотеку wso2, но это не сработает в Ubuntu 14.04 с php7.0

Затем я попробовал это: https://github.com/LinioIT/wse-php но продолжай получать
ERR_025: Verification failure: No signature in the WS-Security message for the configured soap actor/role ""! in SoapClient->__call()

Я проверил это в soapUI и получил его работать, но не могу перевести его на PHP

Вот мой код:

<?php
$wsdl = "/***/GeefOnderneming.wsdl";
$cafile = "/var/www/src/cert/CA_cat_inv.pem";
$location = "https://***.be/GeefOndernemingDienst-02.00";
$uri = "http://***.be";
$local_cert = "/var/www/src/cert/cert_priv_pub.pem";
$soap = new SoapWsController($wsdl, [
'local_cert' => $local_cert,
'cafile' => $cafile,
'location' => $location,
'uri' => $uri,
'connection_timeout' => 10,
]);
$theResponse = $soap->geefOnderneming(
$payload
);

SoapWsController расширен от SoapClient по умолчанию:
Я не уверен, что определения правильные, я пробовал много вариантов

namespace Drupal\vlaio_dossiers\Controller;

use DOMDocument;
use SoapClient;
use XMLSecurity\WSSESoap;
use XMLSecurity\XMLSecurityKey;

define('PRIVATE_KEY', '/***/key_ecc_private.pem');
define('SERVICE_CERT', '/***/cert_priv_pub.pem');
define('CERT_FILE', '/***/certificate.pem');

class SoapWsController extends SoapClient {
public function __doRequest($request, $location, $saction, $version,$one_way = NULL)
{
$doc = new DOMDocument('1.0');
$doc->loadXML($request);

$objWSSE = new WSSESoap($doc);

/* add Timestamp with no expiration timestamp */
$objWSSE->addTimestamp();

/* create new XMLSec Key using AES256_CBC and type is private key */
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array('type' => 'private'));

/* load the private key from file - last arg is bool if key in file (true) or is string (false) */
$objKey->loadKey(PRIVATE_KEY, true);

/* Sign the message - also signs appropiate WS-Security items */
$options = array("insertBefore" => false);
$objWSSE->signSoapDoc($objKey, $options);

/* Add certificate (BinarySecurityToken) to the message */
$token = $objWSSE->addBinaryToken(file_get_contents(CERT_FILE));

/* Attach pointer to Signature */
$objWSSE->attachTokentoSig($token);

$objKey = new XMLSecurityKey(XMLSecurityKey::AES256_CBC);
$objKey->generateSessionKey();

$siteKey = new XMLSecurityKey(XMLSecurityKey::RSA_OAEP_MGF1P, array('type' => 'public'));
$siteKey->loadKey(SERVICE_CERT, true, true);

$options = array("KeyInfo" => array("X509SubjectKeyIdentifier" => true));
$objWSSE->encryptSoapDoc($siteKey, $objKey, $options);

$retVal = parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);

$doc = new DOMDocument();
$doc->loadXML($retVal);

$options = array("keys" => array("private" => array("key" => PRIVATE_KEY, "isFile" => true, "isCert" => false)));
$objWSSE->decryptSoapDoc($doc, $options);

return $doc->saveXML();
}
}

1

Решение

У меня такая же проблема, как и у вас.
Я наконец-то решил это с помощью https://github.com/robrichards/xmlseclibs.
Убедитесь, что вы используете последнюю версию xmlseclibs.

0

Другие решения

Других решений пока нет …

По вопросам рекламы [email protected]