Duvida com SOAP

24 respostas
A

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:

private static SOAPMessage sendSOAPMessage(SOAPMessage sm, URL url) throws SOAPException {
        SOAPConnectionFactory sfc = null;
        SOAPConnection connection = null;

        try {
            sfc = SOAPConnectionFactory.newInstance();
            connection = sfc.createConnection();

            SOAPMessage response = connection.call(sm, url);

            return response;
        } finally {
            if(connection != null) {
                connection.close();
            }
        }
    }

As execessões levantadas são essas:

29/12/2007 08:34:20 com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post
SEVERE: SAAJ0009: Message send failed
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:146)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.sendSOAPMessage(NFexSOAP.java:82)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.acessWebService(NFexSOAP.java:36)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.main(NFexSOAP.java:189)
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:140)
        ... 3 more
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:344)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection$PriviledgedPost.run(HttpSOAPConnection.java:169)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:301)
        ... 6 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 24 more

CAUSE:

java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:140)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.sendSOAPMessage(NFexSOAP.java:82)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.acessWebService(NFexSOAP.java:36)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.main(NFexSOAP.java:189)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:344)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection$PriviledgedPost.run(HttpSOAPConnection.java:169)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:301)
        ... 6 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 24 more

CAUSE:

java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:140)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.sendSOAPMessage(NFexSOAP.java:82)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.acessWebService(NFexSOAP.java:36)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.main(NFexSOAP.java:189)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:344)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection$PriviledgedPost.run(HttpSOAPConnection.java:169)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:301)
        ... 6 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 24 more

Alguém pode me ajudar?

24 Respostas

D

Soap é uma API para o SOA?Onde eu baixo??

A

É sim… é do java mesmo… ja vem com ele… :smiley:

A

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

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! :smiley: Num sei nem pra onde ir mais…

A

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

Que ferramenta você esta utilziando para trabalhar com web services? AXIS?

A

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

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

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

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

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:

import com.sun.org.apache.xml.internal.serialize.OutputFormat;
import com.sun.org.apache.xml.internal.serialize.XMLSerializer;
import java.net.URL;
import javax.xml.parsers.DocumentBuilderFactory;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPBody;
import javax.xml.soap.SOAPConnection;
import javax.xml.soap.SOAPConnectionFactory;
import javax.xml.soap.SOAPEnvelope;
import javax.xml.soap.SOAPException;
import javax.xml.soap.SOAPHeader;
import javax.xml.soap.SOAPMessage;
import javax.xml.soap.SOAPPart;
import org.w3c.dom.Document;
import org.w3c.dom.Element;

/**
 * Classe responsável por formatar uma mensagem no padrão SOAP e enviar ao web-service.
 * @author André Luiz Pereira Álvares
 */
public class NFexSOAP {

