Certificados Digitais - NFe

No meu caso, que uso A3, nao habilita o Exportar a chave particular e nem o padrao PKCS n 12(*.pfx).

Estou tendo problemas de conexao com o ws da Sefaz, 403 Forbidden.
Exportei o certificado para um JKS e configurei o prg como vc comentou, mas nao conecta.
Seria o certificado desapropriado para conexao ssl?

Grato

Alencar
P.S.: Pensei em enviar email direto, mas creio ser mais instrutivo ficar em lugar publico.

Isso é pq vc não precisa colocar o certificado exportado em um JKS e nem precisa exportá-lo. Para usar o A3 vc precisa acessar o dispositivo leitor do smartcard e o tipo é PKCS#11. para tanto vc precisará da DLL do driver da leitora.

Ola, agradeco pela atencao.
Sim, conheco o uso do A3. Tenho instalado o drive correto e ja o uso para assinar os xml.

Meu problema esta na conexao ssl mutua, onde me retorna 403 Forbidden.
Por isso estou testando com o certificado exportado em JKS, o que tambem facilitaria para
o cliente que quisesse só acessar (buscar retorno, etc…). Nestes casos nao precisaria do
token espetado.

Mas enfim. O problema é de conexao ssl… Se tiver alguma dica, agradeco muitissimo.

não, vc não pode fazer isso, a meu ver… No caso da conexão SSl depende muito de qual framework vc está utilizando como stack de ws… qual é?

Por partes: exportar o certificado é possivel sim. O que nao pode exportar de A3 é a PK.

Uso axis (org.apache.axis).
Me codigo de chamada (System.out.println somente para meu teste)

