Uma dúvida,
Estou tentando assinar a NFe no ambiente de homologação de SP e está retornando Assinatura do Certificado inválida.
Segue os dados do código:
Geração do arquivo .jks (O primeiro .cer foi o arquivo gerado a partir do .pfx)
[code]@echo off
SET KS_JAVA_PATH=D:\JAVA\SDK\jdk1.6.0_12\bin
SET KS_FILENAME=D:/Certificados/nfeelucid.jks
SET KS_CERTPATH=D:/Certificados
SET KS_PASS=minha_senha
%KS_JAVA_PATH%\keytool -genkey -keyalg RSA -alias nfe -keystore %KS_FILENAME% -keypass %KS_PASS% -storepass %KS_PASS% -dname “cn=Elucid Solutions SA, ou=Elucid Solutions SA, o=Elucid Solutions SA, l=Sao Paulo, S=SP, c=BR”
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c01 -file %KS_CERTPATH%/nfeelucid.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c02 -file %KS_CERTPATH%/AC_Certisign_Multipla_G3.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c03 -file %KS_CERTPATH%/AC_Certisign_G3.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c04 -file %KS_CERTPATH%/Autoridade_Certificadora_Raiz_Brasileira_v1.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c05 -file %KS_CERTPATH%/homologacao_nfe_fazenda_sp_gov_br.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c06 -file %KS_CERTPATH%/AC_Imprensa_Oficial_SP_RFB_G2.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
%KS_JAVA_PATH%\keytool -import -noprompt -trustcacerts -alias c07 -file %KS_CERTPATH%/AC_Secretaria_da_Receita_Federal_do_Brasil.cer -keypass %KS_PASS% -keystore %KS_FILENAME% -storepass %KS_PASS%
[/code]
Este é o método que assina o documento:
public void assinarDocumento(String chNFe) throws Exception{
File arqNotSigned = new File("D:\\NFe\\" + chNFe + "-nfe.xml");
File arqSigned = new File("D:\\NFe\\" + chNFe + "-nfe-sign.xml");
File arqJks = new File("D:\\Certificados\\nfeelucid.jks");
String alias = "nfe";
char[] senha = "minha_senha".toCharArray();
DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware(true);
Document doc = dbf.newDocumentBuilder().parse(new FileInputStream(arqNotSigned));
doc.setXmlStandalone(false);
XMLSignatureFactory sig = XMLSignatureFactory.getInstance("DOM", new XMLDSigRI());
ArrayList<Transform> transformList = new ArrayList<Transform>();
Transform enveloped = sig.newTransform(Transform.ENVELOPED, (TransformParameterSpec) null);
Transform c14n = sig.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315",
(TransformParameterSpec) null);
transformList.add(enveloped);
transformList.add(c14n);
NodeList elements = doc.getElementsByTagName("infNFe");
org.w3c.dom.Element el = (org.w3c.dom.Element) elements.item(0);
String id = el.getAttribute("Id");
Reference r = sig.newReference("#".concat(id),
sig.newDigestMethod(DigestMethod.SHA1, null),
transformList,
null,
null);
CanonicalizationMethod cm = sig.newCanonicalizationMethod(CanonicalizationMethod.INCLUSIVE,
(C14NMethodParameterSpec) null);
SignatureMethod sm = sig.newSignatureMethod(SignatureMethod.RSA_SHA1, null);
SignedInfo si = sig.newSignedInfo(cm, sm, Collections.singletonList(r));
InputStream certificado = new FileInputStream(arqJks);
KeyStore ks = KeyStore.getInstance("JKS");
ks.load(certificado, senha);
X509Certificate cert = (X509Certificate) ks.getCertificate(alias);
cert.checkValidity();
KeyInfoFactory kif = sig.getKeyInfoFactory();
List x509Content = new ArrayList();
x509Content.add(cert);
X509Data xd = kif.newX509Data(x509Content);
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
Key chavePrivada = (Key) ks.getKey(alias, senha);
PrivateKey pk = (PrivateKey) chavePrivada;
DOMSignContext dsc = new DOMSignContext(pk, doc.getDocumentElement());
XMLSignature signature = sig.newXMLSignature(si, ki);
signature.sign(dsc);
OutputStream os = new FileOutputStream(arqSigned);
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
trans.transform(new DOMSource(doc), new StreamResult(os));
os.flush();
os.close();
}
Este é o XML original:
<?xml version="1.0" encoding="UTF-8"?><NFe xmlns="http://www.portalfiscal.inf.br/nfe"><infNFe Id="NFe35101156131030000191550010000000041000003881" versao="2.00"><ide><cUF>35</cUF><cNF>00000388</cNF><natOp>VENDA DE PRODUCAO PROPRIA</natOp><indPag>1</indPag><mod>55</mod><serie>1</serie><nNF>4</nNF><dEmi>2010-11-12</dEmi><dSaiEnt>2010-11-12</dSaiEnt><hSaiEnt>00:00:00</hSaiEnt><tpNF>1</tpNF><cMunFG>3550308</cMunFG><tpImp>1</tpImp><tpEmis>1</tpEmis><cDV>1</cDV><tpAmb>2</tpAmb><finNFe>1</finNFe><procEmi>3</procEmi><verProc>2.0.4</verProc></ide><emit><CNPJ>56131030000191</CNPJ><xNome>ELUCID SOLUTIONS S.A.</xNome><xFant>ELUCID</xFant><enderEmit><xLgr>AVENIDA PAULISTA 12</xLgr><nro>36</nro><xCpl>4o ANDAR CONJUNTO 42/PARTE</xCpl><xBairro>CERQUEIRA CESAR</xBairro><cMun>3550308</cMun><xMun>Sao Paulo</xMun><UF>SP</UF><CEP>01311936</CEP><cPais>1058</cPais><xPais>BRASIL</xPais></enderEmit><IE>116121382113</IE><IEST>546014764113</IEST><CRT>3</CRT></emit><dest><CNPJ>48131296000106</CNPJ><xNome>CONSUMIDOR 180</xNome><enderDest><xLgr>RUA ITAPOLIS</xLgr><nro>85</nro><xCpl>10o ANDAR</xCpl><xBairro>VILA IBAR</xBairro><cMun>3539806</cMun><xMun>Poa</xMun><UF>SP</UF><CEP>08559450</CEP><cPais>1058</cPais><xPais>BRASIL</xPais></enderDest><IE>546014764113</IE><email>sac@agente124.com.br</email></dest><det nItem="1"><prod><cProd>ENERLEVE</cProd><cEAN>00023222</cEAN><xProd>ENERGIA ELETRICA</xProd><NCM>11111111</NCM><CFOP>5251</CFOP><uCom>MWh</uCom><qCom>121.0000</qCom><vUnCom>100.0000000000</vUnCom><vProd>12100.00</vProd><cEANTrib>00023222</cEANTrib><uTrib>MWh</uTrib><qTrib>121.0000</qTrib><vUnTrib>100.0000000000</vUnTrib><indTot>1</indTot></prod><imposto><ICMS><ICMS10><orig>0</orig><CST>10</CST><modBC>1</modBC><vBC>12100.00</vBC><pICMS>18.00</pICMS><vICMS>2178.00</vICMS><modBCST>1</modBCST><vBCST>12100.00</vBCST><pICMSST>18.00</pICMSST><vICMSST>2178.00</vICMSST></ICMS10></ICMS><PIS><PISAliq><CST>01</CST><vBC>12100.00</vBC><pPIS>2.00</pPIS><vPIS>242.00</vPIS></PISAliq></PIS><PISST><vBC>0.01</vBC><pPIS>0.01</pPIS><vPIS>0.01</vPIS></PISST><COFINS><COFINSAliq><CST>01</CST><vBC>0.01</vBC><pCOFINS>0.01</pCOFINS><vCOFINS>0.01</vCOFINS></COFINSAliq></COFINS></imposto><infAdProd>Servicos de transmissao referente ao uso da Rede Basica, relativo ao mes de Novembro/2010 , conforme Resolucao Homologatoria Anee l 1021/2010</infAdProd></det><total><ICMSTot><vBC>12100.00</vBC><vICMS>2178.00</vICMS><vBCST>12100.00</vBCST><vST>2178.00</vST><vProd>12100.00</vProd><vFrete>0.00</vFrete><vSeg>0.00</vSeg><vDesc>0.00</vDesc><vII>0.00</vII><vIPI>0.00</vIPI><vPIS>242.00</vPIS><vCOFINS>0.01</vCOFINS><vOutro>0.01</vOutro><vNF>14278.01</vNF></ICMSTot></total><transp><modFrete>9</modFrete></transp></infNFe></NFe>
E esta é a tag de Signature criada (eu retirei do XML só para visualização):
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#NFe35101156131030000191550010000000041000003881"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>ZZqu2dVfpG+6XkbsEZLxJ0yOvp0=</DigestValue></Reference></SignedInfo><SignatureValue>ULTk8lfIeCI/1PPlN9yFg0stY+iPrYHQw5mhJBhzWxsbPxgcpsNOHuJW1xma2rVFIHNOxAMtkgqa
V9IHYX0He/Wa3jcNGCRDEW6lj3fNsfhJI3IuoGQwIT31Xun6mu1zPIHQy/Wi4Vvt5mlAgrRbfv0O
U1KP4S2VTvmeuV3wBMY=</SignatureValue><KeyInfo><X509Data><X509Certificate>MIICiTCCAfKgAwIBAgIETOQ+CDANBgkqhkiG9w0BAQUFADCBiDELMAkGA1UEBhMCQlIxCzAJBgNV
BAgTAlNQMRIwEAYDVQQHEwlTYW8gUGF1bG8xHDAaBgNVBAoTE0VsdWNpZCBTb2x1dGlvbnMgU0Ex
HDAaBgNVBAsTE0VsdWNpZCBTb2x1dGlvbnMgU0ExHDAaBgNVBAMTE0VsdWNpZCBTb2x1dGlvbnMg
U0EwHhcNMTAxMTE3MjA0MTQ0WhcNMTEwMjE1MjA0MTQ0WjCBiDELMAkGA1UEBhMCQlIxCzAJBgNV
BAgTAlNQMRIwEAYDVQQHEwlTYW8gUGF1bG8xHDAaBgNVBAoTE0VsdWNpZCBTb2x1dGlvbnMgU0Ex
HDAaBgNVBAsTE0VsdWNpZCBTb2x1dGlvbnMgU0ExHDAaBgNVBAMTE0VsdWNpZCBTb2x1dGlvbnMg
U0EwgZ8wDQYJKoZIhvcNAQEBBQADgY0AMIGJAoGBAJ3m07Gy50CN2Yo+4L4W5SRuMVgsUL54i4/L
D6TM6MX99EhOM7e1Im5WmDtmzxHnDlQaQf8B7bfXQ42bfPfmsp96bwEyrpMISdguaEAp90VboQGP
VGVIw7xrsHUD0ARlP/TNj/k0JUHXgZgxTaeCXLfH7K0ERsZ3eWwyzMymQt3TAgMBAAEwDQYJKoZI
hvcNAQEFBQADgYEALSHPNULL9rxKHwA6Eb0E2hdpWJo80y4jFhcyScYagG3ajTBNw0Itn0hXyNTU
YXvFdioRXwHL5PHDJGEVTeqa2J42tAVauNGjy4qCSbgho39gTd26zGOy0ilnI+lBf/22qnAurhjV
JKGjzr3hbXpyvNcmO+WaPTxacAm9PF/OO3Y=</X509Certificate></X509Data></KeyInfo></Signature>
Estou pegando o arquivo com a Signature e importando pelo Emissor de NFe de SP. Ele valida o arquivo XML sem apresentar nenhum erro e transmite normalmente. O problema é que no retorno volta a mensagem de rejeição, Assinatura Inválida.
O pior de tudo não é isso.
Pegando o mesmo XML da NFe, abrindo ele para edição no Emissor de NFe, validando sem mexer em nada e gerando a assinatura ele é autenticado no site de homologação de SP.
A assinatura que o Emissor de NFe gerou foi essa:
<Signature xmlns="http://www.w3.org/2000/09/xmldsig#"><SignedInfo><CanonicalizationMethod Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/><SignatureMethod Algorithm="http://www.w3.org/2000/09/xmldsig#rsa-sha1"/><Reference URI="#NFe35101156131030000191550010000000041000003881"><Transforms><Transform Algorithm="http://www.w3.org/2000/09/xmldsig#enveloped-signature"/><Transform Algorithm="http://www.w3.org/TR/2001/REC-xml-c14n-20010315"/></Transforms><DigestMethod Algorithm="http://www.w3.org/2000/09/xmldsig#sha1"/><DigestValue>ZZqu2dVfpG+6XkbsEZLxJ0yOvp0=</DigestValue></Reference></SignedInfo><SignatureValue>oIq1WS4O3Q+QEXEDhvLI4Duv/qCnWVcedl2E0HA/3r9GV1jqqY67jaxabq1oIFup6bMFh/PjyX7D
w2QK7xlg2Ygj7j1ISoz9+K2bd5o82kcwhuB8XOtJE7PtGo8qV7RQhrIv52GbjlRNfX9SfsL51z4X
/2Mgy4iB4AspyewDY8o=</SignatureValue><KeyInfo><X509Data><X509Certificate>MIIGxjCCBa6gAwIBAgIQOSO4guhcRs3aT2uaosF/pDANBgkqhkiG9w0BAQUFADB0MQswCQYDVQQG
EwJCUjETMBEGA1UEChMKSUNQLUJyYXNpbDEtMCsGA1UECxMkQ2VydGlzaWduIENlcnRpZmljYWRv
cmEgRGlnaXRhbCBTLkEuMSEwHwYDVQQDExhBQyBDZXJ0aXNpZ24gTXVsdGlwbGEgRzMwHhcNMTAx
MTA1MDAwMDAwWhcNMTExMTA0MjM1OTU5WjCCAQYxCzAJBgNVBAYTAkJSMRMwEQYDVQQKFApJQ1At
QnJhc2lsMRUwEwYDVQQLFAxJRCAtIDEyMzUzMDYxODA2BgNVBAsUL0F1dGVudGljYWRvIHBvciBD
ZXJ0aXNpZ24gQ2VydGlmaWNhZG9yYSBEaWdpdGFsMRswGQYDVQQLFBJBc3NpbmF0dXJhIFRpcG8g
QTExFDASBgNVBAsUCyhFTSBCUkFOQ08pMRQwEgYDVQQLFAsoRU0gQlJBTkNPKTEcMBoGA1UEAxMT
RWx1Y2lkIFNvbHV0aW9ucyBTQTEqMCgGCSqGSIb3DQEJARYbcmFmYWVsLnBvbnRlc0BlbHVjaWQu
Y29tLmJyMIGfMA0GCSqGSIb3DQEBAQUAA4GNADCBiQKBgQC7VcywSexmNuamExxxla1T7LjWmXah
yV7sGZKOIOTk4xYLcIbJK/QlvoLcgIXf4QVqJodR9HNQsVzQjOqWSr6yGVDZp0kuvmfpQefPyzkn
4SyobKo9aTH9nEI80G8o4kcAAK8smhQEowvwnX1CuPaTxf0LLldEkG7CEZU++oZNOwIDAQABo4ID
QjCCAz4wgb0GA1UdEQSBtTCBsqA9BgVgTAEDBKA0BDIyMTAzMTk3NjE4MzU0MTY2ODMwMDAwMDAw
MDAwMDAwMDAwMDAwMjU1NzA5NDhTU1BTUKAgBgVgTAEDAqAXBBVSYWZhZWwgUG9udGVzIFBlcmVp
cmGgGQYFYEwBAwOgEAQONTYxMzEwMzAwMDAxOTGgFwYFYEwBAwegDgQMMDAwMDAwMDAwMDAwgRty
YWZhZWwucG9udGVzQGVsdWNpZC5jb20uYnIwCQYDVR0TBAIwADAfBgNVHSMEGDAWgBSEsEIzNKNC
JaUolz6D63fw6E/CVDAOBgNVHQ8BAf8EBAMCBeAwVQYDVR0gBE4wTDBKBgZgTAECAQswQDA+Bggr
BgEFBQcCARYyaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9k
cGMwggElBgNVHR8EggEcMIIBGDBcoFqgWIZWaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNv
bS5ici9yZXBvc2l0b3Jpby9sY3IvQUNDZXJ0aXNpZ25NdWx0aXBsYUczL0xhdGVzdENSTC5jcmww
W6BZoFeGVWh0dHA6Ly9pY3AtYnJhc2lsLm91dHJhbGNyLmNvbS5ici9yZXBvc2l0b3Jpby9sY3Iv
QUNDZXJ0aXNpZ25NdWx0aXBsYUczL0xhdGVzdENSTC5jcmwwW6BZoFeGVWh0dHA6Ly9yZXBvc2l0
b3Jpby5pY3BicmFzaWwuZ292LmJyL2xjci9DZXJ0aXNpZ24vQUNDZXJ0aXNpZ25NdWx0aXBsYUcz
L0xhdGVzdENSTC5jcmwwHQYDVR0lBBYwFAYIKwYBBQUHAwQGCCsGAQUFBwMCMIGgBggrBgEFBQcB
AQSBkzCBkDAoBggrBgEFBQcwAYYcaHR0cDovL29jc3AuY2VydGlzaWduLmNvbS5icjBkBggrBgEF
BQcwAoZYaHR0cDovL2ljcC1icmFzaWwuY2VydGlzaWduLmNvbS5ici9yZXBvc2l0b3Jpby9jZXJ0
aWZpY2Fkb3MvQUNfQ2VydGlzaWduX011bHRpcGxhX0czLnA3YzANBgkqhkiG9w0BAQUFAAOCAQEA
KknC+yR6VppYIYzLFB1z1S2YHgx/+LvFI6fmBGZd6sJ3YeB1oY6pHBigIIVNp5TNgTgjAiTJ19TD
vAKTyZAA2L9Dkd3JdafowIeLDdJ+aYhw603N9jB+enG8Jz37f9uHbH4GNhnOMefQQhie8wo6vTv7
EBU//mMeMZwUi8FV0oW3ftCDs+NJtrKZDxzqZgd7uJKZ0Bre+SRpBaFEGrvnEIGXFC6ON7c9Skgf
jjd3tv8DhzydxoRoqgQ+jP+BsZ2gbSJFSLJ/Q0XiMp73M3ydyY44sRZbSAuW31KD3fh9C+udZnIB
Q8IM8kXR/PSfYlU7KG9zhaX3dXgyQQsp+K6g5g==</X509Certificate></X509Data></KeyInfo></Signature></NFe>
Ela é bem maior que a gerada pelo meu método.
Alguém sabe me dizer o que estou fazendo de errado?
Atenciosamente,
Fernando Hirata Alexandre