iai pessual, blz?
estou tendo problemas em assinar um xml com rps para um projeto de nfe. Depois de pesquisar bastante eu fiz uma classe com uns métodos que para mim estava certo…rsrsr…porem após usar essa classe para assintatura eu consigo consumir o web service, até ai funciona legal. Porem ele me retorna que a assinatura difere do calculado, e ai esta o problema, não sei o porque.
segue oq tenho q fazer para assinar:
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.
eu ja fiz a parte de criar a String do passo um. Segue o codigo que possivelmente faria os passos 2,3,4
[code]
//passo 2, mando a String convertda em bytes (textoParaAssinar)
public static String assinar(String certificado, String senha, byte[] textoParaAssinar) {
try {
//passo 3
MessageDigest digest = MessageDigest.getInstance("SHA-1");
digest.reset();
byte[] input = digest.digest(textoParaAssinar);
//passo 4
Signature signer = Signature.getInstance("SHA1withRSA");
signer.initSign(getPrivateKey(certificado, senha));
signer.update(input);
return 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;
}
}
private static PrivateKey getPrivateKey(String certificado, String senha) {
PrivateKey p = null;
try {
//FileInputStream fis = new FileInputStream(NfeUtil.generatePathToSecurity(path));
FileInputStream fis = null;
File file = new File("build\\web\\certificados");
String path = file.getAbsolutePath() + "\\" + certificado;
KeyStore ks = KeyStore.getInstance("PKCS12");
fis = new FileInputStream(path);
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;
}[/code]
minha duvida, essa é a forma certa de gerar um hash em SHA-1??, e mais, esse é o jeito certo de assinar com rsa-sha1???
se alguem puder me ajudar eu agradeço