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…
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.
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?
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…
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();}}}
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?
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?
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!!
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…
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: