Boa tarde pessoal,
Estou trabalhando em um projeto de Nota Fiscal Eletronica - NFe da prefeitura de sao paulo, porem estou tendo problemas para fazer a assinatura de cancelamento. O retorno que recebo do site da prefeitura é: “Rejeição: a assinatura difere do calculado”, abaixo eu vou colocar o que é solicitado no tutorial da prefeitua e o codigo que fiz e se alguem ja fez esse tipo de trabalho e/ou tem alguma sugestão eu agradeço…
Tecnologias utilizadas : Hibernate, JSF, Axis (webservice). Banco de Dados mysql.
Solicitação da prefeitura para assinar a String com o xml:
31000000 9 ... Com base no trecho da mensagem XML apresentada, montamos a seguinte String de caracteres: "31000000000000000009" 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. ATENÇÃO! Na maioria das linguagens de programação, os passos 3 e 4 são feitos através de uma única função. Verifique a documentação de sua linguagem para evitar assinar um hash de um hash.Meu Codigo:
public static String assinar(String certificado, String senha, String textoParaAssinar) {
String res = "";
try {
MessageDigest md = MessageDigest.getInstance("SHA-1");
md.update(textoParaAssinar.getBytes());
byte[] input = md.digest();
Signature signer = Signature.getInstance("SHA1withRSA");
signer.initSign(getPrivateKey(certificado, senha));
signer.update(input);
res = new BASE64Encoder().encode(signer.sign());
} catch (SignatureException ex) {
ex.printStackTrace();
return null;
} catch (InvalidKeyException ex) {
ex.printStackTrace();
return null;
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
return null;
}
return res;
}
Metodo q devolve a chave privada.
private static PrivateKey getPrivateKey(String certificado, String senha) {
PrivateKey p = null;
try {
File file = new File("build\web\certificados");
String path = file.getAbsolutePath() + "\" + certificado;
//FileInputStream fis = new FileInputStream(NfeUtil.generatePathToSecurity(path));
FileInputStream fis = new FileInputStream(path);
KeyStore ks = KeyStore.getInstance("PKCS12");
ks.load(fis, senha.toCharArray());
Enumeration aliasesEnum = ks.aliases();
String alias = "";
while (aliasesEnum.hasMoreElements()) {
alias = (String) aliasesEnum.nextElement();
if (ks.isKeyEntry(alias)) {
break;
}
}
KeyStore.PrivateKeyEntry keyEntry = (KeyStore.PrivateKeyEntry) ks.getEntry(alias,
new KeyStore.PasswordProtection(senha.toCharArray()));
p = keyEntry.getPrivateKey();
} catch (UnrecoverableEntryException ex) {
ex.printStackTrace();
return null;
} catch (CertificateException ex) {
ex.printStackTrace();
return null;
} catch (KeyStoreException ex) {
ex.printStackTrace();
return null;
} catch (NoSuchAlgorithmException ex) {
ex.printStackTrace();
return null;
} catch (IOException ex) {
ex.printStackTrace();
return null;
}
return p;
}
Obrigado desde ja
Elton C.