Ver Mensaje Individual
  #6 (permalink)  
Antiguo 16/02/2011, 10:40
Avatar de cluster28
cluster28
 
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 11 meses
Puntos: 32
Respuesta: SOAP con certificado digital

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
  1. <?php
  2. require_once('../CLS/cls_soap-wsse.php');
  3.  
  4. class WSSoapClient extends SoapClient
  5. {
  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, $saction, $version)
  16.     {
  17.         //Creamos un DOMDocument
  18.         $doc = new DOMDocument('1.0');
  19.         //Cargamos el XML pasado por parámetro
  20.         $doc->loadXML($request);
  21.         //Creamos una instancia de WSSESoap con el documento, sin "mustUnderstand" ni "actor"
  22.         $objWSSE = new WSSESoap($doc,false,false);
  23.        
  24.         //Creamos una instacian de XMLSecurityKey con el RSA SHA1 y de tipo privado
  25.         $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1,array ('type'=>'private'));
  26.         //Pasamos el valor de passphrase
  27.         $objKey->passphrase=$this->passphrase;
  28.         //Cargamos la clave privada con la ruta del fichero, que es fichero y que no es certificado
  29.         $objKey->loadKey($this->key_file, TRUE, FALSE);
  30.        
  31.         //Firmamos el mensaje
  32.         $objWSSE->signSoapDoc($objKey);
  33.         //Añadimos el BinarySecurityToken, pasamos el contenido del certificado, le decimos que es formato PEM
  34.         $token = $objWSSE->addBinaryToken(file_get_contents($this->cert_file), TRUE);
  35.         //Añadimos el KeyInfo
  36.         $objWSSE->attachTokentoSig($token);
  37.        
  38.         //Guardamos el XML enviado
  39.         $this->soap_sent=$objWSSE->saveXML();
  40.         //Llamamos al método __doRequest padre
  41.         return parent::__doRequest($this->soap_sent, $location, $saction, $version);
  42.     }
  43. }
  44. ?>

Creación del cliente SOAP

Código PHP:
Ver original
  1. //Opciones de conexion
  2. $options = array(
  3.     //'location'=>$location,
  4.     'connection_timeout'=>60,
  5.     'exceptions'=>true,
  6.     'user_agent'=>'WSSESoap',
  7.     'trace'=>true);
  8. //Creamos el cliente WSSoapClient
  9. $sClient = new WSSoapClient($this->wsdl, $options);
  10. //Cargamos la clave, passphrase y certificado
  11. $sClient->key_file=$pk_file;
  12. $sClient->cert_file=$cert_file;
  13. $sClient->passphrase=$pk_passphrase;

Consumir WS

Código PHP:
Ver original
  1. $sClient->Comando(new SoapParam(array("CAMPO"=>"1"),"ENTRADA"));

Última edición por cluster28; 16/02/2011 a las 10:45