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

Como puedo ver el header enviado en soap?

Estas en el tema de Como puedo ver el header enviado en soap? en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Si hago __getLastRequest() del objeto SoapClient no me muestra la cabecera del mensaje Soap. Hay alguna manera de verla?...
  #1 (permalink)  
Antiguo 29/11/2010, 06:17
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
Como puedo ver el header enviado en soap?

Si hago __getLastRequest() del objeto SoapClient no me muestra la cabecera del mensaje Soap. Hay alguna manera de verla?
  #2 (permalink)  
Antiguo 29/11/2010, 06:52
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

dale un vistaso a http://www.php.net/manual/es/class.soapclient.php

Saludos.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #3 (permalink)  
Antiguo 29/11/2010, 09:26
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: Como puedo ver el header enviado en soap?

Cita:
Iniciado por Snaft_J1 Ver Mensaje
Lo tengo super mirado y no he visto explicación. Si hago un __getLastRequest() me muestra:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="com.logicboxes.foundation.sfnb.order.DomOrder" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  3.  <SOAP-ENV:Body>
  4.   <ns1:getDetailsByDomain>
  5.    <userName xsi:type="xsd:string">username</userName>
  6.    <password xsi:type="xsd:string">password</password>
  7.    <role xsi:type="xsd:string">reseller</role>
  8.    <langpref xsi:type="xsd:string">es</langpref>
  9.    <parentid xsi:type="xsd:int">999999998</parentid>
  10.    <domainName xsi:type="xsd:string">directo.com</domainName>
  11.    <option xsi:type="ns2:Vector"><item xsi:type="xsd:string">All</item></option>
  12.   </ns1:getDetailsByDomain>
  13.  </SOAP-ENV:Body>
  14. </SOAP-ENV:Envelope>

Y se supone que le he añadido una cabecera con la clase que me comentas en el post http://www.forosdelweb.com/f68/soap-...igital-862645/ pero no la veo.

Es para ver si la cabecera se crea bien. A lo mejor es que no lo hago bien...
  #4 (permalink)  
Antiguo 29/11/2010, 10:42
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

hola, SoapClient::__getLastRequestHeaders — Devuelve los encabezados SOAP de la última petición.
a lo que me refiero es que trataras con:
Código PHP:
Ver original
  1. <?php
  2. $client = SoapClient("some.wsdl", array('trace' => 1));
  3. $result = $client->SomeFunction();
  4. echo "REQUEST HEADERS:\n" . $client->__getLastRequestHeaders() . "\n";
  5. ?>

es el ejemplo que quise miraras
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #5 (permalink)  
Antiguo 29/11/2010, 10:44
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: Como puedo ver el header enviado en soap?

Cita:
Iniciado por Snaft_J1 Ver Mensaje
hola, a lo que me refiero es que trataras con:
Código PHP:
Ver original
  1. <?php
  2. $client = SoapClient("some.wsdl", array('trace' => 1));
  3. $result = $client->SomeFunction();
  4. echo "REQUEST HEADERS:\n" . $client->__getLastRequestHeaders() . "\n";
  5. ?>

es el ejemplo que quise miraras
Ya, pero esto te muestra las cabeceras del transporte, no del mensaje SOAP.
  #6 (permalink)  
Antiguo 29/11/2010, 11:12
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

ummmm, ok.

pero te recuerdo que en la clase mySoap se sobre escribe el metodo __doRequest desde el cual podrias obtener las headers, ahora si lo que quieres es explorarlo mediante php se podria hacer algo adicional como lo que sigue:

