Ver Mensaje Individual
  #3 (permalink)  
Antiguo 09/08/2012, 19:44
jasv
 
Fecha de Ingreso: julio-2008
Ubicación: Caldas, Antioquia, Colombia
Mensajes: 81
Antigüedad: 15 años, 9 meses
Puntos: 4
Respuesta: XML Signature con PHP

Hola,

Te dejo el código que me funcionó:

Código PHP:
Ver original
  1. <?php
  2.  
  3. require_once(dirname(__FILE__).'/soap-wsse.php');
  4.  
  5. class WSS_SoapClient extends SoapClient{
  6.     //Ruta del fichero de la clave privada
  7.     public $key_file="";
  8.     //Passphrase de la clave privada
  9.     public $passphrase="";
  10.     //Ruta del fichero del certificado
  11.     public $cert_file="";
  12.     //Mensaje SOAP enviado
  13.     public $soap_sent="";
  14.    
  15.     function __doRequest($request, $location, $action, $version, $one_way = null)
  16.     {
  17.         //Creamos un DOMDocument
  18.         $doc = new DOMDocument('1.0');
  19.         //Cargamos el XML pasado por parámetro
  20.         $doc->loadXML($request);
  21.        
  22.         //Creamos una instancia de WSSESoap con el documento, sin "mustUnderstand" ni "actor"
  23.         $objWSSE = new WSSESoap($doc,false,false);
  24.        
  25.         //Creamos una instacian de XMLSecurityKey con el RSA SHA1 y de tipo privado
  26.         $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1,array ('type'=>'private'));
  27.         //Pasamos el valor de passphrase
  28.         $objKey->passphrase=$this->passphrase;
  29.         //Cargamos la clave privada con la ruta del fichero, que es fichero y que no es certificado
  30.         $objKey->loadKey($this->key_file, TRUE);
  31.        
  32.         //Firmamos el mensaje
  33.         $objWSSE->signSoapDoc($objKey);
  34.        
  35.         //Añadimos el BinarySecurityToken, pasamos el contenido del certificado, le decimos que es formato PEM
  36.         $token = $objWSSE->addBinaryToken(file_get_contents($this->cert_file),TRUE);
  37.         //Añadimos el KeyInfo
  38.         $objWSSE->attachTokentoSig($token);
  39.        
  40.         //Añadimos el Timestamp
  41.         $objWSSE->addTimestamp(3600);
  42.        
  43.         //Guardamos el XML enviado
  44.         $this->soap_sent=$objWSSE->saveXML();
  45.         //echo htmlentities($this->soap_sent);exit();
  46.         //Llamamos al método __doRequest padre
  47.         return parent::__doRequest($this->soap_sent, $location, $saction, $version);
  48.     }
  49. }
  50.  
  51. $cliente = new WSS_SoapClient($wsdl,$opciones);
  52. $cliente->key_file = 'ruta/claveprivada.key;
  53. $cliente->passphrase = 'constraseñaclaveprivada';
  54. $cliente->cert_file = 'ruta/certificado.cert';

y así ya puedes utilizar las funciones del servicio normalmente.

Espero que te sirva.

Saludos.