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

Amigos,

Estou inciando um projeto para conexão e consumo do webservice da NotaCariocahttps://homologacao.notacarioca.rio.gov.br/WSNacional/nfse.asmx?wsdl, 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 :

[code]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)
[/code]

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:

[code]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);  
}  

}[/code]

Classe de teste:

[code]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");
	

} 

}
[/code]

Abraços

Amigos,

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

Abraços

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…

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

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> 

[quote=raffamz]Ae a pessoa manda um MP para mim!rs
Abraço[/quote]

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.

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

[quote=aix]jcarlos78, eu resolvi esse rolo apenas usando o keytool do java.
[/quote]

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

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.

[quote=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. [/quote]

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 ?

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.

Estou com o mesmo problema.

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

1 curtida

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

Abraços

1 curtida

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

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

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

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