Autenticação em WebService (Mutual) - Handshake_failure

14 respostas
F

Pessoal, Boa Tarde!
Estou com problemas quanto ao acesso a WebServices com autenticação mútua. Ao fazer o acesso ocorre o erro de Handshake_failure. Setei a var javax.net.ssl.keyStore (contendo o meu certificado digital com a chave pública e privade) e setei javax.net.ssl.trustStore (contendo todos os certificados, CAs).
Mas ao chamar o WS ocorre um erro o seguinte erro:

main, handling exception: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure
HTTP transport error: javax.net.ssl.SSLHandshakeException: Received fatal alert: handshake_failure

Procurei na net e parece que tenho que implementar um Handler para passar o certificado do cliente. Alguém sabe como faço para fazer esse tipo de autenticação?

T+

14 Respostas

B

Olá fgarnica, estou precisando desenvolver uma aplicação que irá se comunicar com um webservice utilizando autenticação mútua, e pelo que vi você está bem mais avançado do que eu, não tenho idéia de como abrir uma conexão utilizando certificado digital, você poderia me passar umas dicas?

F

Olá Neto,

Para fazer o acesso utilizando o certificado digital você deve fazer o seguinte: Crie uma keystore com o aplicativo keytool do java e importe o certificado do server e todas as ca´s (a cadeia completa). Após crie uma outra keystore com o certificado digital do cliente.

Antes de fazer a chamada ao WS informe os seguintes parâmetros:

// Keystore com o certificado do cliente

System.setProperty(javax.net.ssl.keyStoreType,JKS);

System.setProperty(javax.net.ssl.keyStore,C:\Projetos\Certificado\keystore_client.jks);

System.setProperty(javax.net.ssl.keyStorePassword,123456);
// Keystore com as CA´s

System.setProperty(javax.net.ssl.trustStoreType, JKS);

System.setProperty(javax.net.ssl.trustStore,C:\Projetos\Certificado\keystore_ca.jks);

System.setProperty(javax.net.ssl.trustStorePassword,123456);

Pronto. Espero ter te ajudado.

T+

B

Muito obrigado pela resposta fgarnica, e ajudou sim, vou fazer uns testes e qualquer dúvida posto aqui novamente.

R

olá fgarnica!

estou pesquisando sobre nota fiscal eletronica usando java e vi seu comentario aqui no forum e gostaria de saber se vc poderia me ajudar no seguinte:

vc disse q pra fazer o acesso usando certificado digital tem q criar uma keystore e importar o certificado do server e todas as ca´s…
eu queria saber como q faz isso?

o certificado digital q tenho aqui é de um javacard (e-CNPJ). Tem com importar o certificado desse cartão???

qquer dica e exemplos me ajudariam muito :wink:

valeu!

Rodrigo

E

Olá a todos,

consegui assinar e fazer a verificação da NF-e, usando apenas o certificado.pfx, estou precisando de uma classe que faça a comunicação WSDL com a receita, para dar continuidade aos teste, caso alguem tenha interesse no que fiz, é só pedir.

ats,

Emerson Mota.

A

Pessoal
Sinceramente já estou perdendo os cabelos, eu não manjo muito de segurança e mexi muito pouco com CAs. Mas segui algumas dicas daqui e consegui gerar as chaves etc… mas tem um grande detalhe que eu não estou conseguindo resolver:
Eu só consigo conectar com o WS de Goias, se tento para outros estados (mesmo gerando outras jks c/ os certificados dos servers conforme cada estado) ele dá

ERRO = HTTP Error 403.7 - Forbidden: SSL client certificate is required.<br>Internet Information Services (IIS)

Não sei mais o que fazer, séra que alguém poderia me dar uma luz, por favor…

[b]Perguntas:

  1. Eu preciso gerar um certificado para o Tomcat e empacotar com o que envio para o servidor da receita? pois eu apenas empacoto os certificados dos da receita e enviou o .pfx do cliente.

  2. Outra coisa, eu andei lendo que eu preciso de uma autorização do IP da minha máquina para consumir os WS da receita, é verdade? se for como faço.[/b]

Abraços,
Alexandre.

D

Pessoal, o assunto eh veio mas eu estou entrando neste assunto agora…

Voces conseguiram conectar com a receita?
este link abaixo tem um o PDF sobre o assunto, como funciona e etc… msa e agora pessoal… em java, nunca abri uma conexao ainda mais SSL e etc…

http://www.nfe.fazenda.gov.br/portal/docs/Manual_Integracao_Contribuinte_v_2.02a_2008_06_16.pdf

Alguem tem alguma material interessante para poder me orientar!!!

Abracos

E

Eu também estou precisando conectar no NF-e e estou com o mesmo erro 403.7.
Meu código é basicamente o segte (lima.pfx é o meu certificado, governo.jks contem 3 chaves publicas raizbr/receitafederal/serpro):

System.setProperty("javax.net.debug", "ssl");
    //
    System.setProperty("java.protocol.handler.pkgs","com.sun.net.ssl.internal.www.protocol");
    java.security.Security.addProvider(new com.sun.net.ssl.internal.ssl.Provider());
    // Keystore com o certificado do cliente
    System.setProperty("javax.net.ssl.keyStoreType", "PKCS12");
    System.setProperty("javax.net.ssl.keyStore", unidade+"/sistemas/emonitor/cert/lima.pfx");
    System.setProperty("javax.net.ssl.keyStorePassword", "XXXXX");
    //
    System.setProperty("javax.net.ssl.trustStoreType", "JKS");
    System.setProperty("javax.net.ssl.trustStore", unidade+"/sistemas/emonitor/cert/governo.jks");
    System.setProperty("javax.net.ssl.trustStorePassword", "XXXXX");
    // chamada ao webservice
      String result = null;
      String url = "https://homologacao...statusservico.asmx";
      GetMethod httpget = new GetMethod(url);
      // -------------------  
      try {
        HttpClient httpclient = new HttpClient();
        httpclient.executeMethod(httpget);
        result = httpget.getResponseBodyAsString();
      } finally {
        httpget.releaseConnection();
      }
      System.out.println("Result = " + result);

