Hola, estoy integrando greenter en mi aplicación (laravel). Estoy teniendo problemas a la hora de firmar mi xml de guía de remisión. El xml resultado de aplicar la firma no está conteniendo el certificado que se usa para la validación del xml, cuando valído el xml resutaldo de aplicar la firma con UblValidator me está dando el siguiente error:
Code: 1871, Line: 2, Column: 0, Message: Element '{http://www.w3.org/2000/09/xmldsig#}X509Data': Missing child element(s). Expected is one of ( {http://www.w3.org/2000/09/xmldsig#}X509IssuerSerial, {http://www.w3.org/2000/09/xmldsig#}X509SKI, {http://www.w3.org/2000/09/xmldsig#}X509SubjectName, {http://www.w3.org/2000/09/xmldsig#}X509Certificate, {http://www.w3.org/2000/09/xmldsig#}X509CRL, ##other{http://www.w3.org/2000/09/xmldsig#}* ).
Esto es parte del xml resultante donde va la firma:
<ext:UBLExtensions>
<ext:UBLExtension>
<ext:ExtensionContent>
<ds:Signature Id="GreenterSign">
<ds:SignedInfo>
<ds:CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/>
<ds:SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/>
<ds:Reference URI="">
<ds:Transforms>
<ds:Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/>
</ds:Transforms>
<ds:DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/>
<ds:DigestValue>yvRhF1Oi+7OWJVmKg9ypMAsGFi0=</ds:DigestValue>
</ds:Reference>
</ds:SignedInfo>
<ds:SignatureValue>C8O1DlGUHvvxGIyKAVO4B8P65W3fIlz/nW+SPBFu69CjOa/2fpy8jzLUZw2fQnM7cqhSkPrRGH1DYIPFbaWCjO4TUE7RQCl2rWX85vBhQBXb/YRXpJCRkVFm5C2LSNzEXShJOftVoqftTpv1elSVfrz1l9i769cAljc4HuGeYy1cA9/39wYRiQb6FvUjJwt\/d4WBaHN3g8bZRyH0NBJ3RzqF+f/kVETG729eN37wFWyBQfI0eOTrAPHxQ1dxD685Fles0699xlqpoe2u4wA7axF2b2NDuQqGl+zE2cOFNTZBHSg5XsrQ8ZYmz0QXG1NtPBZxndWAPQsY32WgeXeiDg==</ds:SignatureValue>
<ds:KeyInfo>
<ds:X509Data/>
</ds:KeyInfo>
</ds:Signature>
</ext:ExtensionContent>
Este es parte de mi código donde hago el proceso:
`// Generar XML
$builderXml = new DespatchBuilder();
$xml = $builderXml->build($despatch);
// Firmar XML
$certificate = file_get_contents(env('RUTA_CERTS').DIRECTORY_SEPARATOR."$empresa->ruc".DIRECTORY_SEPARATOR."certkey.pem");
if ($certificate === false) {
throw new \Exception("No se pudo cargar el certificado", 500);
}
$signer = new SignedXml();
$signer->setCertificate($certificate);
$xmlSigned = $signer->signXml($xml);`