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??
Mas não seria melhor se você importasse todos os certificados em um unico jks?
H
H4nsi_Kursch
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
scaiocesar
Mas com o System.setProperty não deu certo?
H
H4nsi_Kursch
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
scaiocesar
vc ta usando o axis?
H
H4nsi_Kursch
sim
S
scaiocesar
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:
Isso vai dizer ao Axis para usar uma implementação sua do SecureFactory
Dae voce implementa o MySocketFactory assim:
importjava.io.FileInputStream;importjava.io.IOException;importjava.io.InputStream;importjava.security.KeyStore;importjava.security.SecureRandom;importjava.util.Hashtable;importjavax.net.ssl.KeyManagerFactory;importjavax.net.ssl.SSLContext;importjavax.net.ssl.TrustManagerFactory;importorg.apache.axis.components.net.JSSESocketFactory;importorg.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. * */publicclassMySocketFactoryextendsJSSESocketFactoryimplementsSecureSocketFactory{/** * Constructor MyCustomSSLSocketFactory * * @param attributes */publicMySocketFactory(Hashtableattributes){super(attributes);}/** * Sobrescreve o metodo initFactory para prover a sua implementação * * @throws IOException */protectedvoidinitFactory()throwsIOException{LogVendas.debbuger(this,"\n MySocketFactory.initFactory() \n");try{SSLContextcontext=getContext();sslFactory=context.getSocketFactory();}catch(Exceptione){if(einstanceofIOException){throw(IOException)e;}thrownewIOException(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 */protectedSSLContextgetContext(){try{//Pega o caminho do JKSStringpathJks=path.concat("certificado.jks");LogVendas.debbuger(this,"\n Caminho JKS = "+pathJks);//Obtem a senha do keystorechar[]keystorepass="SenhaJKS".toCharArray();InputStreamkeystoreFile=newFileInputStream(pathJks);KeyStorekeyStore=KeyStore.getInstance(KeyStore.getDefaultType());keyStore.load(keystoreFile,keystorepass);KeyManagerFactorykmf=KeyManagerFactory.getInstance(KeyManagerFactory.getDefaultAlgorithm());kmf.init(keyStore,keystorepass);TrustManagerFactorytmf=TrustManagerFactory.getInstance(TrustManagerFactory.getDefaultAlgorithm());tmf.init(keyStore);// configura um SSLContext usando a keystore SSLContextsslContext=SSLContext.getInstance("SSL");sslContext.init(kmf.getKeyManagers(),tmf.getTrustManagers(),newSecureRandom());returnsslContext;}catch(Exceptione){LogVendas.error(this,e);}returnnull;}}
Veja assim você consegue fazer
A
acmedis
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.