Conclusión:
Snaft_J1 puso un ejemplo de clase para consumir WS con seguridad UserToken con la librería que menciona.
Yo pongo un ejemplo de clase que fuciona para firmar mensajes SOAP con certificado digital.
Código PHP:
Ver original<?php
require_once('../CLS/cls_soap-wsse.php');
class WSSoapClient extends SoapClient
{
//Ruta del fichero de la clave privada
public $key_file="";
//Passphrase de la clave privada
public $passphrase="";
//Ruta del fichero del certificado
public $cert_file="";
//Mensaje SOAP enviado
public $soap_sent="";
function __doRequest($request, $location, $saction, $version)
{
//Creamos un DOMDocument
$doc = new DOMDocument('1.0');
//Cargamos el XML pasado por parámetro
$doc->loadXML($request);
//Creamos una instancia de WSSESoap con el documento, sin "mustUnderstand" ni "actor"
$objWSSE = new WSSESoap($doc,false,false);
//Creamos una instacian de XMLSecurityKey con el RSA SHA1 y de tipo privado
$objKey = new XMLSecurityKey
(XMLSecurityKey
::RSA_SHA1,array ('type'=>'private')); //Pasamos el valor de passphrase
$objKey->passphrase=$this->passphrase;
//Cargamos la clave privada con la ruta del fichero, que es fichero y que no es certificado
$objKey->loadKey($this->key_file, TRUE, FALSE);
//Firmamos el mensaje
$objWSSE->signSoapDoc($objKey);
//Añadimos el BinarySecurityToken, pasamos el contenido del certificado, le decimos que es formato PEM
//Añadimos el KeyInfo
$objWSSE->attachTokentoSig($token);
//Guardamos el XML enviado
$this->soap_sent=$objWSSE->saveXML();
//Llamamos al método __doRequest padre
return parent::__doRequest($this->soap_sent, $location, $saction, $version);
}
}
?>
Creación del cliente SOAP
Código PHP:
Ver original//Opciones de conexion
//'location'=>$location,
'connection_timeout'=>60,
'exceptions'=>true,
'user_agent'=>'WSSESoap',
'trace'=>true);
//Creamos el cliente WSSoapClient
$sClient = new WSSoapClient($this->wsdl, $options);
//Cargamos la clave, passphrase y certificado
$sClient->key_file=$pk_file;
$sClient->cert_file=$cert_file;
$sClient->passphrase=$pk_passphrase;
Consumir WS
Código PHP:
Ver original$sClient->Comando(new SoapParam
(array("CAMPO"=>"1"),"ENTRADA"));