nota: me tome un ratito y he modificado la clase publicada en el post que mensionas para anexarte una forma en la que se podria extraer el header.
Código PHP:
Ver original
  1. <?php
  2.  
  3. class mySoap extends SoapClient {
  4.    //miembro interno para contener el header obtenido
  5.    private $responseHeaders = array();
  6.    
  7.    function __doRequest($request, $location, $saction, $version) {
  8.     $doc = new DOMDocument('1.0');
  9.     $doc->loadXML($request);
  10.  
  11.     $objWSSE = new WSSESoap($doc);
  12.  
  13.     $objWSSE->addUserToken("YOUR_USERNAME_HERE", "YOUR_PASSWORD_HERE", TRUE);
  14.  
  15.     //lo que hacemos es modificar el llamado a __doRequest.
  16.     //return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
  17.    
  18.     $response = parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
  19.     //Analizamos la respuesta para extraer el encabezado
  20.     $dom = new DOMDocument;
  21.     $dom->loadXML( $response, LIBXML_NOWARNING );
  22.     $path = new DOMXPath( $dom );
  23.     $path->registerNamespace( 'soap', 'http://schemas.xmlsoap.org/soap/envelope/');
  24.     $xml = $path->query('//soap:Header/*');
  25.     $this->responseHeaders=$this->headers2array($xml);
  26.  
  27.     return $response;
  28.    }
  29.    
  30.    //Anexamos un nuevo metodo para realizar una pequeña conversion
  31.    private function headers2array($response){
  32.         $headers=array();
  33.         foreach ($response as $node) {
  34.             if($node->hasChildNodes()){
  35.                 $headers[$node->nodeName]=$this->headers2array($node->childNodes);
  36.             }else{
  37.                 $headers[$node->nodeName]=$node->nodeValue;
  38.             }
  39.         }
  40.         return $headers;
  41.    }
  42.    //Solicitamos se nos entregue el headers extraido
  43.    public function getResponseHeaders(){
  44.         return $this->responseHeaders;
  45.    }  
  46. }

como puedes observar he adaptado un poco el metodo __doRequest para que intercepte y analice la respuesta obtenida y nos permita extraer las headers, posteriormente retorna la respuesta obtenida inicialmente.

como usarlo? desde el objeto cliente basta con que llame al metodo nuevo llamado getResponseHeaders().
Código PHP:
Ver original
  1. echo "=======Las Headers=======<br/>";
  2. print_r($sClient->getResponseHeaders());


si alguien sabe alguna otra forma de obtener las headers sin montar todo esto, seria bueno que nos lo hiciera saber, gracias.

Saludos.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #7 (permalink)  
Antiguo 30/11/2010, 06:18
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: Como puedo ver el header enviado en soap?

Vale, he pillado bien la idea, pero lo que quiero es ver las cabeceras de los que envío. No de lo que recibo. Usando el método Save, se guarda el xml en el diso y puedes verlo.

No hay documentación obre la clase esta, verdad? Porque quiero firmar el documento y no entero de nada....
  #8 (permalink)  
Antiguo 30/11/2010, 06:36
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

jejeje, compa crei haberte puesto la url, en todo caso si que vamos aprendiendo mas sobre este elemento, aqui esta la url http://www.sis.utoronto.ca/web_servi...e_samples.html

chekatela y me cuentas yo igual tengo una duda y es, haz logrado hacer funcionar?
que sucede? que no funciona? de ese modo nos sincrnonizamos mas.

saludos
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #9 (permalink)  
Antiguo 30/11/2010, 07:46
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

hola, mira a continuación te posteo nuevamente el script inicial modificado para que puedas pasar un certificado y logres enviar una petición firmada, si gustas lo hacemos paso a paso, por ahora te pongo el script, espero cuentes con los certificados digitales y claves privadas para ello.

