Recarregar JKS Java

10 respostas
H

Olá

Estou desenvolvendo uma aplicação e eu preciso de uma situação em que eu recarregue o SSL configurado.
Por exemplo, eu configuro inicalmente um JSK através das propriedades da JVM. Acesso um Web Service com estas configurações. Logo depois quero configurar outro JKS para acessar outro serviço. O problema é que a JVM não “recarrega” as novas configurações, e eu não consigo acessar o outro web service. Existe alguma maneira de fazer com que a JVM recarregue as configurações para passar a utilizar a nova configuração feita??

Obrigado,

Roberto.

10 Respostas

S

Fala H4nsi_Kursch, você pode setar o jks em tempo de execução assim

System.setProperty("javax.net.ssl.keyStore","seujks.jks"); System.setProperty("javax.net.ssl.keyStorePassword","senhaJKS"); System.setProperty("javax.net.ssl.trustStore","seujks.jks"); System.setProperty("javax.net.ssl.trustStorePassword","senhaJKS");

Mas não seria melhor se você importasse todos os certificados em um unico jks?

H

Então scaiocesar

Eu estou setando desta forma mesmo que vc colocou aí. Eu queria achar uma forma que não precisasse fazer em um único jks.
Não encontrei ainda e acho que não vai rolar ehheheh, então adotei isto aí que vc disse, apenas um JKS.

Valeu!

S

Mas com o System.setProperty não deu certo?

H

Dá certo, a questão é que eu uso um jks pra acessar um serviço, uso o System.setProperty e funciona blz. Depois vou utilizar outro jks. O System.setProperty tb funciona, o que não funciona é a JVM entender que foram alteradas as configurações de SSL. Se eu der um getProperty ele vem a última configuração, mas a JVM não obedece.

S

vc ta usando o axis?

H

sim

S
cara, eu tive um problemasso com isso uma vez, no meu caso eu não podia setar na vm então eu fiz o seguinte na classe onde vc chama os serviços vc poe isso:
AxisProperties.setProperty("axis.socketSecureFactory","MySocketFactory");
Isso vai dizer ao Axis para usar uma implementação sua do SecureFactory Dae voce implementa o MySocketFactory assim:
import java.io.FileInputStream;
import java.io.IOException;
import java.io.InputStream;
import java.security.KeyStore;
import java.security.SecureRandom;
import java.util.Hashtable;

import javax.net.ssl.KeyManagerFactory;
import javax.net.ssl.SSLContext;
import javax.net.ssl.TrustManagerFactory;

import org.apache.axis.components.net.JSSESocketFactory;
import org.apache.axis.components.net.SecureSocketFactory;



/**
 * Classe que implementa um  JSSESocketFactory customizada, possibilitando o apontamento
 * para um keystore diferente do padrao usado pelo sistema.
 * Uma boa alternativa para quando precisa usar o AXIS mas não se pode alterar as propriedades do 
 * sistema via System.setProperty.
 * Também não causa incompatibilidade com o WCE.
 * 
 */
public class MySocketFactory extends JSSESocketFactory implements
		SecureSocketFactory {

	/**
	 * Constructor MyCustomSSLSocketFactory
	 * 
	 * @param attributes
	 */
	public MySocketFactory(Hashtable attributes) {
		super(attributes);
	}

	/**
	
	 * Sobrescreve o metodo initFactory para prover a sua implementação
	 * 
	 * @throws IOException
	 */
	protected void initFactory() throws IOException {
		LogVendas.debbuger(this, "\n MySocketFactory.initFactory() \n");
		try {
			SSLContext context = getContext();
			sslFactory = context.getSocketFactory();
		} catch (Exception e) {
			if (e instanceof IOException) {
				throw (IOException) e;
			}
			throw new IOException(e.getMessage());
		}
	}

	/**

	 * 
	 * Prove um SSL personalizado.
	 * 1. Abre o keystore
	 * 2. Cria um KeyManagerFactory e um TrustManagerFactory
	 * 3. Inicia um SSLContext usando essas factories
	 * 
	 * 
	 * @return SSLContext
	 * @throws WebServiceClientConfigException
	 * @throws Exception
	 */
	protected SSLContext getContext()  {

		

		try {
			//Pega o caminho do JKS
			String pathJks = path.concat("certificado.jks");
			
			
			LogVendas.debbuger(this, "\n Caminho JKS = "+pathJks);
			

			//Obtem a senha do keystore
			
			
			char[] keystorepass = "SenhaJKS".toCharArray();
			InputStream keystoreFile = new FileInputStream(pathJks);
		
			KeyStore keyStore =  KeyStore.getInstance(KeyStore.getDefaultType());

			keyStore.load(keystoreFile, keystorepass);

			KeyManagerFactory kmf = KeyManagerFactory
					.getInstance(KeyManagerFactory.getDefaultAlgorithm());
			kmf.init(keyStore, keystorepass);

			TrustManagerFactory tmf = TrustManagerFactory
					.getInstance(TrustManagerFactory.getDefaultAlgorithm());
			tmf.init(keyStore);
			
			// configura um SSLContext usando a keystore 
			SSLContext sslContext = SSLContext.getInstance("SSL");
			sslContext.init(kmf.getKeyManagers(), tmf.getTrustManagers(),
					new SecureRandom());

			return sslContext;
		} catch (Exception e) {
			LogVendas.error(this, e);
			
		}
		return null;
	}
}

Veja assim você consegue fazer

A

Bom dia scaiocesar.

Criei a classe MySocketFactory, como será o uso dessa classe na minha aplicação ?

O que seria essa classe LogVendas ?

Ao criar essa classe MySocketFactory da erro nessa linha :

String pathJks = path.concat(“certificado.jks”);

Estou com o mesmo problema do H4nsi_Kursch, e ainda não consegui resolver.

Se puder me passar mais algumas dicas será de grande ajuda.

até mais …

G

pessoal, boa tarde.

Estou com mesmo problema e na batalha pra resolver, pesquisando verifiquei que a JVM não descarrega classes do sistema, sendo assim sempre que vc setar um valor na system ele ficará lá ate que a JVM seja reiniciada. http://java.sun.com/docs/books/jvms/second_edition/html/Concepts.doc.html#32202

Alguém sabe dizer onde encontro o pacote da classe AxisProperties, citada acima?
isso parace resolver a situação(espero)

G

problema resolvido para mim.
para os que tiverem a mesma dúvida segue o link:
http://code.google.com/p/axis-ssl/

Criado 23 de setembro de 2009
Ultima resposta 6 de out. de 2010
Respostas 10
Participantes 4