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<?xml version="1.0" encoding="UTF-8"?>
<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/">
<SOAP-ENV:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
<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">
</wsse:BinarySecurityToken>
</wsse:Security>
</SOAP-ENV:Header>
<SOAP-ENV:Body>
....................
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
Para generar esta parte:
Código XML:
Ver original<dsig:KeyInfo>
<wsse:SecurityTokenReference>
<wsse:Reference URI="#aXhOJ5" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
</wsse:SecurityTokenReference>
</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<SOAP-ENV:Header>
<wsse:Security xmlns:wsse="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-secext-1.0.xsd" SOAP-ENV:mustUnderstand="1">
<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">
</wsse:BinarySecurityToken>
<ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="#pfx05939a1b-4e49-08eb-8d9e-9cef211f1830">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>2jmj7l5rSw0yVb/vlWAYkK/YBwk=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>F0EiTzui+kwS9XWoOZzJUZi3a1jnrOyzoxgdLhnoBw/Tg3DK22rwoDyawvtuNwL/PEg5CKIETJk0aQUrHtjuvIi2xLUK6xwcdke2yodoXxTt5ksc9hBE0yekjqsrL/ZsX4C1/h8+ktc+E4a/0ofebB4Qqc7NzBP5pehuwW9rJOM=</ds:SignatureValue>
</ds:Signature>
</wsse:Security>
</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_FILE, TRUE);
/* 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);
}