Código PHP:
Ver original
  1. <?php
  2. require('soap-wsse.php');
  3.  
  4. define('PRIVATE_KEY', './private.key');
  5. define('CERT_FILE', './cert.crt');
  6.  
  7. class mySoap extends SoapClient {
  8.  
  9.    function __doRequest($request, $location, $saction, $version) {
  10.     $doc = new DOMDocument('1.0');
  11.     $doc->loadXML($request);
  12.  
  13.     $objWSSE = new WSSESoap($doc);
  14.  
  15.     /* Marca de tiempo que expira luego de cinco minutos */
  16.     $objWSSE->addTimestamp(300);
  17.     /* Crear el objeto de seguridad, establece y carga la clave */
  18.     $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array ('type'=>'private'));
  19.     $objKey->passphrase = 'YOUR_PASSWORD_HERE';
  20.     $objKey->loadKey(PRIVATE_KEY, TRUE);
  21.     /* Firmamos el mensaje */
  22.     $objWSSE->signSoapDoc($objKey);
  23.     /* Agregamos el certificado */
  24.     $token = $objWSSE->addBinaryToken(file_get_contents(CERT_FILE));
  25.     $objWSSE->attachTokentoSig($token);
  26.     // je je je Sacamos las headers :)
  27.     // echo $objWSSE->saveXML();
  28.  
  29.     return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
  30.    }
  31. }
  32.  
  33. // opciones de conexion
  34. $options = array(
  35.   'soap_version' => SOAP_1_1,
  36.   'local_cert' => CERT_FILE,
  37.   'connection_timeout' => 20,
  38.   'cache_wsdl' => WSDL_CACHE_NONE,
  39.   'exceptions' => true,
  40.   'user_agent' => 'mySoap',
  41.   'trace' => true,
  42. );  
  43.  
  44. $wsdl = 'https://devauth.utcc.utoronto.ca/wsbuild/services/1_0_0/PersonService?wsdl';
  45.  
  46. try {
  47.     $sClient = new mySoap($wsdl, $options);
  48.     ///$wrapper->credentials->personId = new SoapVar("9300002", XSD_STRING);
  49.     //$wrapper = parametros del metodo que estes llamando.
  50.     $result = $sClient->getEmail($wrapper);
  51.     print_r($result->return);
  52. } catch (SoapFault $fault) {
  53.     print("Fault string: " . $fault->faultstring . "\n");
  54.     print("Fault code: " . $fault->detail->WebServiceException->code . "\n");
  55. }
  56.  
  57. echo $sClient->__getLastRequest() . "\n" . $sClient->__getLastResponse();
  58. ?>

hasta alli bien es una primera etapa aun que es de notar que el script puede sufrir una pequeña variante dado el caso de que el metodo de transporte sea HTTP.

creo que vamos progresando jejejeje.

saludos y suerte.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #10 (permalink)  
Antiguo 30/11/2010, 08:43
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: Como puedo ver el header enviado en soap?

Vaya, ya me has roto los esquemas.

Yo pensaba que había dos formas de hacer esto.

1ª - Con la clase esta
2ª - Con las optios que pones en el último ejemplo.

Pongo lo que tengo que hacer y así será más fácil.

Código:
El mecanismo de autenticación que se debe emplear estará basado en la 
firma digital de los mensajes SOAP entrantes. Estos mensajes SOAP deben 
tener una cabecera WS-Security en donde se incluya  la firma digital del 
cuerpo (incluyendo en nodo soap:Body)  y el certificado con el que se ha 
realizado la firma, según el perfil WS-Security Certificate Token Profile 1.0.


Entonces, se supone que esas cabeceras hay que añadirlas y aparte firmarlo verdad?

Me han pasado un certificado .cert (-----BEGIN CERTIFICATE----- ......... -----END CERTIFICATE-----) pero no me han pasado nunguna clave RSA.

Me falta algo? El transporte es HTTPS y está securizado por IP también.

Agradezco mucho tu dedicación. WSSE es nuevo para mí, ya tengo una aplicación funcionando con SOAP pero sin cabecera.

Saludos.
  #11 (permalink)  
Antiguo 30/11/2010, 14:47
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

podrias mostrar tu codigo y si es posible la salida por aqui o por un privado si gustas.


saludos.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #12 (permalink)  
Antiguo 01/12/2010, 05:13
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: Como puedo ver el header enviado en soap?

Si es que en lo primero que me atasco es en la explicación.

Código:
El mecanismo de autenticación que se debe emplear estará basado en la 
firma digital de los mensajes SOAP entrantes. Estos mensajes SOAP deben 
tener una cabecera WS-Security en donde se incluya  la firma digital del 
cuerpo (incluyendo en nodo soap:Body)  y el certificado con el que se ha 
realizado la firma, según el perfil WS-Security Certificate Token Profile 1.0.
No se si he de usar todas las etiquetas de seguridad, parte de ellas, si con el certificado sólo me vale... Una pequeña ecplicación ya que el proveedor del WS no tiene atención técnica.
  #13 (permalink)  
Antiguo 01/12/2010, 07:43
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

hola, a continuación te incluyo una serie de referencia.

http://www.oasis-open.org/committees...rofile-1.0.pdf

