SSL e HttpClient

5 respostas
T

Pessoal, estou dando manutenção numa aplicação que deve ficar permanentemente monitorando varios servidores e para isso eu inicio varias threads. Os servidores que trabalham com ftp, sftp ou http, não estão dando problema porém o https está meio complicado.

Eu utilizo HttpClient e PostMethod e informo o caminho do certificado (keystore) na variavel da JVM ‘javax.net.ssl.trustStore’.

Quando eu rodo somente um cliente funciona mas quando rodo mais de um (varias threads) da pau! A aplicação não encontra o caminho do certificado. O que está me deixando confuso é que se eu deixar duas instancias do eclipse rodando ao mesmo tempo, uma para cada cliente aí funciona!

Imaginei que ‘javax.net.ssl.trustStore’ só pode ter um valor, mas não faz sentido com as duas instancias rodando ao mesmo tempo!!!

Já procurei na internet exemplos mas não encontrei nada do jeito que eu preciso.
Agradeço quem puder ajudar.

5 Respostas

T

Pessoal, melhorando a pergunta.
Alguem sabe como trabalhar com várias conexões SSL/https simultaneas?

Valeu!

Luca

Olá

É claro que você já deve ter lido http://hc.apache.org/httpclient-3.x/sslguide.html

Detalhe mais seu problema.

  1. Porque usa POST?

  2. Ocorre o erro rodando fora do Eclipse e não ocorre rodando dentro do Eclipse (com 2 instâncias)?

  3. Seu certificado é auto assinado?

  4. Qual é o pau? Quando dá erro o que mostra System.out.println("javax.net.ssl.trustStore = " + System.getProperty(“javax.net.ssl.trustStore”));

  5. Mostre somente o trecho de código que dá pau

[]s
Luca

T

Olá Luca,
Ainda não li o link mas vou ler agora.

Respondendo

  1. Trata-se de um sistema legado. Não sei porque foi feito assim e pelo pemos por enquanto a diretoria não quer mexer muito na estrutura porque é um sistema crítico para o negocio…

  2. O erro ocorre sempre. Só que até agora só havia um cliente no https. Na hora que entrou outro deu erro.

  3. Não tenho certeza :frowning: mas acredito que não é auto assinado.

  4. System.out.println("javax.net.ssl.trustStore = " + |System.getProperty(“javax.net.ssl.trustStore”)); mostra o que deveria ser, ou seja o caminho completo do certificado. C:\Util\Projetos\PRODUCAO\BrokerAdapter\config\cs.keystore.
    Me desculpe mas não tenho a msg de erro agora porque estou em casa, mas ela diz que não encontrou o certificado.

  5. Aqui vai uma versão reduzida do codigo:

public int getFileFromHTTPs(){
		HttpClient client = new HttpClient();
		try{
			PostMethod method = new PostMethod(this.host); // SERVIDOR DO CLIENTE
					
			method.setRequestBody(dados); // USUARIO/SENHA/NOME DO ARQUIVO
			method.setFollowRedirects(false);
			method.setDoAuthentication(true);

			System.setProperty("javax.net.ssl.trustStore", this.certificado); 
			System.setProperty("javax.net.ssl.trustStorePassword", this.senha);

			int status = client.executeMethod(method); // [b]AQUI DA ERRO[/b][i][u]
			return status;
			
		}catch(Exception e){
			return 0;
		}
	}

Obrigado.

Luca

Olá

O erro só dá com SSL? Então o problema não está na inicialização de HttpClient usando MultiThreadedHttpConnectionManager()

Segundo http://hc.apache.org/httpclient-3.x/threading.html , se mais de uma thread usará o HttpClient, então precisaria criar o HttpClient com:

HttpClient httpClient = new HttpClient(new MultiThreadedHttpConnectionManager());
   . . . .

Esta tarde e preciso parar por aqui. Mas se eu fosse você, procuraria nos fontes da API HttpClient onde e como ele usa SSLContext e como ele inclui as system.properties que você passou. Se fosse para usar JSSE na raça, acho que precisaria de um SSLContext.getInstance().getSocketFactory() e inicializar as propriedades por SSLContext.init(). Ver http://java.sun.com/javase/6/docs/api/javax/net/ssl/SSLContext.html

Apesar de fazer tempo que não mexo com HttpClient, SSL e JSSE, fiquei bem curioso com seu problema. Nos mantenha informados sobre como resolveu ou nos dê mais dados para que alguém tente ajudá-lo.

[]s
Luca

T

OK Luca.
Já deu uma luz no assunto. Vou consultar a documentação que vc indicou e quando estiver tudo certo mando a solução.

Obrigado.

Criado 26 de maio de 2008
Ultima resposta 26 de mai. de 2008
Respostas 5
Participantes 2