Conectar WebService Nota Carioca - código de erro: 403 Forbidden [RESOLVIDO pelo próprio autor]

16 respostas
R

Amigos,

Estou inciando um projeto para conexão e consumo do webservice da NotaCarioca[url]https://homologacao.notacarioca.rio.gov.br/WSNacional/nfse.asmx?wsdl[/url], entretanto só tenho recebido o código 403 Forbidden, pelo browser isto não ocorre, consigo conectar e visualizar o wsdl e os xml.

Já added os certificados públicos e privados na minha Keystore (cacerts.jks), porém, continuo tento o erro :
log4j:WARN No appenders could be found for logger (org.apache.axis.i18n.ProjectResourceBundle).
log4j:WARN Please initialize the log4j system properly.
AxisFault
 faultCode: {http://xml.apache.org/axis/}HTTP
 faultSubcode: 
 faultString: (403)Forbidden
 faultActor: 
 faultNode: 
 faultDetail: 
	{}:return code:  403
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
<head>
<meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
<title>403 - Forbidden: Access is denied.</title>
<style type="text/css">
<!--
body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}
-->
</style>
</head>
<body>
<div id="header"><h1>Server Error</h1></div>
<div id="content">
 <div class="content-container"><fieldset>
  <h2>403 - Forbidden: Access is denied.</h2>
  <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>
 </fieldset></div>
</div>
</body>
</html>

	{http://xml.apache.org/axis/}HttpErrorCode:403

(403)Forbidden
	at org.apache.axis.transport.http.HTTPSender.readFromSocket(HTTPSender.java:744)
	at org.apache.axis.transport.http.HTTPSender.invoke(HTTPSender.java:144)
	at org.apache.axis.strategies.InvocationStrategy.visit(InvocationStrategy.java:32)
	at org.apache.axis.SimpleChain.doVisiting(SimpleChain.java:118)
	at org.apache.axis.SimpleChain.invoke(SimpleChain.java:83)
	at org.apache.axis.client.AxisClient.invoke(AxisClient.java:165)
	at org.apache.axis.client.Call.invokeEngine(Call.java:2784)
	at org.apache.axis.client.Call.invoke(Call.java:2767)
	at org.apache.axis.client.Call.invoke(Call.java:2443)
	at org.apache.axis.client.Call.invoke(Call.java:2366)
	at org.apache.axis.client.Call.invoke(Call.java:1812)
	at br.gov.rio.notacarioca.NfseSoapStub.recepcionarLoteRps(NfseSoapStub.java:450)
	at wsCliente.servico.nfe.NfeServiceImpl.main(NfeServiceImpl.java:25)

No java , como via prompt de comando tbm:

C:\Arquivos de programas\Java\jdk1.6.0_25\lib>java -classpath "C:\Arquivos de pr
ogramas\Java\jdk1.6.0_25\lib\tools.jar" -Djavax.net.ssl.trustStore="C:/Arquivos
de programas/Java/jdk1.6.0_25/jre/lib/security/Nfse.jks" -Djavax.net.ssl.trustSt
orePassword=changeit com.sun.tools.internal.ws.WsImport https://homologacao.nota
carioca.rio.gov.br/WSNacional/nfse.asmx?wsdl -p com.test
parsing WSDL...


[ERROR] Server returned HTTP response code: 403 for URL: https://homologacao.not
acarioca.rio.gov.br/WSNacional/nfse.asmx?wsdl

Failed to read the WSDL document: https://homologacao.notacarioca.rio.gov.br/WSN
acional/nfse.asmx?wsdl, because 1) could not find the document; /2) the document
 could not be read; 3) the root element of the document is not <wsdl:definitions
>.


[ERROR] failed.noservice=Could not find wsdl:service in the provided WSDL(s):

 At least one WSDL with at least one service definition needs to be provided.


        Failed to parse the WSDL.

certificados públicos:
Autoridade Certificadora SERPRORFB v3.cer
AC Secretaria da Receita Federal do Brasil v3.cer
Autoridade Certificadora Raiz Brasileira v2.cer

Certificado privado:
certificado_.cer - exportado de um .pfx

