Login Registre-se
Problemas com cacerts CT-e  XML
Índice dos Fóruns » NF-e / NFS-e / CT-e / CF-e / Certificados Digitais
Autor Mensagem
cristianabreu

JavaC Membro

Membro desde: 28/11/2013 22:08:56
Mensagens: 6
Offline

Bom dia,

Estou com o seguinte problema ao emitir CT-e:
org.apache.axis2.AxisFault: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Andei verificando muito no fórum e em outros sites e percebi que o problema está no cacerts, porém não consegui resolver este problema.
O que é mais engraçado é que o sistema funciona quando quer, as vezes executa normalmente durante alguns dias e as vezes começa a dar este erro.

Para geração do arquivo cacerts, usei o código disponível para NF-e, para poder gerar um cacerts para todos os estados.
Quando gero o cacerts ele retorna alguns erros, conforme a baixo:

INFO: | Loading KeyStore CTeCacerts...
INFO: | Opening connection to cte.sefaz.mt.gov.br:443...
INFO: | Starting SSL handshake...
ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 4 certificate(s):
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.mt.gov.br-0'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.mt.gov.br-1'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.mt.gov.br-2'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.mt.gov.br-3'
INFO: | Opening connection to producao.cte.ms.gov.br:443...
INFO: | Starting SSL handshake...
ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 3 certificate(s):
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'producao.cte.ms.gov.br-0'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'producao.cte.ms.gov.br-1'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'producao.cte.ms.gov.br-2'
INFO: | Opening connection to cte.fazenda.mg.gov.br:443...
INFO: | Starting SSL handshake...
ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 4 certificate(s):
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.mg.gov.br-0'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.mg.gov.br-1'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.mg.gov.br-2'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.mg.gov.br-3'
INFO: | Opening connection to cte.fazenda.pr.gov.br:443...
INFO: | Starting SSL handshake...
ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 4 certificate(s):
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.pr.gov.br-0'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.pr.gov.br-1'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.pr.gov.br-2'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.fazenda.pr.gov.br-3'
INFO: | Opening connection to cte.sefaz.rs.gov.br:443...
INFO: | Starting SSL handshake...
ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 3 certificate(s):
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.rs.gov.br-0'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.rs.gov.br-1'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'cte.sefaz.rs.gov.br-2'
INFO: | Opening connection to nfe.fazenda.sp.gov.br:443...
INFO: | Starting SSL handshake...
ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 3 certificate(s):
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'nfe.fazenda.sp.gov.br-0'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'nfe.fazenda.sp.gov.br-1'
INFO: | Added certificate to keystore 'CTeCacerts' using alias 'nfe.fazenda.sp.gov.br-2'


O problema pode estar na geração do cacerts? Porque o sistema funciona e do nada para de funcionar dando aquele erro?


Desde já agradeço a ajuda de todos..
Abraços..
ibrsistemas

JavaC Membro

Membro desde: 10/01/2013 22:42:13
Mensagens: 92
Offline

Olá, Provavelmente seja algum problema na classe que gera o arquivo, segue o exemplo da que eu utilizo e funciona perfeitamente!

/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package CTe;

/**
*
* @author Iago
*/
import java.io.File;
import java.io.FileInputStream;
import java.io.FileOutputStream;
import java.io.InputStream;
import java.io.OutputStream;
import java.security.KeyStore;
import java.security.MessageDigest;
import java.security.cert.CertificateException;
import java.security.cert.X509Certificate;
import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLException;
import javax.net.ssl.SSLHandshakeException;
import javax.net.ssl.SSLSocket;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;
import javax.net.ssl.X509TrustManager;

