Saludos!
Estoy realizando una aplicación java para realizar facturas.
Ya está todo realizado, pero al parecer el problema que tengo es al momento de realizar la cadena original y el sellado.
Me marca el SAT el siguiente error
Descripción: La firma digital (sello) del emisor del documento no es válida.
Sugerencia: El documento fue firmado con una clave privada que no corresponde al certificado; o el documento fue alterado en términos de algoritmo de c14n (cadena original u otro).
Mi código es el siguiente:
DocumentBuilderFactory cfdiFactory = DocumentBuilderFactory.newInstance();
DocumentBuilder cfdiBuilder = cfdiFactory.newDocumentBuilder();
Document cfdi = cfdiBuilder.newDocument();
Element comprobante = cfdi.createElement( "cfdi:Comprobante" );
...
...
...
cfdi.appendChild( comprobante );
/*XML Terminado sin TIMBRAR*/
Random rand = new Random();
int n = rand.nextInt(50) + 1;
/*NumeroRandom para crear archivo temporal y poder hacer CadenaOriginal*/
File xslt = new File("cadenaoriginal-3_3xslt/cadenaoriginal_3_3.xslt");
StreamSource sourceXSL = new StreamSource(xslt);
/*XSLT para formar CadenaOriginal*/
DOMSource source = new DOMSource(cfdi);
FileWriter writer = new FileWriter(new File(Funcion.rutaArchivos + "Temp/temp" + n + ".xml"));
StreamResult sourceXML = new StreamResult(writer);
TransformerFactory transformerFactory = TransformerFactory.newInstance();
Transformer transformer = transformerFactory.newTransformer();
transformer.transform(source, sourceXML);
/*CFDI Temporal*/
ByteArrayOutputStream bos=new ByteArrayOutputStream();
StreamResult cadenaOriginal = new StreamResult(bos);
File xmlFile = new File(Funcion.rutaArchivos + "Temp/temp" + n + ".xml");
StreamSource sourceXML2 = new StreamSource(xmlFile);
TransformerFactory tFactory = TransformerFactory.newInstance();
Transformer transformer2 = tFactory.newTransformer(sourceXSL);
transformer2.transform(sourceXML2, cadenaOriginal);
/*Cadena Original*/
Path path = Paths.get(rutaKey);
byte[] keyBytes = Files.readAllBytes(path);
// String keyString = new String(keyBytes, StandardCharsets.UTF_8);
PKCS8Key pkcs8 = new PKCS8Key(keyBytes, p4ss.toCharArray());
KeyFactory privateKeyFactory = KeyFactory.getInstance("RSA");
PKCS8EncodedKeySpec pkcs8Encoded = new PKCS8EncodedKeySpec(pkcs8.getDecryptedBytes());
PrivateKey privateKey = privateKeyFactory.generatePrivate(pkcs8Encoded);
Signature signature = Signature.getInstance("SHA256withRSA");
signature.initSign(privateKey);
byte[] cadenaOriginalArray = bos.toByteArray();
signature.update(cadenaOriginalArray);
String firma = DatatypeConverter.printBase64Binary(cadenaOriginalArray);
System.out.println("------------------ Cadena Original: " + bos.toString());
System.out.println("---------Firma: " + firma);
¿Alguien ve algo extraño?
Gracias!!!