philler
Outubro 30, 2008, 8:32am
#41
O erro foi na hora de extrair o certificado no Internet Explorer, tem que escolher a opção “Sim, exportar a chave particular”, depois escolhemos “Troca de imformações pessoais PKCS n 12(*.pfx)” selecione “Ativar proteção de alta segurança”.
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.
philler
Outubro 30, 2008, 9:10am
#43
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 é?
philler
Outubro 30, 2008, 11:00am
#45
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
philler
Outubro 30, 2008, 11:06am
#47
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
philler
Outubro 30, 2008, 12:09pm
#50
[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
philler
Outubro 30, 2008, 12:55pm
#52
philler:
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)?
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
philler
Outubro 30, 2008, 1:19pm
#53
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
philler
Outubro 30, 2008, 2:50pm
#54
[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…
philler
Outubro 30, 2008, 2:54pm
#55
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.
philler
Outubro 31, 2008, 2:23pm
#56
[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?
philler
Outubro 31, 2008, 2:42pm
#58
[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”
philler
Outubro 31, 2008, 3:28pm
#60
[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?