Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

eFact - A bad canonicalization algorithm was specified #152

Closed
nk-alex opened this issue Apr 5, 2024 · 10 comments
Closed

eFact - A bad canonicalization algorithm was specified #152

nk-alex opened this issue Apr 5, 2024 · 10 comments
Assignees

Comments

@nk-alex
Copy link

nk-alex commented Apr 5, 2024

Buenas,

He estado leyendo en #141 y #97 que el envío a eFact también es posible usando Facturae-PHP. Como primera prueba, he intentado con el mismo código que envía correctamente a FACe, pero haciendo uso del CustomClient:

 try 
        {
            $invoice = new FacturaeFile();
            $invoice->loadData($facturaE->getFacturaEContent(), "invoice.xsig");
        } 
        catch (Exception $e) 
        {
            throw new FacturaEParsingError($e->getMessage());
        }
        
        $developmentEndpointUrl = "https://efact-pre.aoc.cat/bustia/services/EFactWebServiceProxyService";
        $productionEndpointUrl = "https://efact.aoc.cat/bustia/services/EFactWebServiceProxyService";
        $face = new CustomFaceClient($developmentEndpointUrl, "sello.pfx", null, "abc123");

        $res = $face->sendInvoice("email@email.com", $invoice);
        if ($res->resultado->codigo == 0) 
        {
            //eFact ha aceptado la factura
            echo "Número de registro => " . $res->factura->numeroRegistro . "\n";
        } 
        else 
        {
            // eFact ha rechazado la factura
        }

Pero a esta petición, recibo la siguiente respuesta:

faultCode: "axis2ns1:InvalidSecurity"
faultstring: "An error was discovered processing the wsse:Security header (A bad canonicalization algorithm was specified)"

Estoy haciando algo mal? Usando el formulario web de eFact, puedo entregar correctamente la factura.

@nk-alex
Copy link
Author

nk-alex commented Apr 9, 2024

Modificando la función request de la clase SoapClient, en concreto la variable $signedInfo de manera que se parezca más al xml del ejemplo proporcionado por ellos :

$signedInfo = '<ds:SignedInfo>' .
       '<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">' .
           '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" PrefixList="soapenv"/>' .
       '</ds:CanonicalizationMethod>' .
       '<ds:SignatureMethod Algorithm="http://www.w3.org/2001/04/xmldsig-more#rsa-sha512"></ds:SignatureMethod>' .
       '<ds:Reference URI="#' . $timestampId . '">' .
           '<ds:Transforms>' .
               '<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">' .
                   '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" PrefixList="wsse soapenv"/>' .
               '</ds:Transform>' .
           '</ds:Transforms>' .
         '<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"></ds:DigestMethod>' .
         '<ds:DigestValue>' . $timestampDigest . '</ds:DigestValue>' .
       '</ds:Reference>' .
       '<ds:Reference URI="#' . $bodyId . '">' .
           '<ds:Transforms>' .
               '<ds:Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315">' .
                   '<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/TR/2001/REC-xml-c14n-20010315" PrefixList=""/>' .
               '</ds:Transform>' .
           '</ds:Transforms>' .
           '<ds:DigestMethod Algorithm="http://www.w3.org/2001/04/xmlenc#sha512"></ds:DigestMethod>' .
           '<ds:DigestValue>' . $bodyDigest . '</ds:DigestValue>' .
       '</ds:Reference>' .
     '</ds:SignedInfo>';

Obtengo The signature or decryption was invalid. Alguna idea de qué podría ser @josemmo?

@josemmo
Copy link
Owner

josemmo commented Apr 9, 2024

Hola @nk-alex,

Sobre el error "An error was discovered processing the wsse:Security header (A bad canonicalization algorithm was specified)", ¿sabes qué algoritmos de canonicalización están permitidos?

Puede que sea porque eFact espera que el cliente use "http://www.w3.org/2001/10/xml-exc-c14n", pero Facturae-PHP usa "http://www.w3.org/TR/2001/REC-xml-c14n-20010315".

@nk-alex
Copy link
Author

nk-alex commented Apr 10, 2024

@josemmo Correcto, ellos en su ejemplo usan "http://www.w3.org/2001/10/xml-exc-c14n" además de <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/> y <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/> en lugar de sus variantes sha512.

He modificado la función request de la clase https://github.com/josemmo/Facturae-PHP/blob/master/src/Face/SoapClient.php para actualizar el XML generado acorde a los cambios de los que hemos hablado. También he modificado el método getDigest de XmlTools para generar el Digest utlizando sha1. También, he tenido que modificar el método getSignature indicándole que use OPENSSL_ALGO_SHA1 para que mi ds:SignatureValue tenga la misma longitud que la del ejemplo.

Su ejemplo de XML de envío de facturas tiene el siguiente aspecto:

