fala f-schmitt, blz?
então cara, esse skema de limpar o properties nao deu certo…nao aconteceu nada de diferente…mas tipo, eu nao estou usando o “System.setProperty(“javax.net.ssl.keyStorePassword, senha”)” no meu código, então nao tem nada para limpar, certo? o estranho é q acontece o seguinte:
eu tentei colocar um try-catch direto no meu ks.load(…), aí, se digito a primeira senha errada, ele cai no catch…porém, se digito uma certa (ele nao entra no catch) e em seguida uma errada, o catch nao pega essa senha errada, e tipo, eu gravo a senha logo antes do ks.load e e ela ta com a senha errada, só q o ks.load carrega msm assim…não sei mais o q fazer…acho q ja decorei todos os tópicos do assunto na net de tanto procurar e nao consigo resolver…minha esperança agora é alguem me ajudar… :?
vou postar meu código completo aki…quem puder dar uma olhada e ver se tem alguma coisa q eu possa fazer, fico muito grato…
[code]import java.io.;
import java.security.;
import java.security.cert.;
import java.security.cert.X509Certificate;
import java.util.;
import javax.crypto.*;
import javax.xml.crypto.dsig.XMLSignature;
import javax.xml.crypto.dsig.XMLSignatureFactory;
import javax.xml.crypto.dsig.dom.DOMSignContext;
import javax.xml.crypto.dsig.keyinfo.KeyInfo;
import javax.xml.crypto.dsig.keyinfo.KeyInfoFactory;
import javax.xml.parsers.DocumentBuilder;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.transform.Transformer;
import javax.xml.transform.TransformerFactory;
import javax.xml.transform.dom.DOMSource;
import javax.xml.transform.stream.StreamResult;
import org.w3c.dom.Document;
public class Nfe
{
public Nfe()
{
}
public static String assinarEnviNfe(String xmlNaoAssinado, String uri, int tipo, String certificadoPath, String certificadoSenha, String CaminhoDLL, String NoPaiAssinatura)
throws Exception
{
try {
xmlNaoAssinado = xmlNaoAssinado.replaceAll("\t", "");
xmlNaoAssinado = xmlNaoAssinado.replaceAll("\n", "");
xmlNaoAssinado = xmlNaoAssinado.replaceAll("\r", "");
//define uma nova instancia DOM
DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
//indica que essa nova instancia irá aceitar NameSpaces
factory.setNamespaceAware(true);
//cria uma nova instancia de um DocumentBuilder (obtem um documento XML DOM)
DocumentBuilder builder = factory.newDocumentBuilder();
//parse = Analisar o conteúdo de um determinado arquivo como um documento XML e retornar um novo DOM
//ByteArrayInputStream = Separa uma string em fluxo de bytes
Document doc = builder.parse(new ByteArrayInputStream(xmlNaoAssinado.getBytes()));
//fábrica para criar objetos XMLSignature baseado no DOM
XMLSignatureFactory fac = XMLSignatureFactory.getInstance("DOM");
//cria uma lista de Array
ArrayList transformList = new ArrayList();
// Cria a lista de tranformações a serem aplicadas as referencias a
// serem assinadas (transformaçoes exigidas pela w3c)
javax.xml.crypto.dsig.spec.TransformParameterSpec tps = null;
javax.xml.crypto.dsig.Transform envelopedTransform = fac. newTransform("http://www.w3.org/2000/09/xmldsig#enveloped-signature", tps);
javax.xml.crypto.dsig.Transform c14NTransform = fac.newTransform("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", tps);
transformList.add(envelopedTransform);
transformList.add(c14NTransform);
KeyStore ks = null;
java.security.Provider p = null;
if(tipo == 1) //significa que é certificação tipo A1
{
// cria uma instancia de um keystore de um tipo específico
ks = KeyStore.getInstance("PKCS12");
// carrega um keystore existente
//try {
ks.load(new FileInputStream(certificadoPath), certificadoSenha.toCharArray());
//} catch(Exception e){
// return "Caminho ou Senha Inválido(a)!";
//}
} else //significa que é certificação tipo A3
{
p = new sun.security.pkcs11.SunPKCS11(CaminhoDLL);
Security.addProvider(p);
// cria uma instancia de um keystore de um tipo específico
ks = KeyStore.getInstance("pkcs11");
// carrega um keystore existente
//try {
ks.load(null, certificadoSenha.toCharArray());
//} catch(Exception e){
//return "Caminho ou Senha Inválido(a)!";
//}
}
//variavel segura para armazenar a chave primaria
KeyStore.PrivateKeyEntry pkEntry = null;
//enumera todos os Aliases contidos no keyStore
Enumeration aliasesEnum = ks.aliases();
//agrupa todas as chaves privada em uma unica variavel
PrivateKey privateKey = null;
//loop de todos os Aliases
while(aliasesEnum.hasMoreElements())
{
//salva o Alias na variavel "alias" como String
String alias = (String)aliasesEnum.nextElement();
//verifica se a chave primaria é valida
if(ks.isKeyEntry(alias))
{
//obtem a chave primaria do alias selecionado
pkEntry = (KeyStore.PrivateKeyEntry)ks.getEntry(alias, new java.security.KeyStore.PasswordProtection(certificadoSenha.toCharArray()));
// armazena a chave numa variavel de grupo de chaves
privateKey = pkEntry.getPrivateKey();
break;
}
}
//cria uma instancia do tipo X509Certificate
//X509Certificate - classe que proporciona uma forma padrao de acesso
// a todos os atributos do certificado
X509Certificate cert = (X509Certificate) pkEntry.getCertificate();
//Um KeyInfo contém uma lista de XMLStructures, cada um dos quais
//contêm informações que permite ao destinatário obter
//a chave necessária para validar uma assinatura XML
KeyInfoFactory kif = fac.getKeyInfoFactory();
//cria uma lista (tipo vetor)
List x509Content = new ArrayList();
// adiciona o certificado a lista
x509Content.add(cert);
//cria um elemento contendo identificador de uma lista especifica do certificado
javax.xml.crypto.dsig.keyinfo.X509Data xd = kif.newX509Data(x509Content);
//retorna uma lista imutavel de objetos especificos
KeyInfo ki = kif.newKeyInfo(Collections.singletonList(xd));
//chama metodo "assinarNfe"
assinarNfe(fac, transformList, privateKey, ki, doc, uri, NoPaiAssinatura);
ByteArrayOutputStream os = new ByteArrayOutputStream();
TransformerFactory tf = TransformerFactory.newInstance();
Transformer trans = tf.newTransformer();
Properties prop = trans.getOutputProperties();
prop.put("omit-xml-declaration", "yes");
trans.setOutputProperties(prop);
trans.transform(new DOMSource(doc), new StreamResult(os));
String xmlFinal = os.toString();
xmlFinal = xmlFinal.replaceAll("\t", "");
xmlFinal = xmlFinal.replaceAll("\n", "");
xmlFinal = xmlFinal.replaceAll("\r", "");
System.clearProperty("javax.net.ssl.keyStorePassword");
System.clearProperty("javax.net.ssl.keyStore");
if(tipo == 2)
Security.removeProvider(p.getName());
return xmlFinal;
} catch (UnrecoverableEntryException ex) {
//ex.printStackTrace();
return '0' + ex.getMessage();
} catch (CertificateException ex) {
//ex.printStackTrace();
return '1' + ex.getMessage();
} catch (java.security.KeyStoreException ex) {
//ex.printStackTrace();
return '2' + ex.getMessage();
} catch (Exception ex) {
String mensagemErro = ex.getMessage();
ex.printStackTrace();
if (tipo == 1)
if(mensagemErro.equalsIgnoreCase("stream does not represent a PKCS12 key store"))
return "O arquivo selecionado n\343o \351 um arquivo de certificado v\341lido.";
else if(mensagemErro.indexOf("wrong password or corrupted file") != -1)
return "A senha informada est\341 incorreta ou o arquivo foi corrompido.";
else
return "Erro carregando certificado de arquivo.\nErro:[" + mensagemErro + "]";
else
return "Erro carregando certificado do tipo A3";
}
}
//escreve o XML contendo a assintatura
private static void assinarNfe(XMLSignatureFactory fac, ArrayList transformList, PrivateKey privateKey, KeyInfo ki, Document doc, String uri, String NoPaiAssinatura)
throws Exception
{
//cria um elemento referenciando o atributo Id do arquivo XML
//cria também um elemento digestmethod
javax.xml.crypto.dsig.Reference ref = fac.newReference(uri, fac.newDigestMethod("http://www.w3.org/2000/09/xmldsig#sha1", null), transformList, null, null);
javax.xml.crypto.dsig.spec.C14NMethodParameterSpec nullspec = null;
javax.xml.crypto.dsig.CanonicalizationMethod can = fac.newCanonicalizationMethod("http://www.w3.org/TR/2001/REC-xml-c14n-20010315", nullspec);
javax.xml.crypto.dsig.SignedInfo si = fac.newSignedInfo(can, fac.newSignatureMethod("http://www.w3.org/2000/09/xmldsig#rsa-sha1", null), Collections.singletonList(ref));
XMLSignature signature = fac.newXMLSignature(si, ki);
DOMSignContext dsc = new DOMSignContext(privateKey, doc.getElementsByTagName(NoPaiAssinatura).item(0));
signature.sign(dsc);
}
public static String transmiteNFe(String caminhoDLLouCFG, String certificadoSenha, String pkcs)
throws Exception
{
try
{
KeyStore ks = null;
Provider p;
if (pkcs.equals("pkcs12")) {
System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
p = new com.sun.net.ssl.internal.ssl.Provider();
Security.addProvider(p);
ks = KeyStore.getInstance("pkcs12");
ks.load(new FileInputStream(caminhoDLLouCFG), certificadoSenha.toCharArray());
}
else
{
p = new sun.security.pkcs11.SunPKCS11(caminhoDLLouCFG);
Security.addProvider(p);
ks = KeyStore.getInstance("pkcs11");
ks.load(null,certificadoSenha.toCharArray());
}
System.setProperty("javax.net.ssl.keyStoreType",pkcs);
System.setProperty("javax.net.ssl.keyStorePassword", certificadoSenha);
System.setProperty("javax.net.ssl.trustStoreType","JKS");
System.setProperty("javax.net.ssl.trustStore","C:/TSCerts");
System.setProperty("javax.net.ssl.trustStorePassword", "123456");
return "";
}
catch(Exception e)
{
String mensagemErro = e.getMessage();
e.printStackTrace();
if(mensagemErro.equalsIgnoreCase("stream does not represent a PKCS12 key store"))
return "O arquivo selecionado n\343o \351 um arquivo de certificado v\341lido.";
else if(mensagemErro.indexOf("wrong password or corrupted file") != -1)
return "A senha informada est\341 incorreta ou o arquivo foi corrompido.";
else
return "Erro carregando certificado de arquivo.\nErro:[" + mensagemErro + "]";
}
}
}
[/code]
Se for útil para alguem, ta funcionando (tirando o detalhe da senha)…tem até uns comentário mais ou menos só pra entender alguma coisinha…
bom, espero que alguem possa me ajudar…
Obrigado…