    private static final boolean DEBUG_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.
     */
    public static Document acessWebService(Document doc, URL url) throws SOAPException {
        SOAPMessage sm = createSOAPMessage(doc);
        SOAPMessage rs = sendSOAPMessage(sm, url);

        return rs.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.
     */
    private static SOAPMessage createSOAPMessage(Document doc) throws SOAPException {
        if(doc == null) {
            throw new IllegalArgumentException("O parâmetro doc não pode ser nulo.");
        }

        MessageFactory mf = MessageFactory.newInstance();
        SOAPMessage sm = mf.createMessage();

        fillSOAPMessage(sm, doc);

        printSOAPMessage("CREATE - SOAP MESSAGE:", sm);

        return sm;
    }

    /**
     * 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.
     */
    private static SOAPMessage sendSOAPMessage(SOAPMessage sm, URL url) throws SOAPException {
        if(sm == null || url == null) {
            throw new IllegalArgumentException("Os parâmetros sm e url não podem ser nulos.");
        }

        SOAPConnectionFactory sfc = null;
        SOAPConnection connection = null;

        try {
            sfc = SOAPConnectionFactory.newInstance();
            connection = sfc.createConnection();

            SOAPMessage response = connection.call(sm, url);

            printSOAPMessage("SEND - SOAP MESSAGE:", sm);
            printSOAPMessage("SEND - SERVER RESPONSE:", response);

            return response;
        } 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.
     */
    private static void fillSOAPBody(SOAPBody sb, Document doc) throws SOAPException {
        sb.addDocument(doc);        
    }

    /**
     * Método que preenche o elemento header (cabeçalho) da mensagem SOAP.
     * @param sh SOAP Header.
     */
    private static void fillSOAPHeader(SOAPHeader sh) {
        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.
     */
    private static void fillSOAPPart(SOAPPart sp) throws SOAPException {
        SOAPEnvelope se = 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.
     */
    private static void fillSOAPMessage(SOAPMessage sm, Document doc) throws SOAPException {
        sm.setProperty(SOAPMessage.WRITE_XML_DECLARATION, "true");

        SOAPPart sp   = sm.getSOAPPart();
        SOAPHeader sh = sm.getSOAPHeader();
        SOAPBody sb   = 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.
     */
    private static void printSOAPMessage(String title, SOAPMessage sm) {
        if(DEBUG_MODE) {
            System.out.println(title);
            // Imprime a mensagem SOAP gerada... apenas para debug!
            try {
                //sm.writeTo(System.out);
                XMLSerializer serializer = new XMLSerializer(System.out, new OutputFormat(sm.getSOAPPart(), "utf-8", true));
                serializer.serialize(sm.getSOAPPart());
            } catch (Exception ex) {
                // ignora excessões
            }
        }
    }


    /**
     * Método MAIN usado para testar a classe
     * @param args
     */
    public static void main(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...
            Document doc = DocumentBuilderFactory.newInstance().newDocumentBuilder().newDocument();

            // XML Consulta de Status do Serviço TESTE!!
            Element consStatServ = doc.createElement("consStatServ");
            consStatServ.setAttribute("versao", "1.02");
            doc.appendChild(consStatServ);

            Element xServ = doc.createElement("xServ");
            xServ.setTextContent("STATUS");
            consStatServ.appendChild(xServ);
            // XML Consulta de Status do Serviço TESTE!!

            //SOAPMessage sm = createSOAPMessage(doc);
            Document rs = acessWebService(doc, new URL("https://homologacao.sefaz.mt.gov.br/nfews/NfeStatusServico"));
        } catch (Exception ex) {
            ex.printStackTrace();
        }
    }
}
A

acessei a url do serviço que vc está tentando utilizar e o meu navegador, de cara, solicita pela certificação a utilizar.

A url é essa aqui certo? https://homologacao.sefaz.mt.gov.br/nfews/NfeStatusServico

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.

Dê uma olhada nesse tutorial, ele é bem direto (seção Apache Axis Clients).
http://hobit.gsf.de/wiki/display/wiki/Web+Services+with+HTTPS

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

agodinhost:
acessei a url do serviço que vc está tentando utilizar e o meu navegador, de cara, solicita pela certificação a utilizar.

A url é essa aqui certo? https://homologacao.sefaz.mt.gov.br/nfews/NfeStatusServico

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.

Dê uma olhada nesse tutorial, ele é bem direto (seção Apache Axis Clients).
http://hobit.gsf.de/wiki/display/wiki/Web+Services+with+HTTPS

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

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

E como eu instalo a chave publica deles?

A

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.

A
perdão, as duas últimas linhas:

System.setProperty(javax.net.ssl.keyStore, C:\Documents and Settings\Richard\clientKeystore);

System.setProperty(javax.net.ssl.keyStorePassword, someOtherPassword);

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

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

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

Gracas a Deus isso nao é comigo… hehehe… aqui a empresa ja tem certificado digital… :smiley:
E foi realmente um saco pra tirar…

R

É sim… é do java mesmo… ja vem com ele… :D

Como assim “do java mesmo” ?SOAP nao é um padrão independente de plataforma?

A

Qro dizer que ja vem na API do java o pacote javax.xml.soap! Estou usando esse pacote! :smiley:

M

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

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:

private static SOAPMessage sendSOAPMessage(SOAPMessage sm, URL url) throws SOAPException {
        SOAPConnectionFactory sfc = null;
        SOAPConnection connection = null;

        try {
            sfc = SOAPConnectionFactory.newInstance();
            connection = sfc.createConnection();

            SOAPMessage response = connection.call(sm, url);

            return response;
        } finally {
            if(connection != null) {
                connection.close();
            }
        }
    }

As execessões levantadas são essas:

29/12/2007 08:34:20 com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection post
SEVERE: SAAJ0009: Message send failed
com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:146)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.sendSOAPMessage(NFexSOAP.java:82)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.acessWebService(NFexSOAP.java:36)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.main(NFexSOAP.java:189)
Caused by: java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:140)
        ... 3 more
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:344)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection$PriviledgedPost.run(HttpSOAPConnection.java:169)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:301)
        ... 6 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 24 more