Podem me ajudar? Estou há mais de uma semana tentando somente a conexão pelo java e nada!

Classes Java:

Geração do cacerts:

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;

public class NfseBuildCacerts {  
    private static final String JSSECACERTS = "Nfse.jks";  
    private static final int TIMEOUT_WS = 30;  
  
    public static void main(String[] args) {  
        try {  
            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 + "...");  
            InputStream in = new FileInputStream(file);  
            KeyStore ks = KeyStore.getInstance(KeyStore.getDefaultType());  
            ks.load(in, passphrase);  
            in.close();  
           
            /* homologação
             * AM - 2.00: homnfe.sefaz.am.gov.br 
             * BA - 2.00: hnfe.sefaz.ba.gov.br 
             * CE - 2.00: nfeh.sefaz.ce.gov.br 
             * GO - 2.00: homolog.sefaz.go.gov.br 
             * MG - 2.00: hnfe.fazenda.mg.gov.br 
             * MS - 2.00: homologacao.nfe.ms.gov.br 
             * MT - 2.00: homologacao.sefaz.mt.gov.br 
             * PE - 2.00: nfehomolog.sefaz.pe.gov.br 
             * PR - 2.00: homologacao.nfe2.fazenda.pr.gov.br 
             * RS - 2.00: homologacao.nfe.sefaz.rs.gov.br 
             * SP - 2.00: homologacao.nfe.fazenda.sp.gov.br 
             * SCAN - 2.00: hom.nfe.fazenda.gov.br 
             * SVAN - 2.00: hom.sefazvirtual.fazenda.gov.br 
             * SVRS - 2.00: homologacao.nfe.sefazvirtual.rs.gov.br 
             */  
            get("notacarioca.rio.gov.br", 443, ks);  
            /*get("nfe.sefaz.ba.gov.br", 443, ks);  
            get("nfe.sefaz.ce.gov.br", 443, ks);  
           get("homolog.sefaz.go.gov.br", 443, ks);  
            get("nfe.fazenda.mg.gov.br", 443, ks);  
           get("homologacao.nfe.ms.gov.br", 443, ks);  
           get("homologacao.sefaz.mt.gov.br", 443, ks);  
            get("nfe.sefaz.pe.gov.br", 443, ks);  
           get("homologacao.nfe2.fazenda.pr.gov.br", 443, ks);  
            get("nfe.sefaz.rs.gov.br", 443, ks);  
            get("nfe.fazenda.sp.gov.br", 443, ks);  
            get("hom.nfe.fazenda.gov.br", 443, ks);  
            get("hom.sefazvirtual.fazenda.gov.br", 443, ks);  
            get("nfe.sefazvirtual.rs.gov.br", 443, ks);  
  */
            File cafile = new File(JSSECACERTS);  
            OutputStream out = new FileOutputStream(cafile);  
            ks.store(out, passphrase);  
            out.close();  
        } catch (Exception e) {  
            e.printStackTrace();  
        }  
    }  
  
    public static void get(String host, int port, KeyStore ks) throws Exception {  
        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 
             * Não tratado, pois sempre ocorre essa exceção 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");  
        }  
  
        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 + "'");            
        }  
    }  
  
    private static class SavingTrustManager implements X509TrustManager {  
        private final X509TrustManager tm;  
        private X509Certificate[] chain;  
       
        SavingTrustManager(X509TrustManager tm) {  
            this.tm = tm;  
        }  
       
        public X509Certificate[] getAcceptedIssuers() {  
            throw new UnsupportedOperationException();  
        }  
       
        public void checkClientTrusted(X509Certificate[] chain, String authType)  
            throws CertificateException {  
            throw new UnsupportedOperationException();  
        }  
       
        public void checkServerTrusted(X509Certificate[] chain, String authType)  
            throws CertificateException {  
            this.chain = chain;  
            tm.checkServerTrusted(chain, authType);  
        }  
    }  
      
    private static void info(String log) {  
        System.out.println("INFO: " + log);  
    }  
  
    private static void error(String log) {  
        System.out.println("ERROR: " + log);  
    }  
  
}

Classe de teste:

import org.apache.axis.wsdl.WSDL2Java;

public class GeradorWSDL {  
	
	/*Classe que se comunica com a nfe e gera as classes a partir do wsdl*/
	  
    public static void main(String[] args) {  
    	
        
    	
    	// url de homologação
    	 
        String nfestatusservico = "https://homologacao.notacarioca.rio.gov.br/WSNacional/nfse.asmx?WSDL";  
      /*  String nfeconsulta = "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/nfeconsulta/NfeConsulta.asmx?WSDL";  
        String nferecepcao = "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/nferecepcao/NfeRecepcao.asmx?WSDL";  
        String nferetrecepcao = "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/nferetrecepcao/NfeRetRecepcao.asmx?WSDL";  
        String nfecancelamento = "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/nfecancelamento/NfeCancelamento.asmx?WSDL";  
        String nfeinutilizacao = "https://homologacao.nfe.sefazvirtual.rs.gov.br/ws/nfeinutilizacao/NfeInutilizacao.asmx?WSDL";  
        */

    	/*//produção
    	
    	String nfestatusservico = "https://nfe.sefaz.rs.gov.br/ws/NfeStatusServico/NfeStatusServico2.asmx?WSDL";  
        String nfeconsulta = "https://nfe.sefaz.rs.gov.br/ws/nfeconsulta/NfeConsulta.asmx?WSDL";  
        String nferecepcao = "https://nfe.sefaz.rs.gov.br/ws/Nferecepcao/NFeRecepcao2.asmx?WSDL";  
        String nferetrecepcao = "https://nfe.sefaz.rs.gov.br/ws/nferetrecepcao/NfeRetRecepcao.asmx?WSDL";  
        String nfecancelamento = "https://nfe.sefaz.rs.gov.br/ws/nfecancelamento/NfeCancelamento.asmx?WSDL";  
        String nfeinutilizacao = "https://nfe.sefaz.rs.gov.br/ws/nfeinutilizacao/NfeInutilizacao.asmx?WSDL";  
*/
        GeradorWSDL gerador = new GeradorWSDL();  
        gerador.setProperties(); //tem informações de certificado e caminho.     
        gerador.geraWSDL(nfestatusservico, "nfestatusservico");  
      /*  gerador.geraWSDL(nfeconsulta, "nfeconsulta");  
        gerador.geraWSDL(nferecepcao, "nferecepcao");  
        gerador.geraWSDL(nferetrecepcao, "nferetrecepcao");  
        gerador.geraWSDL(nfecancelamento, "nfecancelamento");  
        gerador.geraWSDL(nfeinutilizacao, "nfeinutilizacao");  */
  
    }  
  
    public void geraWSDL(String wsdl, String pack) {  
          /*o que o wsimport e o wsdl2 do axis2 fariam (rasouza)*/
        WSDL2Java.main(new String[] { wsdl, "-o", "src", "-p",  
                "com.nfse.wsdl." + pack });  
        System.out.println("*** Geração concluída ***");  
    }  
    public void setProperties() {  
    	/*Obtem informações do certificado*/
    	
        System.clearProperty("javax.net.ssl.keyStore");    
        System.clearProperty("javax.net.ssl.keyStorePassword");    
        System.clearProperty("javax.net.ssl.trustStore"); 
        
        
	    System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");  
        System.setProperty("javax.net.ssl.keyStore", "C:/Arquivos de programas/Java/jre6/lib/security/certificado.pfx");//extensão deveria ser .pfx?  
        System.setProperty("javax.net.ssl.keyStorePassword", "231221"); //não foi fornecido senha, é necessário para obter as wsdl sem acesso manual 
  
        System.setProperty("javax.net.ssl.trustStoreType", "JKS");  
        System.setProperty("javax.net.ssl.trustStore", "C:/Arquivos de programas/Java/jre6/lib/security/Nfse.jks");  
       // System.setProperty("javax.net.ssl.trustStorePassword", "changeit");
    	

    } 
 
}

Abraços

16 Respostas

R

Amigos,

Resolvido. Estou percebendo que este assunto não é algo tão “simples”, nenhum alma penada apareceu para ajudar…hahaha.

Abraços

M

faltou só colocar a solução que você tomou para que caso alguém tenha o mesmo erro futuramente e precise, veja a solução…

R

Ae a pessoa manda um MP para mim!rs
Abraço

A

Alguém conseguiu consumir a NFS-e (nota carioca) ?

estou com o seguinte problema, qualquer ajuda é bem vinda:

amigo é o seguinte,

eu utilizei a classe InstallCert para liberar conexão SSL para o endereço ‘homologacao.notacarioca.rio.gov.br’ com o java 7 não funcionou, ele até gera o arquivo cacerts mas da erro, fui verificar o erro e vi que ele cai no método abaixo com a seguinte exception:

ERROR: | javax.net.ssl.SSLException: java.lang.UnsupportedOperationException
INFO: | Server sent 3 certificate(s):
INFO: | Added certificate to keystore ‘cacerts’ using alias ‘homologacao.notacarioca.rio.gov.br-0’
INFO: | Added certificate to keystore ‘cacerts’ using alias ‘homologacao.notacarioca.rio.gov.br-1’
INFO: | Added certificate to keystore ‘cacerts’ using alias ‘homologacao.notacarioca.rio.gov.br-2’

aqui não sei se fica valido esse arquivo ?

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

com o java 6 a geração do arquivo cacerts pela classe InstallCert.java funciona sem esses erros, porém não consigo conectar com o webservice do rio, no momento de fazer o envio da o seguinte erro:

INFO (WebserviceSOAPImpl.java:183) - Liberando conexões SSL
ERROR (LoteEnviaImpl.java:312) - HTTP transport error: java.net.SocketException: java.security.NoSuchAlgorithmException: Error constructing implementation (algorithm: Default, provider: SunJSSE, class: com.sun.net.ssl.internal.ssl.DefaultSSLContextImpl)

