Pessoal estou tentando enviar uma mensagem SOAP para um web-service via conexao segura (https, ou seja pede certificado digital). E ocorre um erro que pelo visto é que a JVM nao consegue achar um certificado digital instalado na minha maquina… acho q eh isso… bem o método que estou fazendo o envio é esse:
E entao pessoal, alguem pode me ajudar? To precisando mesmo de ajuda… nao consigo achar nada relevante no google… o que consegui ateh agora é descobrir q parece q tenho q configurar um certififcado na minha JVM… mas nao sei se esse certificado é o meu ou do servidor q eu vou conectar…? alguem sabe?
A
andre2k2
Estou lendo a respeito de uma ferramenta chamada keytool pra importar o certificado… usei os comandos pra importar (keytool -import - alias xxx -file xxx.cer) o certificado tentei conectar e ateh agora nada…
To bem perdido… hehehe! Num sei nem pra onde ir mais…
A
agodinho
cara, para https é isso mesmo: vc vai ter de criar um certificado, instalar esse certificado no seu server e se assegurar que esse mesmo server esteja rodando https.
dê uma olhada na verisign, certsign e twantee da vida que eles disponibilizam uns bons tutotiais lá (além de um trial de certificado).
Note que vc pode criar um certificado de “teste” (que não é certificado por nenhuma entidade, apenas é reconhecido internamente na sua rede).
normalmente vc baixa um sdk onde eles te disponibilizam uma penca de ferramentazinhas chatas pra vc usar em linha de comando pra criar esse certificado.
F
falvesti
Que ferramenta você esta utilziando para trabalhar com web services? AXIS?
A
andre2k2
Nao estou usando nenhuma ferramenta… estou tentando enviar via SOAP mesmo… que ja vem no java… no pacote do soap…
Eu estou fazendo soh um cliente e pelo q andei vendo preciso atribuir os valores das propriedades: javax.net.ssl.trustStore e javax.net.ssl.trustStorePassword
Onde javax.net.ssl.trustStore é o caminho pro arquivo de certificados confiaveis q gero com o keytool… o problema agora é q nao sei gerar esse arquivo direito… pq nao sei pegar o certificado do servidor… alguem sabe?
A
agodinho
Normalmente vc primiero cria o certificado e depois instala o mesmo no server por meio de alguma ferramenta de linha de comando desse mesmo server. A ferramenta é quem sabe onde fica o store. Vc normalmente não aponta o caminho, exceto quando vc quer agrupar certificados …
A
andre2k2
Normalmente vc primiero cria o certificado e depois instala o mesmo no server por meio de alguma ferramenta de linha de comando desse mesmo server. A ferramenta é quem sabe onde fica o store. Vc normalmente não aponta o caminho, exceto quando vc quer agrupar certificados …
O que eu nao entendo é qual certificado instalar… e eu nao estou fazendo um servidor… estou fazendo um cliente q acessa o web-service da secretaria de fazenda… qual certificado eu devo instalar? o meu ou o da sefaz? nao estou entendendo isso mto bem…
A
agodinho
AHHHHHHHHHhhhhhhhhhhhhhhhhhn
Seu web service vai acessar o servidor deles certo?
Vamos voltar um pouco:
vc consegue “ver” o serviço pelo navegador?
Digite a url no navegador, só pra termos certeza de que não é nenhum problema de firewall
A
andre2k2
agodinhost:
AHHHHHHHHHhhhhhhhhhhhhhhhhhn
Seu web service vai acessar o servidor deles certo?
Vamos voltar um pouco:
vc consegue “ver” o serviço pelo navegador?
Digite a url no navegador, só pra termos certeza de que não é nenhum problema de firewall
Nao, eu nao estou fazendo web-service nao… o que eu estou fazendo é um cliente q acessa o web service…
Eu consigo ver o servico sim… entrei pelo navegador acessei tudo certinho… ateh acessei o wsdl…
vou enviar o codigo da minha classe pra entender melhor o que eu estou fazendo:
importcom.sun.org.apache.xml.internal.serialize.OutputFormat;importcom.sun.org.apache.xml.internal.serialize.XMLSerializer;importjava.net.URL;importjavax.xml.parsers.DocumentBuilderFactory;importjavax.xml.soap.MessageFactory;importjavax.xml.soap.SOAPBody;importjavax.xml.soap.SOAPConnection;importjavax.xml.soap.SOAPConnectionFactory;importjavax.xml.soap.SOAPEnvelope;importjavax.xml.soap.SOAPException;importjavax.xml.soap.SOAPHeader;importjavax.xml.soap.SOAPMessage;importjavax.xml.soap.SOAPPart;importorg.w3c.dom.Document;importorg.w3c.dom.Element;/** * Classe responsável por formatar uma mensagem no padrão SOAP e enviar ao web-service. * @author André Luiz Pereira Álvares */publicclassNFexSOAP{privatestaticfinalbooleanDEBUG_MODE=true;/** * Método que cria uma mensagem SOAP e envia ao serviço web. * @param doc documento XML de solicitação do serviço. * @param url Endereço do serviço web. * @return Retorna o documento com a resposta do serviço web. * @throws javax.xml.soap.SOAPException Problema na criação ou envio da mensagem. */publicstaticDocumentacessWebService(Documentdoc,URLurl)throwsSOAPException{SOAPMessagesm=createSOAPMessage(doc);SOAPMessagers=sendSOAPMessage(sm,url);returnrs.getSOAPPart();}/** * Método que cria uma mensagem SOAP. * @param doc Mensagem que será empacotada na mensagem SOAP. * @param url Endereço para onde será enviada a mensagem. * @return Retorna a mensagem SOAP formatada. * @throws javax.xml.soap.SOAPException Problema na criação da mensagem SOAP. */privatestaticSOAPMessagecreateSOAPMessage(Documentdoc)throwsSOAPException{if(doc==null){thrownewIllegalArgumentException("O parâmetro doc não pode ser nulo.");}MessageFactorymf=MessageFactory.newInstance();SOAPMessagesm=mf.createMessage();fillSOAPMessage(sm,doc);printSOAPMessage("CREATE - SOAP MESSAGE:",sm);returnsm;}/** * Método que envia uma mensagem SOAP para um web-service indicado pela URL. * @param sm SOAP Message. * @param url Endereço do web-service. * @return Retorna uma mensagem SOAP indicando a reposta do web-service. * @throws javax.xml.soap.SOAPException Problema no envio da mensagem SOAP. */privatestaticSOAPMessagesendSOAPMessage(SOAPMessagesm,URLurl)throwsSOAPException{if(sm==null||url==null){thrownewIllegalArgumentException("Os parâmetros sm e url não podem ser nulos.");}SOAPConnectionFactorysfc=null;SOAPConnectionconnection=null;try{sfc=SOAPConnectionFactory.newInstance();connection=sfc.createConnection();SOAPMessageresponse=connection.call(sm,url);printSOAPMessage("SEND - SOAP MESSAGE:",sm);printSOAPMessage("SEND - SERVER RESPONSE:",response);returnresponse;}finally{if(connection!=null){connection.close();}}}/** * Método que preenche o elemento body (corpo) da mesnagem SOAP. * @param sb SOAP Body: elemento body da mensagem SOAP. * @param doc Document: conteúdo que será colocado no elemento body. * @throws javax.xml.soap.SOAPException Problema na criação da mensagem SOAP. */privatestaticvoidfillSOAPBody(SOAPBodysb,Documentdoc)throwsSOAPException{sb.addDocument(doc);}/** * Método que preenche o elemento header (cabeçalho) da mensagem SOAP. * @param sh SOAP Header. */privatestaticvoidfillSOAPHeader(SOAPHeadersh){sh.detachNode();}/** * Método que preenche informações a respeito da mensagem SOAP. * @param sp SOAP Part. * @throws javax.xml.soap.SOAPException Problema na criação da mensagem SOAP. */privatestaticvoidfillSOAPPart(SOAPPartsp)throwsSOAPException{SOAPEnvelopese=sp.getEnvelope();sp.setXmlVersion("1.0");se.addNamespaceDeclaration("xsd","http://www.w3.org/2001/XMLSchema");se.addNamespaceDeclaration("xsi","http://www.w3.org/2001/XMLSchema-instance");//se.addNamespaceDeclaration("enc", "http://schemas.xmlsoap.org/soap/encoding/");//se.addNamespaceDeclaration("env", "http://schemas.xmlsoap.org/soap/envelop/");//se.setEncodingStyle("http://schemas.xmlsoap.org/soap/encoding/");}/** * Método que preenche informações a respeito da mensagem SOAP. * @param sm SOAP Message. * @param doc Document. * @throws javax.xml.soap.SOAPException Problema na criação da mensagem SOAP. */privatestaticvoidfillSOAPMessage(SOAPMessagesm,Documentdoc)throwsSOAPException{sm.setProperty(SOAPMessage.WRITE_XML_DECLARATION,"true");SOAPPartsp=sm.getSOAPPart();SOAPHeadersh=sm.getSOAPHeader();SOAPBodysb=sm.getSOAPBody();// Preenche os elementos da mensagem.fillSOAPPart(sp);fillSOAPHeader(sh);fillSOAPBody(sb,doc);}/** * Método que imprime a mensgaem SOAP no console. Este método é usado * somente em modo debug. * @param sm SOAP Message: mensagem SOAP. */privatestaticvoidprintSOAPMessage(Stringtitle,SOAPMessagesm){if(DEBUG_MODE){System.out.println(title);// Imprime a mensagem SOAP gerada... apenas para debug!try{//sm.writeTo(System.out);XMLSerializerserializer=newXMLSerializer(System.out,newOutputFormat(sm.getSOAPPart(),"utf-8",true));serializer.serialize(sm.getSOAPPart());}catch(Exceptionex){// ignora excessões}}}/** * Método MAIN usado para testar a classe * @param args */publicstaticvoidmain(String[]args){System.setProperty("javax.net.debug","all");System.setProperty("javax.net.ssl.trustStore","C:\\DM\\Java\\Trunk\\NFex\\tstore.jks");System.setProperty("javax.net.ssl.trustStorePassword","datamanager");System.setProperty("javax.net.ssl.keyStore","C:\\DM\\Java\\Trunk\\NFex\\kstore.jks");System.setProperty("javax.net.ssl.keyStorePassword","datamanager");try{//Cria um document vazio...Documentdoc=DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();// XML Consulta de Status do Serviço TESTE!!ElementconsStatServ=doc.createElement("consStatServ");consStatServ.setAttribute("versao","1.02");doc.appendChild(consStatServ);ElementxServ=doc.createElement("xServ");xServ.setTextContent("STATUS");consStatServ.appendChild(xServ);// XML Consulta de Status do Serviço TESTE!!//SOAPMessage sm = createSOAPMessage(doc);Documentrs=acessWebService(doc,newURL("https://homologacao.sefaz.mt.gov.br/nfews/NfeStatusServico"));}catch(Exceptionex){ex.printStackTrace();}}}
A
agodinho
acessei a url do serviço que vc está tentando utilizar e o meu navegador, de cara, solicita pela certificação a utilizar.
Fica fácil ver que se vc selecionar uma certificação incorreta ou expirada o java vai bichar levantando essa exceção que vc apresentou (pelo menos faz sentido)
Baixei seu código aqui e tudo parece direitinho (Java 1.4, Axis 1.4 e xerces 2.9.1).
Sei que o store do navegador (IE 6) não é o mesmo utilizado pelo Axis. Isso foi só pra te dar uma idéia do quê acontece por baixo dos panos.
PS: o certificado que vc deve utilizar aqui é o certificado público do serviço que vc está utilizando - NÃO É o certificado que vc criou ok? Esse certificado que vc criou é utilizado quando vc tem seu próprio server e não é o seu caso.
PS2: se, apenas se, esse certificado for público posta a url pra download dele pra quê eu (ou outros aqui) possamos te ajudar …
A
andre2k2
agodinhost:
acessei a url do serviço que vc está tentando utilizar e o meu navegador, de cara, solicita pela certificação a utilizar.
Fica fácil ver que se vc selecionar uma certificação incorreta ou expirada o java vai bichar levantando essa exceção que vc apresentou (pelo menos faz sentido)
Baixei seu código aqui e tudo parece direitinho (Java 1.4, Axis 1.4 e xerces 2.9.1).
Sei que o store do navegador (IE 6) não é o mesmo utilizado pelo Axis. Isso foi só pra te dar uma idéia do quê acontece por baixo dos panos.
PS: o certificado que vc deve utilizar aqui é o certificado público do serviço que vc está utilizando - NÃO É o certificado que vc criou ok? Esse certificado que vc criou é utilizado quando vc tem seu próprio server e não é o seu caso.
Lendo uma documentação da Sefaz aqui descobri q pra acessar os servicos eles tem q se cadastrar… será q isso pode ter alguma coisa a ver? Tipo, se vc nao se cadastra eles nao reconhecem seu certificado e da erro na conexao…? pode ser?
A
agodinho
andre2k2:
Lendo uma documentação da Sefaz aqui descobri q pra acessar os servicos eles tem q se cadastrar… será q isso pode ter alguma coisa a ver? Tipo, se vc nao se cadastra eles nao reconhecem seu certificado e da erro na conexao…? pode ser?
Hmmm, sei não. Até onde sei vc só precisa da chave pública deles instalada no seu computador (não a sua). Posso estar enganado, não sou especialista em SSL e pode ter algo mais diferente nesse circuito.
PS: vc já disse que conseguiu ver o WSDL no navegador mas e o serviço? vc conseguiu utilizar o serviço pelo navegador? Se vc conseguiu isso quer dizer que vc já tem o certificado deles no key store do seu navegador (e é uma cópia dess certificado que vc deve utilizar), caso contrário vc precisa voltar um passo aí: tem certeza de quê o certificado é o correto?
A
andre2k2
E como eu instalo a chave publica deles?
A
agodinho
System.setProperty(“javax.net.ssl.trustStore”, “C:\Documents and Settings\Richard\clientTruststore”); System.setProperty(“javax.net.ssl.trustStorePassword”, “somePassword”);
ou
System.setProperty(“javax.net.ssl.keyStore”, “C:\Documents and Settings\Richard\clientKeystore”); System.setProperty(“javax.net.ssl.keyStorePassword”, “someOtherPassword”);
lá da seção “Apache Axis Clients” da url que te passei.
Isso é análogo ao o que se faz em linha de comando pra instalar (e desisntalar) certificados no store do navegador.
dizem qual certificado utilizar quando o serviço exige autenticação do cliente (se o serviço exigir vc podem sim, ter de criar um certificado seu pra acessor o serviço).
Note que nesse caso vc tem dois certificados :
o deles (chave pública, especificado nas duas primeiras linhas)
o seu certificado (2 últimas linhas);
PS: pessoalmente nunca usei com autenticação de cliente e, pelo que tudo indica, acho que vc tem razão: vc terá de fazer seu cadastro lá e, muito provavelmente, terá de criar um certificado pra vc (ou sua empresa).
A
andre2k2
System.setProperty(“javax.net.ssl.trustStore”, “C:\Documents and Settings\Richard\clientTruststore”); System.setProperty(“javax.net.ssl.trustStorePassword”, “somePassword”);
ou
System.setProperty(“javax.net.ssl.keyStore”, “C:\Documents and Settings\Richard\clientKeystore”); System.setProperty(“javax.net.ssl.keyStorePassword”, “someOtherPassword”);
lá da seção “Apache Axis Clients” da url que te passei.
Isso é análogo ao o que se faz em linha de comando pra instalar (e desisntalar) certificados no store do navegador.
Vc tem o certificado deles? pki, pks, algo assim.
Nao tenho o certificado… vou ter q correr atras disso… conseguindo eu retorno aki no topico os resultados da minha odisseia… hehehe
Mto obrigado, agodinhost! Foi mto esclarecedor… vlw mesmo!!
A
agodinho
se prepare: se vc for criar um certificado pra sua empresa o processo é bem burocrático e costuma demorar mais de duas semanas - além do quê exige assinatura e comunicação com diretores e outros bosses.
A
andre2k2
Gracas a Deus isso nao é comigo… hehehe… aqui a empresa ja tem certificado digital…
E foi realmente um saco pra tirar…
R
raf4ever
É sim… é do java mesmo… ja vem com ele… :D
Como assim “do java mesmo” ?SOAP nao é um padrão independente de plataforma?
A
andre2k2
Qro dizer que ja vem na API do java o pacote javax.xml.soap! Estou usando esse pacote!
M
mvelho
Olha só, estou acompanhando o assunto… embora eu esteja utilizando outra linguagem para fazer a comunicação com a receita… estou com o mesmo problema… Cara essa nota fiscal eletronica tá dando uma dor de cabeça…
A
altitdb
andre2k2:
Pessoal estou tentando enviar uma mensagem SOAP para um web-service via conexao segura (https, ou seja pede certificado digital). E ocorre um erro que pelo visto é que a JVM nao consegue achar um certificado digital instalado na minha maquina… acho q eh isso… bem o método que estou fazendo o envio é esse: