Menu

Problema da Transmissão

Help
2011-02-15
2013-05-28
  • Renato Atilio

    Renato Atilio - 2011-02-15

    Olá Maurício,

    Testando o jNFe recebi o seguinte erro ao transmitir para o SEFAZ de Minas Gerais:

    org.springframework.ws.client.WebServiceIOException: I/O error: Received fatal alert: handshake_failure; nested exception is javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
    Caused by: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

    Li em outro tópico que precisa ter o certificado em dois armazéns diferentes, mas não fiz isso, e não vi no blog também como fazê-lo.

    Basicamente o que fiz foi colocar o certificado digital no .keystore e configurar corretamente, para a assinatura, que está funcionando corretamente, e então importei os certificados do SEFAZ para o arquivo cacerts.

    Preciso fazer algo mais além disso? Preciso importar o certificado que uso para assinatura no cacerts também, para transmissão? Como proceder neste caso?

    Muito obrigado,
    Renato Atilio.

     
  • Maurício Fernandes de Castro

    Olá Renato.

    Algumas prováveis causas: (1) as últimas atualizações do código estão no repositório devel: jnfe.git.sourceforge.net/gitroot/jnfe/devel ; (2) os certificados do servidor da SEFAZ devem estar todos no armazém cacerts, como você mencionou, e agradeço se você os enviar para mim para adicionarmos ao projeto; (3) a maneira mais fácil de usar o seu certificado é informar sua localização para o bean "securityHandler", que pela configuração default é uma instância de br.com.jnfe.base.service.Pkcs12SecurityHandlerBean (veja o arquivo jnfe-base-context.xml a partir da linha 112) ; (3a) se você utiliza um arquivo jnfe.properties para facilitar a instalação, as linhas abaixo devem ser úteis:

    securityHandler.location=file://#{ systemProperties }/meu.pfx
    securityHandler.password=1234
    securityHandler.alias=aliasQueProtegeSuaPrimaryKey

    Por favor, verifique estas condições e me informe se deu certo.

    Maurício

     
  • Renato Atilio

    Renato Atilio - 2011-02-17

    Maurício,

    1 - Sim, eu havia obtido a última versão do devel mesmo.

    2 - Adicionei os certificados no cacerts, mas algumas secretarias fornecem o .cer e outras o .p7b. Vou tentar reinstalar o certificado. Mas o p7b é convertido pra .cer de que forma?

    3 - Sobre a configuração do certificado digital do emitente, eu acredito que isto esteja certo já, visto que o sistema conseguiu utilizar a chave privada para assinar corretamente o documento.

    Ainda não tenho muita idéia do que pode estar acontecendo. Vou tentar reinstalar os certificados e talvez usar de outro SEFAZ para ver se muda alto.

    Obrigado,
    Renato Atilio.

     
  • Renato Atilio

    Renato Atilio - 2011-02-17

    Maurício,

    Adicionando um pouco mais de informação, considero que a assinatura ocorreu corretamente por conta disso:

    DOMNFeSignatureBuilder - Elemento <infNFe> assinado e inserido em <NFe>.

    E em seguida loga a nova requisição assinada.

    A configuração do certificado é uma só, certo? Então posso pressupor que se a assinatura foi correta, o sistema tem acesso ao certificado para fazer a transmissão, correto?

    Vou fazer o teste reimportando os certificados do SEFAZ. Basta importar o certificado para o cacerts mesmo, não é necessário configurar nada?

    Obrigado,
    Renato.

     
  • Renato Atilio

    Renato Atilio - 2011-02-17

    Testei mais duas situações.

    Uma delas foi uma emissão em Produção no SEFAZ de São Paulo. Fica uma eternidade sem responder e quando responder é com o seguinte:

    Impossível adaptar retorno: 
    org.springframework.ws.client.WebServiceIOException: I/O error: Unexpected end of file from server; nested exception is java.net.SocketException: Unexpected end of file from server
        at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:502)
        at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:451)
        at org.springframework.ws.client.core.WebServiceTemplate.sendSourceAndReceive(WebServiceTemplate.java:438)
        at org.springframework.ws.client.core.WebServiceTemplate.sendSourceAndReceive(WebServiceTemplate.java:423)
    

    A segunda foi uma emissão em Homologação no SEFAZ de São Paulo. Eu acredito que o problema possa ter sido ocasionado pelo fato do Certificado de Homologação de SP estar expirado, segundo o meu visualizador de chaves. O problema nesta segunda situação foi o seguinte:

    2011-02-17 18:10:19,574 [main] DEBUG org.springframework.ws.client.core.WebServiceTemplate - Received error for request [SaajSoapMessage {http://www.portalfiscal.inf.br/nfe/wsdl/NfeRecepcao}nfeRecepcaoLote]
    Impossível adaptar retorno: 
    org.springframework.ws.client.WebServiceTransportException: Forbidden [403]
        at org.springframework.ws.client.core.WebServiceTemplate.handleError(WebServiceTemplate.java:622)
        at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:546)
        at org.springframework.ws.client.core.WebServiceTemplate.sendAndReceive(WebServiceTemplate.java:496)
        at org.springframework.ws.client.core.WebServiceTemplate.doSendAndReceive(WebServiceTemplate.java:451)
        at org.springframework.ws.client.core.WebServiceTemplate.sendSourceAndReceive(WebServiceTemplate.java:438)
        at org.springframework.ws.client.core.WebServiceTemplate.sendSourceAndReceive(WebServiceTemplate.java:423)
    

    Outra dúvida que tenho: este Certificado Digital que estou testando já está em produção por outro sistema. Estando em produção, é possível ainda usar o ambiente de homologação ou somente os emitentes que ainda não entraram em produção e que explicitamente pediram acesso ao ambiente de homologação é que serão aceitos neste ambiente?

    Muito obrigado,
    Renato Atilio.

     
  • Maurício Fernandes de Castro

    Renato,

    adaptei uma classe para funcionar como um teste manual das conexões. Será necessário rodá-lo manualmente, por exemplo, de dentro do eclipse ou com mvn test -Dtest=CacertsTester. Note que eu ainda não pude fazê-lo rodar corretamente, mas já o pus no repositório devel por que talvez você tenha sucesso. Meu teste de status do serviço roda bem, mas este do cacerts diz que a cadeia de certificação está inválida (possivelmente um erro de adaptação de minha parte).

    Assim que tiver novas informações eu aviso.

    At.

    Mauício

     
  • Maurício Fernandes de Castro

    Renato,

    atualizei o repositório devel com uma versão do CacertsTester que deve apontar para as dificuldades na conexão TLS.

    Por favor, me informe se tiver sucesso.

    At.

    Maurício

     
  • Renato Atilio

    Renato Atilio - 2011-03-01

    Olá Maurício,

    Em primeiro lugar, obrigado pela ajuda.

    Fiz alguns testes com o CacertsTester usando o pfx do meu cliente.

    O warning que deu no log foi "Não pode obter cadeia de certificação do servidor.", logo após a conexão ser estabelecida.

    Logo antes no log é informado que o gerenciador de chaves foi aberto.

    Teoricamente, então, o problema está na correta instalação dos certificados do SEFAZ, é isso?

    Eu uso Mac, não sei se tem alguma diferença no gerenciamento do cacerts. Vou tentar fazer mais alguns testes reinstalando os certificados possíveis.

    Como você converte o p7b para cer nos casos que não tem o cer direto do SEFAZ?

    Obrigado,
    Renato.

     
  • Maurício Fernandes de Castro

    Estou pensando em um instalador automático para os certificados dos servidores das receitas estaduais. Quais são os estados com os quais você está tendo problemas?

    Renato, também uso Mac, e não tenho problemas com os certificados. Eles são lidos a partir da instalação Java, algo como $JAVA_HOME/lib/security/cacerts.

    SDS

    Maurício Castro

     
  • Renato Atilio

    Renato Atilio - 2011-03-01

    Hum, acho uma boa, mas você já tem algo disso.

    Onde eu preciso instalar os .cer do SEFAZ? Apenas no cacerts, ou em outro lugar também?

    Basicamente instalei os .cer do SEFAZ no cacerts e o .pfx do emitente no .keystore.

    Para obter o .cer do .p7b eu abri no Keychain Tool e exportei o .cer.

    Algo mais a fazer?

    Ainda continua dando aquela mensagem.

    Obrigado pela ajuda.
    Renato.

     
  • Maurício Fernandes de Castro

    Renato,

    os arquivos .cer devem ficar apenas no cacerts, mas o conteúdo do pfx não precisa mais ser passado para o .keystore. Agora existeo bean Pkcs12SecurityHandlerBean, que pode ser configura de suas formas diferentes: (1) diretamente através da configuração spring, substituindo o "securityHandlerBean, ou (2) através do arquivo jnfe.properties. Minha sugestão é usar o método 2 acima. Para isto crie um arquivo chamado jnfe.properties em uma pasta chamada config imediatamente abaixo seu $USER_HOME. Faça com que o conteúdo do arquivo inclua as linhas abaixo:

    securityHandler.location=file://#{ systemProperties['user.home'] }/meu.pfx
    securityHandler.password=minha-senha
    securityHandler.alias=meu-alias
    

    Observe que meu-alias precisa ser o mesmo que você pode ler com o comando keytool -list  no seu pfx. As suas demais providências parecem estar corretas, inclusive com o Keychain Tool.

    Mas ainda assim , penso em criar a tal automação para instalar os certificados. Quando tudo funcionar, envie para mim os certificados dos servidores (SEFAZ) que você usou, para que eu possa  trabalhar nesta ideia.

    Obrigado,

    Maurício Castro

     
  • Renato Atilio

    Renato Atilio - 2011-03-02

    O alias do certificado do SEFAZ colocado no cacerts faz alguma diferença?

    O mais estranho foi sequer ter conseguido obter a cadeia de certificados do servidor, como dito na mensagem.

    Eu não entendi muito bem como este tester funciona. De onde teoricamente deveria vir o chain? de tm.getAcceptedIssuers() ?

    Quem o define, no fim das contas, e com o valor proveniente de onde?

    Obrigado,
    Renato.

     
  • Renato Atilio

    Renato Atilio - 2011-03-02

    Ah, quando eu forcei chain = tm.getAcceptedIssuers() retornou o seguinte:

    INFO CacertsTester - Iniciando SSL handshake...
    INFO CacertsTester - Conexão estabelecida com sucesso.
    

    Era este o esperado?

    Renato.

     
  • Maurício Fernandes de Castro

    Renato,

    o alias dos certificados dos servidores da receita no cacerts não são importantes, mas o alias do seu certificado (usado nos casos em que a receita requer autenticação mútua) é importante.

    Se você observar o CacertsTester, a cadeia de certificados enviada pelo servidor remoto é capturada por que temos como inner class um decorator para TrustManager ™ com esta finalidade. Se você fizer um debug, pode acompanhar este processo antes do decorador em checkServerTrusted devolver o controle ao membro tm (decorated) para o processamento normal.

    Para o CacertsTester, durante a adaptação de vários trechos de código , muitos deles obtidos no GUJ (peço desculpas por não ter rastreado os créditos), não pude verificar todas as etapas do protocolo TLS, mesmo porque meu teste (teste do teste na verdade) limitou-se apenas ao meu caso, onde já tenho os certificados instalados. Com a sua contribuição, podemos incorporar alguma coisa no método getAcceptedIssuers. Seus problemas permanecem com a SEFAZ de MG e SP?

    At.

    Maurício

     
  • Renato Atilio

    Renato Atilio - 2011-03-03

    Sim, meus problemas permanecem, mas após colocar aquela situação do getAcceptedissuers() o CacertsTester deu "Conexão estabelecida com sucesso".

    Este era o retorno esperado? Poderia ser que por algum motivo na transmissão propriamente dita o sistema não está obtendo o chain também?

    Renato.

     
  • Maurício Fernandes de Castro

    Por favor, envie os certificados (*.cer) que você está usando para mim. Mencione no email os endereços das receitas que você está usando. Farei um teste aqui.

    Maurício

     
  • Renato Atilio

    Renato Atilio - 2011-03-10

    Olá Maurício,

    Vou ver se pego novamente os .cer e envio para você.

    No entanto, eu queria entender melhor algumas coisas, até mesmo para poder integrar com o certificado A3 que se fez necessário pra minha realidade recentemente.

    Se você tiver um tempinho para conversarmos  em "tempo real" qual a melhor forma para você? MSN, Skype, telefone, etc? Se não tiver disponibilidade, sem problema também, compreendo perfeitamente.

    Renato.

     
  • Maurício Fernandes de Castro

    Olá Renato.

    Podemos falar pelo Skype, meu nome é iservport. Mas estou pegando "uns dias" a partir de amanhã, seria melhor se pudéssemos conversar a partir do dia 15. Você me liga?

    Maurício.

     
  • Renato Atilio

    Renato Atilio - 2011-03-15

    Maurício,

    Você está adicionado aqui no Skype, mas está offline. Quando puder conversar, me dá um toque. Skype: renato.braxti

    Queria tirar algumas dúvidas sobre o certificado digital, estes problemas que aconteceram e algumas coisas para eu entender melhor como funciona a assinatura e transmissão obtendo os certificados, dentro e fora do contexto jNFe.

    Abraço,
    Renato.

     
  • Maurício Fernandes de Castro

    Renato,

    bom saber que você consegui uma assinatura com certificado tipo A3 (pkcs11). Quanto à questão do SoapHeader, coloquei hoje uma correção no repositório. Note que voltei a usar o repositório jnfe/jnfe, agora com um branch para o desenvolvimento do SNAPSHOT. O twitter jnfedev tem outros detalhes.

    Abraço,

    Maurício

     

Log in to post a comment.