Autenticação em WebService (Mutual) - Handshake_failure

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+

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?

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+

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

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

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.

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á [quote]ERRO = HTTP Error 403.7 - Forbidden: SSL client certificate is required.<br>Internet Information Services (IIS)[/quote]
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.

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

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.

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.

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?

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.

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+

[quote=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?[/quote]

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.

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…