CAUSE:

java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:140)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.sendSOAPMessage(NFexSOAP.java:82)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.acessWebService(NFexSOAP.java:36)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.main(NFexSOAP.java:189)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:344)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection$PriviledgedPost.run(HttpSOAPConnection.java:169)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:301)
        ... 6 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 24 more

CAUSE:

java.security.PrivilegedActionException: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at java.security.AccessController.doPrivileged(Native Method)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.call(HttpSOAPConnection.java:140)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.sendSOAPMessage(NFexSOAP.java:82)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.acessWebService(NFexSOAP.java:36)
        at br.com.datamanager.nfex.util.soap.NFexSOAP.main(NFexSOAP.java:189)
Caused by: com.sun.xml.internal.messaging.saaj.SOAPExceptionImpl: Message send failed
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:344)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection$PriviledgedPost.run(HttpSOAPConnection.java:169)
        ... 5 more
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at com.sun.net.ssl.internal.ssl.Alerts.getSSLException(Alerts.java:174)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.fatal(SSLSocketImpl.java:1591)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:187)
        at com.sun.net.ssl.internal.ssl.Handshaker.fatalSE(Handshaker.java:181)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:975)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.processMessage(ClientHandshaker.java:123)
        at com.sun.net.ssl.internal.ssl.Handshaker.processLoop(Handshaker.java:516)
        at com.sun.net.ssl.internal.ssl.Handshaker.process_record(Handshaker.java:454)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.readRecord(SSLSocketImpl.java:884)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.performInitialHandshake(SSLSocketImpl.java:1096)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1123)
        at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(SSLSocketImpl.java:1107)
        at sun.net.www.protocol.https.HttpsClient.afterConnect(HttpsClient.java:405)
        at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(AbstractDelegateHttpsURLConnection.java:166)
        at sun.net.www.protocol.http.HttpURLConnection.getOutputStream(HttpURLConnection.java:832)
        at sun.net.www.protocol.https.HttpsURLConnectionImpl.getOutputStream(HttpsURLConnectionImpl.java:230)
        at com.sun.xml.internal.messaging.saaj.client.p2p.HttpSOAPConnection.post(HttpSOAPConnection.java:301)
        ... 6 more
Caused by: sun.security.validator.ValidatorException: PKIX path building failed: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:285)
        at sun.security.validator.PKIXValidator.engineValidate(PKIXValidator.java:191)
        at sun.security.validator.Validator.validate(Validator.java:218)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.validate(X509TrustManagerImpl.java:126)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:209)
        at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(X509TrustManagerImpl.java:249)
        at com.sun.net.ssl.internal.ssl.ClientHandshaker.serverCertificate(ClientHandshaker.java:954)
        ... 18 more
Caused by: sun.security.provider.certpath.SunCertPathBuilderException: unable to find valid certification path to requested target
        at sun.security.provider.certpath.SunCertPathBuilder.engineBuild(SunCertPathBuilder.java:174)
        at java.security.cert.CertPathBuilder.build(CertPathBuilder.java:238)
        at sun.security.validator.PKIXValidator.doBuild(PKIXValidator.java:280)
        ... 24 more

Alguém pode me ajudar?

Andre,

você conseguiu resolver este problema??

Estou tendo o mesmo problema, estou usando JSF e Glassfish para conectar no WS, em uma aplicaçao desktop funciona corretamente!

Abraço!

Criado 29 de dezembro de 2007
Ultima resposta 15 de dez. de 2010
Respostas 24
Participantes 7