private String chamaWebService() throws Exception {
	String result = null;
	URL endpoint = new URL(this.url);
	String nomeMetodo = extraiNomeMetodo(this.metodo); System.out.println(nomeMetodo);
	String nomeArgumento = extraiNomeArgumento(this.metodo); System.out.println(nomeArgumento);
	StringBuilder cabec = new StringBuilder();
	cabec.append("<?xml version=\"1.0\" encoding=\"UTF-8\"?>");
	cabec.append("<cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"1.02\">" );
	cabec.append("<versaoDados>"+this.layoutDados+"</versaoDados>");
	cabec.append("</cabecMsg>");  System.out.println(cabec.toString());
	
	try {
		org.apache.axis.client.Service servico = new Service();
		org.apache.axis.client.Call chamada = (Call) servico.createCall();
		
		chamada.setTargetEndpointAddress(endpoint); 			
		chamada.setOperationName(new QName(this.ns, nomeMetodo));
		chamada.addParameter("nfeCabecMsg", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
		chamada.addParameter(nomeArgumento, org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
		chamada.setReturnType(org.apache.axis.Constants.XSD_STRING);
		
		result = (String) chamada.invoke( new Object[] {cabec.toString(), this.xml} );
	} catch (Exception e) {
		result = "ERRO:" + e.getMessage();
	}
	
	return result;
}

Oq falei é que não é possível extrair do A3

Sim, amigo. Entendi. E te respondi que é possivel sim extrair de A3 o
certificado.
Só nao consegue extrair a chave privada.

Creio que a chave publica tb seja possivel exportar de A3.

não, a chave privada não é exportável… (VIAJEI quando liseu post…) A pública é exportável sim…

String configName = "/token.cfg"; Provider p = new sun.security.pkcs11.SunPKCS11(configName); Security.addProvider(p); char[] pin = { 's', 'a', 'f', 'e', 'w', 'e', 'b' };

tá faltando algo desse tipo…
[eu pelo menos num vi]

http://www.guj.com.br/posts/list/83758.java

[quote=proteus_adi]String configName = "/token.cfg"; Provider p = new sun.security.pkcs11.SunPKCS11(configName); Security.addProvider(p); char[] pin = { 's', 'a', 'f', 'e', 'w', 'e', 'b' };

tá faltando algo desse tipo…
[eu pelo menos num vi]

http://www.guj.com.br/posts/list/83758.java[/quote]

Pessoal, beleza. Pesquisando num forum da Sun (http://forums.sun.com/thread.jspa?threadID=5265597)
consegui resolver o problema de conexao.
La explica direitnho como proceder para uso de A3 (PKCS11).

Bem, vamos adiante: a resposta agora nao é mais 403 Forbidden (ufa).
Eia a nova: ERRO:Server did not recognize the value of HTTP Header SOAPAction: .

Pelo codigo que postei, alguem saberia (ou ja passou por isso)?

tenta imprimir o conteúdo do HTTP Request… Dá pra ajudar melhor

Respondendo a mim mesmo, para que fique registrado:
O SOAPAction deve ser setado para cada servico. O Consulta status do servico é este:

soapAction: http://www.portalfiscal.inf.br/nfe/wsdl/NfeStatusServico/nfeStatusServicoNF

Muitissimo grato a todos que ajudaram ate aqui.
Estou a disposicao para ajudar outros dentro dos meus conhecimentos (Java).

Alencar

Continuando a peleia.

Apos conseguir acesso, estou na tentativa de usar o servico status do servico.

XML cabec:
“<?xml version="1.0" encoding="UTF-8"?>243STATUS”

XML dados:
“<?xml version="1.0" encoding="UTF-8"?>243STATUS”

E o bicho reclama (bonito que nao diz nada de mais)

<?xml version="1.0" encoding="utf-8"?> 2 RS20080807095546 243 [b]Rejeicao: XML Mal Formado[/b] 0 2008-10-30T14:35:20 1

[quote=philler]Continuando a peleia.

Apos conseguir acesso, estou na tentativa de usar o servico status do servico.
[…]
Rejeicao: XML Mal Formado
0
2008-10-30T14:35:20
1
[/quote]

Pessoal, suspeito que nao seja o xml em si, porque esta dando o mesmo erro no envio de lote.
Ou é alguma coisa no cabecalho ou na maneira de envio (protocolo).

Em anexo, o cabecalho do envio e o corpo.

Aguardo ajuda de quem puder…

Uma perguntinha (besta, eu acho): o xml da solicitacao de status nao precisa ser assinado, certo?
Pelo menos nao consta no schema…

Eis o result do validador:

OPERAÇÃO: Validação de SCHEMA e assinatura Xml.


Nome do Arquivo: corpo.xml

PARSER XML: OK
TIPO DE MENSAGEM: Consulta do Status do Serviço
SCHEMA: OK
ASSINATURA XML:

Mensagem não assinada

Tempo de duração do processo: 00:00:00.3125000

Processo de validação de SCHEMA e assinatura Xml completo.

[quote=Tecnoage]tenta imprimir o conteúdo do HTTP Request… Dá pra ajudar melhor
[/quote]
Amigo, voce passou por este problema de xml mal formado, sendo que os xmls
estao ok?
Aparentemente o problema esta em outro lugar.

Grato novamente pela ajuda.

Alencar

Passamos todos… rs**
Mas, muito mais no envio de lote…

Possivelmente vc está fazendo uma requisição com os padrâmetros errados…

Poderia mostrar o código da requisição com a formação dos parâmetros?

[quote=proteus_adi]
Possivelmente vc está fazendo uma requisição com os padrâmetros errados…
Poderia mostrar o código da requisição com a formação dos parâmetros?[/quote]

Vamos la: Metodo que recebe a solicitacao com o nome do xml (em disco)

public boolean statusServico(String nomeXML) {
	String xmlRetorno = null;
	
	this.url = this.config.getURL() + this.config.getStatusServicoURL();
	this.ns = this.config.getStatusServicoNS();
	this.metodo = this.config.getStatusServicoMetodo();
	this.soapAction = this.config.getStatusServicoSOAPAction();
	this.layoutDados = "1.07";
	
	try {
		this.xml = Utils.readFile(nomeXML);
	} catch (Exception e) {
		Utils.gravaLog("Status do servico. Erro ao ler xml ("+nomeXML+"): "+e.getMessage());
		return false;
	}
	
	try {
    xmlRetorno = this.chamaWebService();
} catch (Exception e) {
	Utils.gravaLog("Erro solicitando status do servico: "+e.getMessage());
	xmlRetorno = "";
}

System.out.println(xmlRetorno);
return true;
}

Metodo de chamada do ws:

private String chamaWebService() throws Exception {
	String result = null;
	URL endpoint = new URL(this.url);
	String nomeMetodo = extraiNomeMetodo(this.metodo);
	String nomeArgumento = extraiNomeArgumento(this.metodo);

	String cab = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>";
	cab += "<cabecMsg xmlns=\"http://www.portalfiscal.inf.br/nfe\" versao=\"1.02\">";
	cab += "<versaoDados>"+this.layoutDados+"</versaoDados>";
	cab += "</cabecMsg>";
	Utils.saveFile("cabec.xml", cab);        // salvei em disco para avaliar o xml do cabecalho
	Utils.saveFile("corpo.xml", this.xml);  // salvei em disco para avaliar o xml do corpo
	
	try {
		Service servico = new Service();
		Call chamada = (Call) servico.createCall();
		
		chamada.setTargetEndpointAddress(endpoint); 			
		chamada.setOperationName(new QName(this.ns, nomeMetodo));
		chamada.setSOAPActionURI(this.soapAction);
		chamada.addParameter("nfeCabecMsg", org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
		chamada.addParameter(nomeArgumento, org.apache.axis.Constants.XSD_STRING, javax.xml.rpc.ParameterMode.IN);
		chamada.setReturnType(org.apache.axis.Constants.XSD_STRING);
		
		result = (String) chamada.invoke( new Object[] {cab, this.xml} );
	} catch (Exception e) {
		result = "ERRO:" + e.getMessage();
	}
	
	return result;
}

[code] QName servico = new QName(endpoint, nomeServico);

        Service service = new Service();
        Call call = (Call)service.createCall();
        call.setTargetEndpointAddress(new java.net.URL(endpoint));

        call.setOperationName(servico);

        for (int i = 0; i < paramValue.length; i++) {
            call.addParameter(paramName[i], XMLType.XSD_STRING, 
                              ParameterMode.IN);
        }
        call.setReturnType(XMLType.XSD_STRING);

        String ret = (String)call.invoke(paramValue);
        return ret;[/code]

Conceitualmente… tá igual ao meu…
Só tem o "chamada.setSOAPActionURI(this.soapAction); " que não tem no meu…

Tenta rever o local onde vc preenche os nomes dos parâmetros…
“nfeCabecMsg”, “nfeDadosMsg”

[quote=proteus_adi]
Só tem o "chamada.setSOAPActionURI(this.soapAction); " que não tem no meu…

Tenta rever o local onde vc preenche os nomes dos parâmetros…
“nfeCabecMsg”, “nfeDadosMsg”[/quote]

Estamos com os mesmos codigos.
Só pra confirmar, poderia mostrar como voce montou os dois arrays paramValue e paramName?