http://docs.oasis-open.org/wss/v1.1/...kenProfile.pdf

http://www.owasp.org/index.php/Web_Services

no necesariamente tendrias que incluirlas todas, eso depende de las condiciones preestablecidas en el ws, ahora ya que no contamos con atención tecnica diría que toca a prueba y error, es decir tendrías que realizar varios clientes donde se incluyan cada una de estas cabeceras o todas haber que sucede.

pienso que el ejemplo estandar que hemos realizado aquí debería funcionar pero para ello tienes que validar que tanto tu certificado como la clave son validos y las condiciones de entorno sean las correctas.

luego de ello podríamos intentar generar un cliente adecuado incluyendo el certificado y la clave, probarlo y ver que resultado obtenemos.

dependiendo del resultado obtenido y el mensaje de error enviado por el ws podremos pensar en que acciones tomar.

saludos cluster28 y animo esto tiene solución je je je.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #14 (permalink)  
Antiguo 01/12/2010, 10:22
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: Como puedo ver el header enviado en soap?

La verdad es que no tengo todavía en marcha en entorno de pruebas por lo que ahora mismo estoy especulando con el funcionamiento del WS y así intentar ir a piñón cuando esté listo.

Por no tener, no tengo ni código hecho, sólo pruebas sueltas.

Viendo la documentación que me has pasado En inglés me cuesta más, pero en español no hay casi nada al respecto, he creado un prototipo de mensaje XML que se supone me piden viendo el esquema que he puesto anteriormente.

Sería algo así, pero sin la encriptación. Por lo que el "soap:Body" supongo que debería cambiar.

Código XML:
Ver original
  1. <soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  2.   <soap:Header>
  3.     <wsse:Security xmlns="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" soap:mustUnderstand="1">
  4.       <wsse:BinarySecurityToken EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3" wsu:Id="aXhOJ5">MIICtzCCAi...
  5.       </wsse:BinarySecurityToken>
  6.       <dsig:Signature xmlns:dsig="http://www.w3.org/2000/09/xmldsig#" Id="sb738c7">
  7.         <dsig:SignedInfo Id="obLkHzaCOrAW4kxC9az0bLA22">
  8.             <dsig:Reference URI="#s91397860">
  9.                 <dsig:DigestValue>5R3GSp+OOn17lSdE0knq4GXqgYM=</dsig:DigestValue>
  10.             </dsig:Reference>
  11.         </dsig:SignedInfo>
  12.         <dsig:SignatureValue Id="a9utKU9UZk">LIkagbCr5bkXLs8l...</dsig:SignatureValue>
  13.         <dsig:KeyInfo>
  14.             <wsse:SecurityTokenReference>
  15.                 <wsse:Reference URI="#aXhOJ5" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
  16.             </wsse:SecurityTokenReference>
  17.         </dsig:KeyInfo>
  18.       </dsig:Signature>
  19.     </wsse:Security>
  20.   </soap:Header>
  21.   <soap:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="s91397860">
  22.     <xenc:EncryptedData xmlns:xenc="http://www.w3.org/2001/04/xmlenc#" Id="aDNa2iD" Type="http://www.w3.org/2001/04/xmlenc#Content">
  23.      <xenc:EncryptionMethod Algorithm="http://www.w3.org/2001/04/xmlenc#tripledes-cbc"/>
  24.       <xenc:CipherData>
  25.         <xenc:CipherValue>XFM4J6C...</xenc:CipherValue>
  26.       </xenc:CipherData>
  27.     </xenc:EncryptedData>
  28.   </soap:Body>
  29. </soap:Envelope>

Ahora tengo que investigar el tema de las referencias y los Id´s y cómo encriptar el body.

Saludos.
  #15 (permalink)  
Antiguo 01/12/2010, 16:23
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

ok, me parece bien tu estructura la veo bien, pero en este momento la encripcion del body no debe ser un problema, eso ya lo haremos, realmente no es complicado y bueno tampoco creo que sea especificamente necesario enviar el body encriptado mas que firmado.

no crees que ya seria hora de ir estructurando un pequeño laboratorio que conjugue todo?

