Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

[SOLUCIONADO] SOAP con certificado digital

Estas en el tema de SOAP con certificado digital en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Necesito consumir un web service con un sertificado digital que hay que enviar en el header del sobre SOAP. Pero por lo que he visto, ...
  #1 (permalink)  
Antiguo 24/11/2010, 03:19
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
SOAP con certificado digital

Necesito consumir un web service con un sertificado digital que hay que enviar en el header del sobre SOAP. Pero por lo que he visto, me da que SoapClient de PHP5 no soporta WS-Security, por lo que tengo que "buscarme la vida".

La documentación del Web Service únicamente habla de la implementación con JAVA.

Se habla de que las solucione spueden ser:

- Modificar el XML "a mano",
- Reescribir el método _doRequest ó
- Utilizar el Web Service Framework de WSO2

Estoy probando el Web Service Framework de WSO2, que aún no he conseguido hacer funcionar con una Web Service sin certificado

Alguien ha tenido este mismo caso?

Qué opción sería la mejor?

Gracias.
  #2 (permalink)  
Antiguo 26/11/2010, 08:01
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: SOAP con certificado digital

hola.

alguna vez me estuve rompiendo el coco con algo así y fueron horas invertidaas pero luego me tope con algo en la universidad de toronto, con lo cual logre acceder a un web service con SSL WS-Security.

descarga la libreria aqui: http://www.sis.utoronto.ca/web_servi...sample-1.1.zip

y ahora una pequeña implementación de uso, espero esto te sea de ayuda.

Client.php
Código PHP:
Ver original
  1. <?php
  2. require('soap-wsse.php');
  3.  
  4. class mySoap extends SoapClient {
  5.  
  6.    function __doRequest($request, $location, $saction, $version) {
  7.     $doc = new DOMDocument('1.0');
  8.     $doc->loadXML($request);
  9.  
  10.     $objWSSE = new WSSESoap($doc);
  11.  
  12.     $objWSSE->addUserToken("YOUR_USERNAME_HERE", "YOUR_PASSWORD_HERE", TRUE);
  13.  
  14.     return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
  15.    }
  16. }
  17.  
  18.  
  19. $wsdl = 'https://devauth.utcc.utoronto.ca/wsbuild/services/1_0_0/PersonService?wsdl';
  20.  
  21. $sClient = new mySoap($wsdl, array('trace'=>1));
  22. $wrapper->credentials->personId = new SoapVar("9300002", XSD_STRING);
  23. try {
  24.     $result = $sClient->getEmail($wrapper);
  25.     print_r($result->return);
  26. } catch (SoapFault $fault) {
  27.     print("Fault string: " . $fault->faultstring . "\n");
  28.     print("Fault code: " . $fault->detail->WebServiceException->code . "\n");
  29. }
  30.  
  31. echo $sClient->__getLastRequest() .
  32.     "\n" .
  33.     $sClient->__getLastResponse();
  34. ?>

para utilizar estas clases necesitarias tener php5 o superior y la extension soap activa.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #3 (permalink)  
Antiguo 26/11/2010, 09:30
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
Respuesta: SOAP con certificado digital

Gracias Snaft_J1, es una de las opciones que digo. La de sobreescribir el método _doRequest.

De momento sigo peleándome con Web Service Framework de WSO2, pero no descrato probar esto.
  #4 (permalink)  
Antiguo 29/11/2010, 03:24
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
Respuesta: SOAP con certificado digital

El Web Service Framework de WSO2 es bastante cutre así que me he puesto a mirar esto. Pero no se de donde sale el $wrapper.

Esto se supone que funciona primero generando una consulta normal y luego añadiendo las cabeceras. Como paso a __doRequest un xml de SOAP a través de un WSDL?

O tengo que generarlo a mano?
  #5 (permalink)  
Antiguo 29/11/2010, 09:15
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: SOAP con certificado digital

Hola
Cita:
Como paso a __doRequest un xml de SOAP a través de un WSDL?
no comprendo, no es un wsdl lo que se esta pasando a mySoap?

por que lo que veo es que el request tiene tiene el url a el wsdl.

por cierto si deberia funcionar, de hecho la url funciona.

lo del $wrapper lo voy a mirar, dado que no tenia entorno de pruebas para ello y te cuento.


saludos.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #6 (permalink)  
Antiguo 16/02/2011, 10:40
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 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
  #7 (permalink)  
Antiguo 08/04/2011, 14:18
 
Fecha de Ingreso: enero-2010
Mensajes: 39
Antigüedad: 14 años, 3 meses
Puntos: 1
Respuesta: SOAP con certificado digital

Cluster, a que parte del WSDL corresponde lo que tu nombras como "COMANDO"?
  #8 (permalink)  
Antiguo 08/04/2011, 15:28
Avatar de cluster28  
Fecha de Ingreso: enero-2008
Ubicación: Donostia - San Sebastián
Mensajes: 756
Antigüedad: 16 años, 3 meses
Puntos: 32
Respuesta: SOAP con certificado digital

Cita:
Iniciado por TragedyCL Ver Mensaje
Cluster, a que parte del WSDL corresponde lo que tu nombras como "COMANDO"?
El comando es el lo que pone la etiqueta <operation> hija de <portType>.

http://es.wikipedia.org/wiki/WSDL#Tipos_de_Puerto

Etiquetas: soap, certificados
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Tema Cerrado




La zona horaria es GMT -6. Ahora son las 09:56.