testei com as urls da NFE e funciona fine, não sei porque com esta url do RIO não rola, então baixei o SOAPUI aqui para testar e anexei o certificado + o cacerts gerado com a classe mencionada acima no java 6 que não da erro e tenho a seguinte resposta pelo SOAP UI:

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html xmlns="http://www.w3.org/1999/xhtml">
   <head>
      <meta http-equiv="Content-Type" content="text/html; charset=iso-8859-1"/>
      <title>403 - Forbidden: Access is denied.</title>
      <style type="text/css">
         <!--body{margin:0;font-size:.7em;font-family:Verdana, Arial, Helvetica, sans-serif;background:#EEEEEE;}
fieldset{padding:0 15px 10px 15px;} 
h1{font-size:2.4em;margin:0;color:#FFF;}
h2{font-size:1.7em;margin:0;color:#CC0000;} 
h3{font-size:1.2em;margin:10px 0 0 0;color:#000000;} 
#header{width:96%;margin:0 0 0 0;padding:6px 2% 6px 2%;font-family:"trebuchet MS", Verdana, sans-serif;color:#FFF;
background-color:#555555;}
#content{margin:0 0 0 2%;position:relative;}
.content-container{background:#FFF;width:96%;margin-top:8px;padding:10px;position:relative;}-->
      </style>
   </head>
   <body>
      <div id="header">
         <h1>Server Error</h1>
      </div>
      <div id="content">
         <div class="content-container">
            <fieldset>
               <h2>403 - Forbidden: Access is denied.</h2>
               <h3>You do not have permission to view this directory or page using the credentials that you supplied.</h3>
            </fieldset>
         </div>
      </div>
   </body>
</html>
J

raffamz:
Ae a pessoa manda um MP para mim!rs
Abraço

Você pode me ajudar com isso ? Estou com este problema The server sent HTTP status code 403: Forbidden e ta difícil.

Já faço Nota Fiscal normal mas esta de serviço ta travada nisso !

O que é este MP que te mandaram ?

Agradeço muito a ajuda.

A

jcarlos78, eu resolvi esse rolo apenas usando o keytool do java.

J

aix:
jcarlos78, eu resolvi esse rolo apenas usando o keytool do java.

Você tem um exemplo ? Já tentei de tudo :-/

A

se não me engano me guiei por este link,

testa ai manu se não rolar me manda uma mp que te envio meu email e vc testa com o meu cacerts, abraços.

J

aix:
se não me engano me guiei por este link,

testa ai manu se não rolar me manda uma mp que te envio meu email e vc testa com o meu cacerts, abraços.

Cara to apanhando legal … já faço isso pra NFe mas pra NFSe ta complicado … se poder me mandar seu cacerts agradeço muito pra testar …

to usando o pfx isso pode ser o problema ?

R

Amigos, Erro meu de principiante “Ae é só a pessoa mandar MP para mim” isso fere as regras de convivência do próprio fórum. Hoje a noite colocarei o passo a passo que fiz para resolver este erro 403 para os que precisarem, acharem aqui.

Desculpas.

J

Estou com o mesmo problema.

Alguém com o detalhamento da solução?

R

Ainda tem esse passo a passo? Pode postar aqui? :slight_smile:

Abraços

C

Conseguiu algo Rodrigo_Vidal? Estou com esse problema com outras prefeituras.

R

Consegui acesso ao WebService da prefeitura sim, no meu caso é a do Rio (Nota Carioca). Estou com outro problema que é quando gero o war e envio pra produção. Lá tá dando 403, mas quando rodo na minha máquina funciona.

A solução pra conectar foi a seguinte:

1 - Gerar o cacerts com os certificados digitais da prefeitura.
2 - Criei uma função de autenticação pra inserir os dados do certificado do cliente e o cacerts. Ela está em Kotlin, mas é bem parecida com o JAVA acho que não vai ter problemas em converter pra JAVA.

@JvmStatic
        fun autentica() {
            val folderCertificado = ClassPathResource("certificado").file.absolutePath
            val caminhoDoCertificadoDoCliente = "$folderCertificado${System.getProperty("file.separator")}tauto-exportado.pfx"
            val senhaDoCertificadoDoCliente = "1234"
            val caminhoDoKeyStore = "$folderCertificado${System.getProperty("file.separator")}cacerts.jks"
            val senhaDoKeyStore = "changeit"

            System.setProperty("sun.security.ssl.allowUnsafeRenegotiation", "true")

            System.clearProperty("javax.net.ssl.keyStore")
            System.clearProperty("javax.net.ssl.keyStorePassword")
            System.clearProperty("javax.net.ssl.trustStore")
            System.clearProperty("javax.net.ssl.trustStorePassword")

            System.setProperty("java.protocol.handler.pkgs", "com.sun.net.ssl.internal.www.protocol")
            Security.addProvider(com.sun.net.ssl.internal.ssl.Provider())

            System.setProperty("javax.net.ssl.keyStoreType", "PKCS12")
            System.setProperty("javax.net.ssl.keyStore", caminhoDoCertificadoDoCliente)
            System.setProperty("javax.net.ssl.keyStorePassword", senhaDoCertificadoDoCliente)

            System.setProperty("javax.net.ssl.trustStoreType", "JKS")
            System.setProperty("javax.net.ssl.trustStore", caminhoDoKeyStore)
            System.setProperty("javax.net.ssl.trustStorePassword", senhaDoKeyStore)
        }

3 - Só chamar o webservice da prefeitura gerado pelo wsdl. Como falei está funcionando, porém quando gero o war e e faço deploy tá dando erro 403. Estou moscando em alguma coisa.

Existe um projeto openSource pra gerenciar certificados, vou postar o link.

Projeto Java de Gerenciamento de Certificado Digital

R

O certificado digital precisa estar no formato .pfx e com a cadeia de certificação completa. A cadeia completo obtive seguindo esse tutorial.

R

Amigos, tinha perdido a senha e demorei para me reconectar.
Peço minhas sinceras desculpas!
Sei que já resolveram, mas disponibilizo o documento que fiz na época e que foi meu ponto de ajuda:
https://drive.google.com/file/d/0BzBsnp9zbFfOTXZRTWJueEJxZXM/view?usp=drivesdk

Criado 15 de janeiro de 2013
Ultima resposta 7 de fev. de 2019
Respostas 16
Participantes 7