jejejeje...
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #16 (permalink)  
Antiguo 02/12/2010, 04:25
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: Como puedo ver el header enviado en soap?

El entorno de desarrollo no depende de mí por lo que tengo que esperar unos días. He estado mirando las clases pero no se como crear la entrada "dsig:Signature". en el XML actual.

He conseguido generar este:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="com.logicboxes.foundation.sfnb.order.DomOrder" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  3. <SOAP-ENV:Header>
  4. <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
  5. <wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" wsu:Id="pfxb2dd9188-6917-a71f-6e4e-2efd3f44d07e" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">
  6. </wsse:BinarySecurityToken>
  7. </wsse:Security>
  8. </SOAP-ENV:Header>
  9. <SOAP-ENV:Body>
  10. ....................
  11. </SOAP-ENV:Body>
  12. </SOAP-ENV:Envelope>

Para generar esta parte:

Código XML:
Ver original
  1. <dsig:KeyInfo>
  2. <wsse:SecurityTokenReference>
  3. <wsse:Reference URI="#aXhOJ5" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
  4. </wsse:SecurityTokenReference>
  5. </dsig:KeyInfo>

Está el método "attachTokentoSig" pero al no tener la etiqueta "xxx:Signature" en el XML me salta un error, y no he visto el método para generarlo.

EDICIÓN:

He conseguido hacer esta cabecera:

Código XML:
Ver original
  1. <SOAP-ENV:Header>
  2.     <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
  3.         <wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" wsu:Id="pfxe39290ee-be0c-44d0-e056-10e5b549c949" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">
  4.         </wsse:BinarySecurityToken>
  5.         <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  6.             <ds:SignedInfo>
  7.                 <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  8.                 <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
  9.                 <ds:Reference URI="#pfx05939a1b-4e49-08eb-8d9e-9cef211f1830">
  10.                     <ds:Transforms>
  11.                         <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  12.                     </ds:Transforms>
  13.                     <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  14.                     <ds:DigestValue>2jmj7l5rSw0yVb/vlWAYkK/YBwk=</ds:DigestValue>
  15.                 </ds:Reference>
  16.             </ds:SignedInfo>
  17.             <ds:SignatureValue>F0EiTzui+kwS9XWoOZzJUZi3a1jnrOyzoxgdLhnoBw/Tg3DK22rwoDyawvtuNwL/PEg5CKIETJk0aQUrHtjuvIi2xLUK6xwcdke2yodoXxTt5ksc9hBE0yekjqsrL/ZsX4C1/h8+ktc+E4a/0ofebB4Qqc7NzBP5pehuwW9rJOM=</ds:SignatureValue>
  18.         </ds:Signature>
  19.     </wsse:Security>
  20. </SOAP-ENV:Header>

Cambiando la KEY funciona. He puesto un típica de "-----BEGIN RSA PRIVATE KEY-----" por el certificado que me han facilitado "-----BEGIN CERTIFICATE-----". Ya comenté que sólo tengo un certificado pero no un clave pública.

Me lío con lo de los certificados y claves públicas.

Código PHP:

Código PHP:
define('CERT_FILE''./prueba.pem'); 
function 
__doRequest($request$location$saction$version
            {
                
$doc = new DOMDocument('1.0');
                
$doc->loadXML($request);
                
$objWSSE = new WSSESoap($doc);
          
        
/* Crear el objeto de seguridad, establece y carga la clave */
                
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array ('type'=>'private'));
                
$objKey->loadKey(CERT_FILETRUE);
    
                
/* Firmamos el mensaje */
    
                
$objWSSE->signSoapDoc($objKey); 
                
$token $objWSSE->addBinaryToken($cert$isPEMFormat=TRUE$isDSig=TRUE);
                
$objWSSE->attachTokentoSig($token); 
                
                return 
parent::__doRequest($objWSSE->saveXML(), $location$saction$version);
            } 

Última edición por cluster28; 02/12/2010 a las 05:15
  #17 (permalink)  
Antiguo 02/12/2010, 09:06
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

Cita:
Está el método "attachTokentoSig" pero al no tener la etiqueta "xxx:Signature" en el XML me salta un error, y no he visto el método para generarlo.
no crees que te salta error por que estas pasando el certificado como PRIVATE_KEY y no poseemos una private_key por tanto deberia ser NULL, bueno al menos eso es lo que veo en el código que haz pegado aquí.

