Forbidden 403.7 - Nfe

Olá pessoal!!!

Tenho um cliente da Bahia com um certificado A1 da AC Caixa.

No envio da nota o seguinte erro é apresentado:

Failed to access the WSDL at: https://hnfe.sefaz.ba.gov.br/webservices/nfe/NfeRecepcao.asmx?WSDL. It failed with:
Server returned HTTP response code: 403 for URL: https://hnfe.sefaz.ba.gov.br/webservices/nfe/NfeRecepcao.asmx?WSDL.
STACKTRACE:
com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser - Linha -1
com.sun.xml.internal.ws.wsdl.parser.RuntimeWSDLParser - Linha -1
com.sun.xml.internal.ws.client.WSServiceDelegate - Linha -1
com.sun.xml.internal.ws.client.WSServiceDelegate - Linha -1
com.sun.xml.internal.ws.client.WSServiceDelegate - Linha -1
com.sun.xml.internal.ws.spi.ProviderImpl - Linha -1
javax.xml.ws.Service - Linha -1
notaeletronica.webservice.homologacao.sp.recepcao.NfeRecepcao - Linha 46
notaeletronica.servicos.EnviarNFe - Linha 154
faturamento.enviodenotafiscaleletronica.ThreadEnvioDeNotaEletronica - Linha 175
java.lang.Thread - Linha -1

Alguém sabe o que pode ser?

Detalhe que os certificados da Caixa não são considerados confiáveis. Será que o erro acontece por isso?

Já conferi várias vezes a cadeia de certificados e consigo enviar quando utilizo o emissor gratuito de nfe. Por isso acredito que não está faltando nenhum certificado.

Estou usando o jdk 1.6.0_22.

Alguém pode me ajudar? :frowning:

Obrigada

Isso é erro do java de acesso a conecções SSL. Esse erro acontece quando o java tenta acessar webservices em .NET, adiciona nas tuas configurações de segurança esse metodo:

System.setProperty(“sun.security.ssl.allowUnsafeRenegotiation”, “true”);

Obrigada pela resposta!!!

Mas inclui e o erro continua. :frowning:

Mais alguma sugestão?

Obrigada

Vc poderia postar o código de conecção com a WebService.

A quem interessar, consegui resolver o problema e postei na thread:

http://www.guj.com.br/java/238251

Também pode ser visto em:
http://a4t.in/xwiki/bin/view/Blog/ForbiddenNFe

Espero ter ajudado

mas esse Protocol é configurado por thread?

Na minha conexão eu uso este trecho:

            System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol");
            Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
            System.setProperty("javax.net.ssl.keyStoreType", "pkcs12");
            System.setProperty("javax.net.ssl.keyStore", caminhoCertificado);
            System.setProperty("javax.net.ssl.keyStorePassword", senhaCertificado);
            System.setProperty("javax.net.ssl.trustStore", caminhoArquivoJKS);

como esta o seu codigo?

[]'s

esta estratégia com System.setProperty não é tão boa porque configura a JVM inteira. Eu fiz um teste e a partir de uma Thread, esta mecânica também é propagada. Apesar disso, o JAX-WS não permite uma pré-configuração até você obter o port.

    QName qName=new QName("http://ws.teste/", "HelloService");
    URL url=new URL("file:///tmp/hello.xml");
    HelloService service=new HelloService(url,qName);
    Hello hello=service.getHelloPort();
    
    BindingProvider provider=(BindingProvider)hello;

    
    provider.getRequestContext().put(
      "com.sun.xml.internal.ws.transport.https.client.SSLSocketFactory",
      new SSLFactory()
    );

Aqui, o arquivo WSDL é lido localmente. Ele é obtido anteriormente, pode ser pelo navegador. Assim, dá tempo de configurar uma conexão SSL antes de chamar o primeiro método do stub.

o SSLFactory fica assim: É claro que precisa criar uma estratégia para passar os dados do keystore, mas serve só de exemplo:

package teste.ws;

import java.io.FileInputStream;
import java.io.IOException;
import java.net.InetAddress;
import java.net.Socket;
import java.net.UnknownHostException;
import java.security.KeyStore;

import javax.net.ssl.SSLContext;
import javax.net.ssl.SSLSocketFactory;
import javax.net.ssl.TrustManager;
import javax.net.ssl.TrustManagerFactory;

public class SSLFactory extends SSLSocketFactory{
    
  private SSLSocketFactory create(){
    try{
      KeyStore keyStore;
      TrustManagerFactory trustFactory;
      TrustManager[]tm;
      FileInputStream stream;
      SSLContext context;
      
      keyStore=KeyStore.getInstance("JKS");
      stream=new FileInputStream("/home/ricardo/tomcat-client.jks");
      keyStore.load(stream,"123456".toCharArray());
      stream.close();
      trustFactory=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());
      trustFactory.init(keyStore);
      tm=trustFactory.getTrustManagers();
      context=SSLContext.getInstance("SSLv3");
      context.init(null,tm,null);
      
      return context.getSocketFactory();
    }
    catch(Exception e){
      throw new RuntimeException(e);
    }
  
  
  }

  public Socket createSocket(Socket s,String host,int port,boolean autoClose) throws IOException{
    return create().createSocket(s,host,port,false);
  }

  public String[] getDefaultCipherSuites(){return null;}
  public String[] getSupportedCipherSuites(){return null;}
  public Socket createSocket(String arg0,int arg1) throws IOException,UnknownHostException{return null;}
  public Socket createSocket(InetAddress arg0,int arg1) throws IOException{return null;}
  public Socket createSocket(String arg0,int arg1,InetAddress arg2,int arg3) throws IOException,UnknownHostException{return null;}
  public Socket createSocket(InetAddress arg0,int arg1,InetAddress arg2,int arg3) throws IOException{return null;}
}


Eu tentei remover o System.setProperty do meu codigo e implementar o SSLSocketFactory como seu exemplo mas não consegui fazer funcionar.
Outro exemplo que tentei foi implementar o ProtocolSocketFactory mas também não funcionou.
Estou utilizando a classe SOAPConnection para comunicação e esta não me dá muita opção para configuração.
:frowning:

este erro também acontece por bloqueio de firewall.