Olá, na empresa onde trabalho, estamos com dificuldades em desenvolver um Cliente Java que realize a conexão com um webservice e envie uma série de informações por meio de uma conexão segura. Vou tentar descrever o problema com mais detalhes em seguida:
Existe um WebService (desenvolvido em C#.net) em um de nossos servidores que gerencia uma base de dados. Este WebService recebe um arquivo xml compactado, interpreta-o e persiste seus dados na base. Para se conectar a este Serviço, a aplicação cliente deverá apresentar um Certificado Digital válido* para que uma conexão segura possa ser estabelecida entre ambas as partes. O servidor do WebService está configurado para requerer Certificado Digital de cliente. A aplicação cliente deve anexar o Certificado Digital no contexto da conexão.
*O Certificado Digital (incluindo sua chave privada) deverá estar
instalado previamente na máquina cliente. O certificado enviado ao
servidor deve ser do tipo X509 binário codificado por DER (.cer).
Tentativas realizadas:
++++++++++++++++++++++
Para a implementação de um serviço em JAVA que se conecte ao webservice descrito no contexto atual, inicialmente geramos classes de comunicação com o webservice a partir do plugin WSDL2Java.
(OBS: Este mesmo plugin foi utilizado para geração de classes para
comunicação com outro webservice que não querer certificado digital e funcionou.)
Após serem geradas as classes para a comunicação, tentou-se anexar o
certificado do cliente (certificado com extensão .cer), necessário para
autenticação do cliente junto ao servidor, utilizando a classe MIME. Conforme apresentado no endereço da IBM[1], o Mime é o o protocolo padrão de envio de mensagens que pode identificar arquivos e tipos binários nos cabeçalhos Content-ID ou Content-Location num envelope SOAP.
No endereço [1] é encontrado um exemplo de utilização dessa classe.
Entretanto, a utilização dessa solução não foi suficiente, pois ao enviar
uma requisição de conexão com o certificado anexado era levantada uma exceção relacionada com o “handshake” do protocolo.
Uma alternativa para este problema, foi seguir uma solução apresentada
em [2]. Nesta solução, são utilizados elementos definidos no pacote javax.net.ssl. Assim,inicialmente são armazenaodos os certificados do cliente e do servidor em formato jks. Para isso, é utilizada a ferramenta keytool [3]. Em termos de implementação, o que é realizado é uma transformação do certificado em um formato para manipulação de métodos em Java. Em seguida, é criado o contexto ssl, ou seja, são definidos para o programa quais os certificados do servidor
que são autorizados e alguns outros parâmetros que o protocolo utiliza
para criptografar e decriptografar os dados. Na sequência, é criado um objeto do tipo Socket (para isso são fornecidos a porta e o endereço https do servidor) e dois objetos que lêem e escrevem dados neste socket. Com
essa última solução, o erro informado foi quanto ao endereço do host de destino, pois é informado que este endereço é desconhecido.
[2]
http://www.tutorialized.com/tutorial/Secure-communication-between-peers-SSL-through-JSSE/348
[3] http://mindprod.com/jgloss/keytoolexe.html#KEYSTORE
Bem, gostaria de saber se alguém já teve que implementar algo do tipo e se poderia dar uma referência legal sobre como resolver o problema efetivamente.
Muito obrigada,
Katia.