con null me refiero a que puedes pasar el valor NULL al momento de asignar el private_key dado que no lo necesitamos o simplemente podrías quitar esa fracción de código.

respecto a lo demás, se ve que cada vez avanzamos más.

espero esto soluciones nuestras duditas y continuemos viendo avances.

saludos.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #18 (permalink)  
Antiguo 02/12/2010, 09:12
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: Como puedo ver el header enviado en soap?

El tema de la KEY al ser un certificado hay que hacerlo así:

Código PHP:
/* Crear el objeto de seguridad, establece y carga la clave */
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array ('type'=>'public'));
$objKey->loadKey(CERT_FILETRUETRUE);//Este ultimo TRUE indica que es un certificado 
Me salen estos warnings pero me creo el XML

Warning: DOMNode::C14N() [domnode.c14n]: Relative namespace UR is invalid here : (null) in /web/WSF/xmlseclibs2010.php on line 744

Warning: DOMNode::C14N() [domnode.c14n]: Internal error : checking for relative namespaces in /web/WSF/xmlseclibs2010.php on line 744

Warning: DOMNode::C14N() [domnode.c14n]: Internal error : processing docs children list in /web/WSF/xmlseclibs2010.php on line 744

Warning: openssl_sign() [function.openssl-sign]: supplied key param is a public key in /web/WSF/xmlseclibs2010.php on line 452

Warning: openssl_sign() [function.openssl-sign]: supplied key param cannot be coerced into a private key in /web/WSF/xmlseclibs2010.php on line 452

Sigo indagando
  #19 (permalink)  
Antiguo 02/12/2010, 10:24
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

claro lo que digo es que ya lo estas cargando aqui
Código PHP:
Ver original
  1. $token = $objWSSE->addBinaryToken(file_get_contents(CERT_FILE));
asi que pasalo nulo o quitalo y dime si te genera esos errores aun..

o pudo haber sido que me confundi jejeje.

saludos.
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #20 (permalink)  
Antiguo 02/12/2010, 10:33
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: Como puedo ver el header enviado en soap?

Progresos:

Con este código:

Código PHP:
require('soap-wsse.php');
define('CERT_FILE''./certificado.cer'); 

class 
mySoap extends SoapClient 
{
    function 
__doRequest($request$location$saction$version
    {
        
$doc = new DOMDocument('1.0');
        
$doc->loadXML($request);
        
$objWSSE = new WSSESoap($doc);
  
        
/* Crear el objeto de seguridad, establece y carga la clave */
        
$objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array ('type'=>'public'));
        
$objKey->loadKey(CERT_FILETRUETRUE);

        
/* Firmamos el mensaje */

        
$objWSSE->signSoapDoc($objKey); 
        
$token $objWSSE->addBinaryToken($cert$isPEMFormat=TRUE$isDSig=TRUE);
        
$objWSSE->attachTokentoSig($token); 
        return 
parent::__doRequest($objWSSE->saveXML(), $location$saction$version);
    }
}

$wsdl 'DomOrder.wsdl';
      
// opciones de conexion
$options = array(
'location'=>'https://www.dominio.com/anacreon/servlet/APIv3',
'trace' => true,
);  
$sClient = new mySoap($wsdl$options);
$wrapper= new SoapVar("9300002"XSD_STRING);