Em “Result” imprime:

Pelo IE7 eu consigo acessar importar a minha chave, acessar a URL, verificar o certificado do servidor e mostrar a pagina da homologacao.
Pelo Firefox2, da o mesmo erro que minha aplicacao Java…
E se eu comento as 3 linhas do keyStore, tambem da o mesmo erro, como se estivesse totalmente inutil aquele codigo.

E

Descobri que o arquivo lima.pfx original adquirido junto ao SERASA precisa passar por uma "transformação" da seguinte forma:

  1. dentro do IE7, mandar exportar o certificado com toda a cadeia de certificacao (opcao "nao ticada" por default)… salvei como lima2.pfx
  2. importar no Firefox o arquivo lima2.pfx e nao lima.pfx => nao da mais erro de SSL no Firefox
  3. usar o lima2.pfx no keyStore da aplicacao => nao da mais erro na aplicacao
    Agora estou no proximo passo, como chamar o WebService… ainda nao consegui nem por HttpClient nem pelo codigo automatico gerado pelo NetBeans6.1 quando importo o WSDL. Nao sei como setar o CabecMsg e passa-lo como parametro para o WebService.
P

hehehe…
Eita problema chatinho…

Estou passando por essa peleja também.

:S

Só dá forbidden. 403.

Eu acredito que algo esteja esbarrando na parte que diz “autorização para autenticação cliente”.
O que vem a ser isto exatamente?

D

Tenho um web service criado com axis2. Configurei o tomcat com https. Agora preciso criar um cliente webservice para acessar o serviço criado, via https. Preciso criar um cliente java, mas não estou conseguindo e acho que o que foi citado abaixo resolve o meu problema. Gostaria de pedir que alguém detalhe melhor esta parte que selecionei abaixo.

Desde já agradeço.

Douglas.

F

Ref ao uso de um WS que tenha autenticação mutua via certificado digital é necessário configurar os parametros do https para utilizar obter o certificado digital do client para autenticação. Quanto ao uso do WS via https não tem segredo? Douglas: o seu WS é autenticado como é?

T+

proteus_adi:
hehehe…
Eita problema chatinho…

Estou passando por essa peleja também.

:S

Só dá forbidden. 403.

Eu acredito que algo esteja esbarrando na parte que diz “autorização para autenticação cliente”.
O que vem a ser isto exatamente?

D

Vou detalhar o meu problema.

Configurando o tomcat para aceitar https.

Primeiro gerei os certificados executando os comandos a seguir.

keytool -genkey -alias tomcat-sv -dname “CN=localhost, OU=X, O=Y, L=Z, S=XY, C=YZ” -keyalg RSA -keypass changeit -storepass changeit -keystore server.keystore

keytool -export -alias tomcat-sv -storepass changeit -file server.cer -keystore server.keystore

keytool -genkey -alias tomcat-cl -dname “CN=Client, OU=X, O=Y, L=Z, S=XY, C=YZ” -keyalg RSA -keypass changeit -storepass changeit -keystore client.keystore

keytool -export -alias tomcat-cl -storepass changeit -file client.cer -keystore client.keystore

keytool -import -v -trustcacerts -alias tomcat -file server.cer -keystore client.keystore -keypass changeit -storepass changeit

keytool -import -v -trustcacerts -alias tomcat -file client.cer -keystore server.keystore -keypass changeit -storepass changeit

Foram criados estes 4 arquivos:
server.keystore
server.cer
client.keystore
client.cer
Coloquei os 4 arquivos no diretório C:\certificados

Alterei o arquivo C:\Program Files\Apache Software Foundation\Tomcat 6.0\conf\server.xml

<Connector port="443" protocol="HTTP/1.1" SSLEnabled="true"
           maxThreads="150" scheme="https" secure="true"
           keystoreFile="C:\certificados\server.keystore" keystorePass="changeit"   
           clientAuth="false" sslProtocol="TLS" />

Gerando o cliente java

Tenho este serviço https://localhost:8443/axis2/services/hello?wsdl

Criei um projeto java no netbeans
Criei um Cliente para serviço Web informando o wsdl acima.

E aqui está o código do cliente, quando executo ele não retorna o valor e acontece uma exceção.

Obs.: Quando eu crio um Cliente para serviço Web informado o endereço do serviço usando http, funciona normalmente, o problema é quando coloco https.

public class https { public static void main(String[] args) { // TODO code application logic here try { // Call Web Service Operation namespace.Hello service = new namespace.Hello(); namespace.HelloPortType port = service.getHelloHttpSoap12Endpoint(); // TODO process result here namespace.MostraHelloResponse result = port.mostraHello(); System.out.println("Result = "+result); } catch (Exception ex) { // TODO handle custom exceptions here } } }

Nesse processo todo o que estou fazendo errado, o que está faltando?

Obrigado.

Douglas.

P

Até hoje estou com ESTE problema.

Bom,
Descobri que o problema é exclusivamente com os endereços .NET, que terminam com .asmx.
E, descobri que ele não entende meu certificado. O erro retornado é 403.7 Forbidden.

Alguem conseguiu fazer acesso via java aos webServices .net???

SOCOOOORRO…

Criado 1 de outubro de 2007
Ultima resposta 9 de jul. de 2009
Respostas 14
Participantes 9