Bom dia pessoal, andei pesquisando achei muito sobre este assunto porém mesmo assim não consegui resolver
Não estou conseguindo preencher a tag assinatura da forma correta, tenho o seguinte retorno do XML da sefaz
1206
Assinatura Digital do RPS incorreta - String verificada (45616744AB00100000000000120180725TNN00000000000010000000000000000002692228809765000196)
Minha string gerada : 45616744AB00100000000000120180725TNN00000000000000100000000000000002692228809765000196
Minha tag assinatura preenchida
C3mqlV8lVuKTdJM8ON1FkHOPWvALmY1Ow1BZvS5+0t/SGeQVM1csMdrE0r1RaeDWxQ7zRJxmjPUhOnJTXbz+edNPHuf6AaK1He+MkzlkUNvUruL2ik/qdHU+oDkWK21+cxJDvwCA0MKNrF3xLuUzty
pYmJ1LkdNQInDwOKeGpxrBviiKpTROfwOFxpNJoTaw5ahI4YaA9BDtaWoD3PnvAtAdr5tca1QON8GMMsybc7QfpW75rrU4G7aJx4Ysy4z0Yiprk9NjQ3TwNQC9Q32tcB9ZDruQuHXgxSnTR/besyelo+53s1uegFLYVxRznUb7RL8cWu+PE3SljwKzwDSBKg==
Segundo os passos da sefaz diz:
1º - Monte a string de caracteres conforme a tabela a apresentada anteriormente
2º - Converta a cadeia de caracteres ASCII para bytes.
3º - Gere o HASH (array de bytes) utilizando SHA1.
4º - Assine o HASH (array de bytes) utilizando RSA-SHA1
Estou usando estes métodos:
Primeiro chamo o método para preparar o string de 86 caracteres exigido para montar o hash
assinarPedidoEnvioRps(rps);
private static void assinarPedidoEnvioRps(NFeRpsBuild rps) {
StringBuilder buffer = new StringBuilder();
buffer.append(rps.getChaveRps().getInscricaoPrestador())// inscricaoMunicipalPrestador
.append(rps.getChaveRps().getSerieRps())// serieRPS
.append("00000000000" + rps.getChaveRps().getNumeroRps())// numeroRPS
.append(rps.getDataEmissao().replace("-", "")) // Data de emissao
.append(rps.getTributacaoRps())// tipoTributacaoRPS
.append(rps.getStatusRps())// statusRPS
.append(rps.isIssRetido() == false ? "N" : "S")// iss
.append("00000000000000" + rps.getValorServicos())// valor total servico
.append("00000000000000" + rps.getValorDeducoes()) // valor total deducoes
.append(rps.getCodigoServico())// codigoServicoPrestado
.append("2") // indicador cnpj
.append(rps.getCpfCnpjTomador().getCnpj()); // cnpj do tomador
rps.comAssinatura(assinar(buffer.toString().getBytes(StandardCharsets.US_ASCII),
"C:/certificado/" + "certificado", "XXXXXXX"));
E dentro do mesmo metodo já chamo o método para assinar
public static String assinar(byte[] textoParaAssinar, String certificadoFullName, String senha) {
Signature signer = null;
String hash = "";
try {
signer = Signature.getInstance("SHA1withRSA");
signer.initSign(getPrivateKey(certificadoFullName, senha));
signer.update(textoParaAssinar);
hash = Base64.getEncoder().encodeToString(signer.sign());
// hash = new Base64Encoder().encode(signer.sign());
} catch (SignatureException | InvalidKeyException | NoSuchAlgorithmException ex) {
return null;
} catch (KeyStoreException | IOException | CertificateException | UnrecoverableEntryException ex) {
// logger.error(ex.getMessage());
}
return hash;
}
Agradeço a ajuda se possível, obrigado