try {
  
$result $sClient->getDetailsByDomain(new SoapParam("username""userName"),
                                         new 
SoapParam("password""password"),
                                         new 
SoapParam("reseller""role"),
                                         new 
SoapParam("es""langpref"),
                                         new 
SoapParam("999999998","parentid"),
                                         new 
SoapParam("directo.com""domainName"),
                                         new 
SoapParam(array("All"),"option"));
} catch (
SoapFault $fault) {
  echo 
'<pre>';
  
print_r($fault);
  echo 
'</pre>';

Consigo generar este XML:

Código XML:
Ver original
  1. <?xml version="1.0" encoding="UTF-8"?>
  2. <SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:ns1="com.logicboxes.foundation.sfnb.order.DomOrder" xmlns:xsd="http://www.w3.org/2001/XMLSchema" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:ns2="http://xml.apache.org/xml-soap" xmlns:SOAP-ENC="http://schemas.xmlsoap.org/soap/encoding/" SOAP-ENV:encodingStyle="http://schemas.xmlsoap.org/soap/encoding/">
  3.     <SOAP-ENV:Header>
  4.         <wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
  5.             <wsse:BinarySecurityToken xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" EncodingType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-soap-message-security-1.0#Base64Binary" wsu:Id="pfxf1a07b50-4deb-f107-2911-e09bd531634e" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3">
  6.             </wsse:BinarySecurityToken>
  7.             <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
  8.                 <ds:SignedInfo>
  9.                     <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  10.                     <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
  11.                     <ds:Reference URI="#pfxf381aa98-ef47-f225-0d05-29da0a5d1060">
  12.                         <ds:Transforms>
  13.                             <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
  14.                         </ds:Transforms>
  15.                         <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
  16.                         <ds:DigestValue>2jmj7l5rSw0yVb/vlWAYkK/YBwk=</ds:DigestValue>
  17.                     </ds:Reference>
  18.                 </ds:SignedInfo>
  19.                 <ds:SignatureValue></ds:SignatureValue>
  20.                 <ds:KeyInfo>
  21.                     <wsse:SecurityTokenReference>
  22.                         <wsse:Reference URI="#pfxf1a07b50-4deb-f107-2911-e09bd531634e"/>
  23.                     </wsse:SecurityTokenReference>
  24.                 </ds:KeyInfo>
  25.             </ds:Signature>
  26.         </wsse:Security>
  27.     </SOAP-ENV:Header>
  28.     <SOAP-ENV:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="pfxf381aa98-ef47-f225-0d05-29da0a5d1060">
  29.     .................
  30.     </SOAP-ENV:Body>
  31. </SOAP-ENV:Envelope>

Se supone que está todo correcto menos "<ds:SignatureValue></ds:SignatureValue>" que no consigo llenarlo porque me salen los Warnings:

Warning: openssl_sign() [function.openssl-sign]: supplied key param is a public key in /web/WSF/xmlseclibs2010.php on line 452

Warning: openssl_sign() [function.openssl-sign]: supplied key param cannot be coerced into a private key in /web/WSF/xmlseclibs2010.php on line 452

Poniendo que se trata de un certificado y su clave es pública consigo generar el XML pero sin "<ds:SignatureValue></ds:SignatureValue>".

Ya te digo que no puedo probarlo contra el WS, pero no tiene mala pinta.

Sigo trabajando....

Saludos

Última edición por cluster28; 02/12/2010 a las 10:42
  #21 (permalink)  
Antiguo 02/12/2010, 11:09
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

bien, he modificado un poco tu codigo, prueba con:
Código PHP:
Ver original
  1. <?php
  2. require('soap-wsse.php');
  3. define('CERT_FILE', './certificado.cer');
  4.  
  5. class mySoap extends SoapClient
  6. {
  7.     function __doRequest($request, $location, $saction, $version)
  8.     {
  9.         $doc = new DOMDocument('1.0');
  10.         $doc->loadXML($request);
  11.         $objWSSE = new WSSESoap($doc);
  12.  
  13.         /* Crear el objeto de seguridad, establece y carga la clave */
  14.         $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array ('type'=>'public'));
  15.         $objKey->loadKey(CERT_FILE, TRUE, TRUE);
  16.  
  17.         /* Firmamos el mensaje */
  18.  
  19.         $objWSSE->signSoapDoc(null);
  20.  
  21.         /* Agregamos el certificado */
  22.         $token = $objWSSE->addBinaryToken(file_get_contents(CERT_FILE));
  23.         $objWSSE->attachTokentoSig($token);
  24.        
  25.         return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
  26.     }
  27. }
  28.  
  29. $wsdl = 'DomOrder.wsdl';
  30.      
  31. // opciones de conexion
  32. $options = array(
  33. 'location'=>'https://www.dominio.com/anacreon/servlet/APIv3',
  34. 'trace' => true,
  35. );  
  36. $sClient = new mySoap($wsdl, $options);
  37. $wrapper= new SoapVar("9300002", XSD_STRING);
  38.  
  39. try {
  40.   $result = $sClient->getDetailsByDomain(new SoapParam("username", "userName"),
  41.                                          new SoapParam("password", "password"),
  42.                                          new SoapParam("reseller", "role"),
  43.                                          new SoapParam("es", "langpref"),
  44.                                          new SoapParam("999999998","parentid"),
  45.                                          new SoapParam("directo.com", "domainName"),
  46.                                          new SoapParam(array("All"),"option"));
  47. } catch (SoapFault $fault) {
  48.   echo '<pre>';
  49.   print_r($fault);
  50.   echo '</pre>';
  51. }