/**
*
* @author JavaC - Java Community
*/
public class ArquivoKeyStore {
private static final String JSSECACERTS = "CTeCacerts";
private static final int TIMEOUT_WS = 60;

public static void main(String[] args) {
try {
/**
* Endereço do WebService.
* O Endereço abaixo é do Sefaz Virtual RS, altere para o endereço que
* for necessário.
*/
String enderecoWebService = "homologacao.cte.sefaz.rs.gov.br";

File cacertsFile = gerarCacerts(enderecoWebService, 443);
if (cacertsFile != null) {
info("| Cacerts gerado em: " + cacertsFile.getAbsolutePath());
}
} catch (Exception e) {
error(e.toString());
}
}

public static File gerarCacerts(String host, int port) throws Exception {
char[] passphrase = "changeit".toCharArray();

File file = new File(JSSECACERTS);
if (file.isFile() == false) {
char SEP = File.separatorChar;
File dir = new File(System.getProperty("java.home") + SEP + "lib" + SEP + "security");
file = new File(dir, JSSECACERTS);
if (file.isFile() == false) {
file = new File(dir, "cacerts");
}
}

info("| Loading KeyStore " + file + "...");
KeyStore ks;
try (InputStream in = new FileInputStream(file)) {
ks = KeyStore.getInstance(KeyStore.getDefaultType());
ks.load(in, passphrase);
}

SSLContext context = SSLContext.getInstance("TLS");
TrustManagerFactory tmf = TrustManagerFactory.getInstance(
TrustManagerFactory.getDefaultAlgorithm());
tmf.init(ks);
X509TrustManager defaultTrustManager = (X509TrustManager) tmf.getTrustManagers()[0];
SavingTrustManager tm = new SavingTrustManager(defaultTrustManager);
context.init(null, new TrustManager[] { tm }, null);
SSLSocketFactory factory = context.getSocketFactory();

info("| Opening connection to " + host + ":" + port + "...");
SSLSocket socket = (SSLSocket) factory.createSocket(host, port);
socket.setSoTimeout(TIMEOUT_WS * 1000);
try {
info("| Starting SSL handshake...");
socket.startHandshake();
socket.close();
info("| No errors, certificate is already trusted");
} catch (SSLHandshakeException e) {
/**
* PKIX path building failed:
* sun.security.provider.certpath.SunCertPathBuilderException:
* unable to find valid certification path to requested target
* Nao tratado, pois sempre ocorre essa excecao quando o cacerts
* nao esta gerado.
*/
} catch (SSLException e) {
error("| " + e.toString());
}

X509Certificate[] chain = tm.chain;
if (chain == null) {
info("| Could not obtain server certificate chain");
return null;
}

info("| Server sent " + chain.length + " certificate(s):");
MessageDigest sha1 = MessageDigest.getInstance("SHA1");
MessageDigest md5 = MessageDigest.getInstance("MD5");
for (int i = 0; i < chain.length; i++) {
X509Certificate cert = chain[i];
sha1.update(cert.getEncoded());
md5.update(cert.getEncoded());

String alias = host + "-" + (i);
ks.setCertificateEntry(alias, cert);
info("| Added certificate to keystore '" + JSSECACERTS + "' using alias '" + alias + "'");
}

File cafile = new File(JSSECACERTS);
try (OutputStream out = new FileOutputStream(cafile)) {
ks.store(out, passphrase);
}

return cafile;
}

private static class SavingTrustManager implements X509TrustManager {
private final X509TrustManager tm;
private X509Certificate[] chain;

SavingTrustManager(X509TrustManager tm) {
this.tm = tm;
}

@Override
public X509Certificate[] getAcceptedIssuers() {
throw new UnsupportedOperationException();
}

@Override
public void checkClientTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
throw new UnsupportedOperationException();
}

@Override
public void checkServerTrusted(X509Certificate[] chain, String authType)
throws CertificateException {
this.chain = chain;
tm.checkServerTrusted(chain, authType);
}
}

/**
* Log info.
* @param info
*/
private static void info(String info) {
System.out.println("INFO: " + info);
}

/**
* Log error.
* @param error
*/
private static void error(String error) {
System.out.println("ERROR: " + error);
}

}
rafaelshock

JavaC Membro
[Avatar]

Membro desde: 20/08/2012 14:12:59
Mensagens: 62
Offline

Não está gerando?
cristianabreu

JavaC Membro

Membro desde: 28/11/2013 22:08:56
Mensagens: 6
Offline

Bom dia,

Está gerando sim, mas estava dando aqueles erros ao gerar.
Porém, acabei verificando o conteúdo do Cacerts e o mesmo estava correto..

Após diversos teste comecei a notar algumas coisas engraçadas no código, se eu emitisse um conhecimento e não desse erro nenhum, se eu deleta-se o arquivo cacerts o sistema continuava enviado conhecimentos sem nenhum problema.
Teste realizados tanto em ambiente de desenvolvimento, (Windows + Netbeans + Tomcat) e em ambiente de produção (Linux + Tomcat)..
Mesmo limpa as variáveis:
System.clearProperty("javax.net.ssl.keyStore");
System.clearProperty("javax.net.ssl.keyStorePassword");
System.clearProperty("javax.net.ssl.trustStore");

Continuei realizando teste e procurando alguma solução na internet e acabei encontrando aqui mesmo no fórum um tópico sobre: Resolvendo o Problema 403.7 Forbidden para Certifi...do A3 (ProtocolSocketFactory), importante dizer que este não era o meu problema, meu problema era:

org.apache.axis2.AxisFault: javax.net.ssl.SSLException: Connection has been shutdown: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target

Como não tinha nada a perde acabei implementando o "SocketFactoryDinamico", do link a baixo e acabou que meu erro não ocorreu mais..
http://www.javac.com.br/jc/posts/list/224-resolvendo-o-problema-4037-forbidden-para-certificado-a1-protocolsocketfactory.page

O sistema já está a alguns dias no ar e não ocorreu mais o problema, vou esperar mais um pouco e caso o problema não retorne eu venho aqui informando que está e a solução definitiva para o problema.

Obrigado a todos que responderam.
Abraços..
rafaelshock

JavaC Membro
[Avatar]

Membro desde: 20/08/2012 14:12:59
Mensagens: 62
Offline

mas você chegou a gerar o que tanto?
cristianabreu

JavaC Membro

Membro desde: 28/11/2013 22:08:56
Mensagens: 6
Offline

Não entendi a sua pergunta..
 
Índice dos Fóruns » NF-e / NFS-e / CT-e / CF-e / Certificados Digitais
Ir para:   
Powered by JForum 2.1.9 © JForum Team