<?xml version="1.0"?>
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
  <soapenv:Header>
    <wsse:Security 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" soapenv:mustUnderstand="1">
      <wsu:Timestamp wsu:Id="TS-230FB955ABCAAD2E1F16346514270441">
        <wsu:Created>2021-10-19T13:50:27.036Z</wsu:Created>
        <wsu:Expires>2021-10-19T13:55:27.036Z</wsu:Expires>
      </wsu:Timestamp>
      <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="X509-230FB955ABCAAD2E1F16346514271622">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</wsse:BinarySecurityToken>
      <ds:Signature xmlns:ds="http://www.w3.org/2000/09/xmldsig#" Id="SIG-230FB955ABCAAD2E1F16346514271805">
        <ds:SignedInfo>
          <ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
            <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"/>
          </ds:CanonicalizationMethod>
          <ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
          <ds:Reference URI="#Id-1408448235">
            <ds:Transforms>
              <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/>
              </ds:Transform>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>+2JldjvIhUg4cmQO1lC16BcYx5Q=</ds:DigestValue>
          </ds:Reference>
          <ds:Reference URI="#TS-230FB955ABCAAD2E1F16346514270441">
            <ds:Transforms>
              <ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
                <ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse soapenv"/>
              </ds:Transform>
            </ds:Transforms>
            <ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
            <ds:DigestValue>sSpv8BQxQVK1gObYnyaxwrxO9ro=</ds:DigestValue>
          </ds:Reference>
        </ds:SignedInfo>
        <ds:SignatureValue>CeZqVnUQsXHxfJFHwyy8N8lV5WE8ce2JKl+P4BWI1B2HduELqHl3euqwm+25qQkOzpaZHara7u2k/0Fvuj4d0Tr5Qm09SDZaOKKFOPdr9sE79gaIiT/SdJAqj/8+rNTUq0c4LgrkkUVovX7rMBkwzDQ+Ee2CcEhnMdVGstgH3vSCTaoeiN/QLLgz+m3/KRKGSIPVea5WQ/NNtT5BZx92071gAC9LCkwGUD45aFgVhZtrwi1DTWPCvO4V5CwLIj+ivj+uBpLp0NSArm9G0Vxh/5bfvncqWr2ul0LFXH1EahWPFiOGEGPlvu/P9yA+t+gTQRyNt8ebJ7pebry9+r0P9A==</ds:SignatureValue>
        <ds:KeyInfo Id="KI-230FB955ABCAAD2E1F16346514271653">
          <wsse:SecurityTokenReference wsu:Id="STR-230FB955ABCAAD2E1F16346514271664">
            <wsse:Reference URI="#X509-230FB955ABCAAD2E1F16346514271622" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
          </wsse:SecurityTokenReference>
        </ds:KeyInfo>
      </ds:Signature>
    </wsse:Security>
  </soapenv:Header>
  <soapenv:Body xmlns:wsu="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-wssecurity-utility-1.0.xsd" wsu:Id="Id-1408448235">
    <sspp:enviarFactura xmlns:sspp="https://webservice.efact.es/sspp">
      <request>
        <correo>notifications_ef@seres.es</correo>
        <factura>
          <factura>PD94bWwgdm........XML_FACTURAE_CONTENT_IN_BASE64</factura>
          <nombre>A001.xml</nombre>
          <mime>application/xml</mime>
        </factura>
        <anexos>
          <anexo>
            <anexo>JVBERi0xLjQKJ......ATTACH_FILE_CONTENT_IN_BASE64</anexo>
            <nombre>anexo_0.pdf</nombre>
            <mime>application/pdf</mime>
          </anexo>
          <anexo>
            <anexo>JVBERi0xLjQKJcOJVBERi0xLjQKJ......ATTACH_FILE_CONTENT_IN_BASE64</anexo>
            <nombre>anexo_1.pdf</nombre>
            <mime>application/pdf</mime>
          </anexo>
        </anexos>
      </request>
    </sspp:enviarFactura>
  </soapenv:Body>
</soapenv:Envelope>

En mi caso, he conseguido que tenga el siguiente aspecto:

<?xml version="1.0"?>
<soapenv:Envelope xmlns:ds="http://www.w3.org/2000/09/xmldsig#" xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" xmlns:web="https://webservice.efact.es/sspp" 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">
	<soapenv:Header>
		<wsse:Security soapenv:mustUnderstand="1">
			<wsu:Timestamp wsu:Id="TS-2092123069">
				<wsu:Created>2024-04-10T10:17:24+02:00</wsu:Created>
				<wsu:Expires>2024-04-10T10:18:24+02:00</wsu:Expires>
			</wsu:Timestamp>
			<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="X509-651501596">...</wsse:BinarySecurityToken>
			<ds:Signature Id="SIG-572438237">
				<ds:SignedInfo>
					<ds:CanonicalizationMethod Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
						<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="soapenv"/>
					</ds:CanonicalizationMethod>
					<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
					<ds:Reference URI="#Id-711311050">
						<ds:Transforms>
							<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
								<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList=""/>
							</ds:Transform>
						</ds:Transforms>
						<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
						<ds:DigestValue>xA+3jZkAOA+VKBXQvPEpisZfliM=</ds:DigestValue>
					</ds:Reference>
					<ds:Reference URI="#TS-2092123069">
						<ds:Transforms>
							<ds:Transform Algorithm="http://www.w3.org/2001/10/xml-exc-c14n#">
								<ec:InclusiveNamespaces xmlns:ec="http://www.w3.org/2001/10/xml-exc-c14n#" PrefixList="wsse soapenv"/>
							</ds:Transform>
						</ds:Transforms>
						<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
						<ds:DigestValue>9nylSDRtRUV5EfqFL7Jmwt+PjBg=</ds:DigestValue>
					</ds:Reference>
				</ds:SignedInfo>
				<ds:SignatureValue>...</ds:SignatureValue>
				<ds:KeyInfo Id="KI-332993355">
					<wsse:SecurityTokenReference wsu:Id="STR-405159504">
						<wsse:Reference URI="#X509-651501596" ValueType="http://docs.oasis-open.org/wss/2004/01/oasis-200401-wss-x509-token-profile-1.0#X509v3"/>
					</wsse:SecurityTokenReference>
				</ds:KeyInfo>
			</ds:Signature>
		</wsse:Security>
	</soapenv:Header>
	<soapenv:Body wsu:Id="Id-711311050">
		<web:enviarFactura>
			<request>
				<correo>email@email.com</correo>
				<factura>
					<factura>PD94bWwgdm........XML_FACTURAE_CONTENT_IN_BASE64</factura>
					<nombre>invoice.xsig</nombre>
					<mime>application/xml</mime>
				</factura>
				<anexos></anexos>
			</request>
		</web:enviarFactura>
	</soapenv:Body>
</soapenv:Envelope>

Mi campo BinarySecurityToken y ds:SignatureValue los he ocultado, pero tienen el mismo aspecto que el de su ejemplo.
Aún así, sigo recibiendo The signature or decryption was invalid.

Estoy viendo que nuestros Headers son prácticamente idénticos, no acabo de entender qué puede estar fallando. Tienes alguna idea?

(Apunte: Usando los métodos getDigest y getSignature con sha512, tambíen resulta en un The signature or decryption was invalid. Los he modificado por que he visto que los suyos producían DigestValue y SignatureValue de midas más cortas que las mías)

@josemmo
Copy link
Owner

josemmo commented Apr 11, 2024

Hola @nk-alex,

Tras un rato peleándome con esto, creo que ya se por qué falla.

Resulta que e-FACT solo admite canonicalización exclusiva de XML (http://www.w3.org/2001/10/xml-exc-c14n), pero Facturae-PHP solo implementa canonicalización "inclusiva" (http://www.w3.org/TR/2001/REC-xml-c14n-20010315). Esto se hizo así en su momento porque los servidores de FACe y del resto de la Administración del Estado solo admitían ese tipo de canonicalización, y creo que sigue siendo así todavía.

Por lo que sea, los desarrolladores de e-FACT han decidido hacer lo contrario que el resto de puntos de entrada de facturación y admitir solo EXC-C14N en vez de C14N, así que eso va a ser un problema. Como no podemos convencer a e-FACT para que admita ambas recomendaciones del W3C, creo que lo mejor va a ser implementar ambas en la librería y que el usuario pueda elegir cuál usar.

Marco el issue como "feature", espero poder sacar tiempo cuanto antes para implementarlo, ya que entiendo que es importante.

@josemmo josemmo self-assigned this Apr 11, 2024
@josemmo
Copy link
Owner

josemmo commented Apr 17, 2024

Hola @nk-alex,

Ya tengo implementados los cambios en borrador pero no puedo escribir los test unitarios porque no puedo dar de alta el certificado de prueba en efact-pre.aoc.cat ya que la web de autenticación está caída.

Voy a esperar unos días a ver si con suerte lo arreglan.

@josemmo
Copy link
Owner

josemmo commented Apr 28, 2024

Hola @nk-alex,

He añadido unos cambios a la rama develop que solucionan el fallo:

composer require josemmo/facturae-php:dev-develop

¿Puedes probarlo y ver si ya te funciona? Tienes que crear un CustomFaceClient con estos ajustes:

$developmentEndpointUrl = "https://efact-pre.aoc.cat/bustia/services/EFactWebServiceProxyService";
$productionEndpointUrl = "https://efact.aoc.cat/bustia/services/EFactWebServiceProxyService";
$face = new CustomFaceClient($developmentEndpointUrl, "sello.pfx", null, "abc123");
$face->setWebNamespace('https://webservice.efact.es/sspp'); // <--- Esta línea es nueva

@pablofuentes15
Copy link

pablofuentes15 commented Apr 29, 2024

Hola @josemmo yo tenia el mismo problema y me a funcionando con los cambios que as hecho, con las pruebas que he hecho con la url development.

@nk-alex
Copy link
Author

nk-alex commented May 2, 2024

Gracias @josemmo, durante la semana que viene probaré y te confirmaré también

@nk-alex
Copy link
Author

nk-alex commented May 10, 2024

@josemmo Confirmo también que funciona perfectamente. Muchas gracias.

@josemmo
Copy link
Owner

josemmo commented May 11, 2024

Genial, @nk-alex! Gracias por confirmarlo.

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment
Projects
None yet
Development

No branches or pull requests

3 participants