esperemos que tal se avanza.

saludos
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....
  #22 (permalink)  
Antiguo 02/12/2010, 11:18
Avatar de Snaft_J1  
Fecha de Ingreso: diciembre-2006
Mensajes: 285
Antigüedad: 17 años, 4 meses
Puntos: 8
Respuesta: Como puedo ver el header enviado en soap?

o tambien podríamos probar a intentar firmarlo y generar la clave nosotros de forma automatica
Código PHP:
Ver original
  1. <?php
  2. require('soap-wsse.php');
  3. define('CERT_FILE', './certificado.cer');
  4.  
  5. class mySoap extends SoapClient
  6. {
  7.     function __doRequest($request, $location, $saction, $version)
  8.     {
  9.         $doc = new DOMDocument('1.0');
  10.         $doc->loadXML($request);
  11.         $objWSSE = new WSSESoap($doc);
  12.  
  13.         /* Crear el objeto de seguridad, establece y carga la clave */
  14.         /*
  15.         $objKey = new XMLSecurityKey(XMLSecurityKey::RSA_SHA1, array ('type'=>'public'));
  16.         $objKey->loadKey(CERT_FILE, TRUE, TRUE);
  17.         */
  18.  
  19.         /* Firmamos el mensaje */
  20.  
  21.         $objWSSE->signSoapDoc(null);
  22.  
  23.         /* Agregamos el certificado */
  24.         $token = $objWSSE->addBinaryToken(file_get_contents(CERT_FILE));
  25.         $objWSSE->attachTokentoSig($token);
  26.        
  27.         $objKey = new XMLSecurityKey(XMLSecurityKey::AES256_CBC);
  28.         $objKey->generateSessionKey();
  29.        
  30.         $siteKey = new XMLSecurityKey(XMLSecurityKey::RSA_OAEP_MGF1P, array('type'=>'public'));
  31.         $siteKey->loadKey(CERT_FILE, TRUE, TRUE);
  32.        
  33.         $options = array("KeyInfo" => array("X509SubjectKeyIdentifier" => true));
  34.         $objWSSE->encryptSoapDoc($siteKey, $objKey, $options);
  35.        
  36.         return parent::__doRequest($objWSSE->saveXML(), $location, $saction, $version);
  37.     }
  38. }
  39.  
  40. $wsdl = 'DomOrder.wsdl';
  41.      
  42. // opciones de conexion
  43. $options = array(
  44. 'location'=>'https://www.dominio.com/anacreon/servlet/APIv3',
  45. 'trace' => true,
  46. );  
  47. $sClient = new mySoap($wsdl, $options);
  48. $wrapper= new SoapVar("9300002", XSD_STRING);
  49.  
  50. try {
  51.   $result = $sClient->getDetailsByDomain(new SoapParam("username", "userName"),
  52.                                          new SoapParam("password", "password"),
  53.                                          new SoapParam("reseller", "role"),
  54.                                          new SoapParam("es", "langpref"),
  55.                                          new SoapParam("999999998","parentid"),
  56.                                          new SoapParam("directo.com", "domainName"),
  57.                                          new SoapParam(array("All"),"option"));
  58. } catch (SoapFault $fault) {
  59.   echo '<pre>';
  60.   print_r($fault);
  61.   echo '</pre>';
  62. }
__________________
-= El conocimiento y el saber te hacen un ser libre =-
Ando en busca de conocimiento....

Etiquetas: header, soap, ver
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.
Respuesta




La zona horaria es GMT -6. Ahora son las 23:38.