Programação

Bysutradi

JMeter – Erro de SSL “Certificates does not conform to algorithm constraints”

O JMeter é uma ferramenta muito útil no processo de teste de software. Permite que façamos testes de stress/carga em aplicações.

Quando criamos nossos casos de teste, é comum atualmente que os testes sejam realizados em aplicações que rodam sobre SSL. Neste caso, um certificado criado corretamente faz certa diferença quando usado o JMeter.

O caso de teste pode ser criado manualmente, ou através da captura de navegação através de uma configuração de “Servidor HTTP Proxy” e um “Recording Controller” (acho que vale um artigo sobre como fazer isso).

Quando se usa este recurso, o JMeter cria alguns arquivos no diretório “bin”:

  • ApacheJMeterTemporaryRootCA.crt
  • ApacheJMeterTemporaryRootCA.usr
  • proxyserver.jks

Sendo assim, quando o desenvolvedor executa o teste localmente, não ocasionam em erros de SSL. Porém, quando o caso de teste é executado em outro equipamento, possivelmente ocorrerão erros sobre “Certificates does not conform to algorithm constraints”.

O erro de SSL “Certificates does not conform to algorithm constraints” pode ocorrer quando o certificado não está em conformidade com alguns padrões esperados pela JVM, ocasionando o erro abaixo.

javax.net.ssl.SSLHandshakeException: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints
at …
at java.lang.Thread.run(Unknown Source)
Caused by: java.security.cert.CertificateException: Certificates does not conform to algorithm constraints
at sun.security.ssl.AbstractTrustManagerWrapper.checkAlgorithmConstraints(Unknown Source)
at sun.security.ssl.AbstractTrustManagerWrapper.checkAdditionalTrust(Unknown Source)
at sun.security.ssl.AbstractTrustManagerWrapper.checkServerTrusted(Unknown Source)
… 24 more

​Solução

Há algumas maneiras de resolver este problema. Uma delas, talvez a mais simples/rápida, é alterar propriedades no java.security da JVM onde o JMeter está executando.

Edite o arquivo <JRE>\lib\security\java.security e alte​re as propriedades abaixo:

#jdk.certpath.disabledAlgorithms=MD2, MD5, RSA keySize < 1024
jdk.certpath.disabledAlgorithms=
#jdk.tls.disabledAlgorithms=SSLv3, RC4, MD5withRSA, DH keySize < 768
jdk.tls.disabledAlgorithms=​

Estas configurações fazem com que a JVM aceite qualquer certificado.​

Referências:

Apache JMeter

 

Bysutradi

Como usar Log em aplicações

O uso de Logs em aplicações é uma boa prática para apoiar a equipe de desenvolvimento a encontrar ocorrências (erros) apontadas pelos usuários. Neste ponto não abordarei a prática do TDD, ok?

Pensando no uso do Log4J, um dos principais frameworks de Log, você sabe usar os tipos mensagens que podem ser apresentadas e usá-las de uma forma a ajudá-lo?

Vejam abaixo alguns pontos sobre os principais usos.

INFO

O nível INFO é utilizado para informar eventos significativos do ciclo de vida normal da aplicação. Exemplo:

LOG.info("Conta para o CPF " + cpf + " foi cadastrada com sucesso pelo usuário " + usuario);
LOG.info("SMS enviado com sucesso para o cliente " + cpf);

DEBUG

O nível DEBUG é normalmente utilizado como um complemento ao nível INFO como, por exemplo, parâmetros de um determinado método ou resultado de uma operação que pode ser importante para o rastreamento de problemas na aplicação. Exemplo:

// no início do método
LOG.debug("salvarConta(" + cpf + ", " + usuario + ")");

// no fim do método
LOG.debug("salvarConta finalizado em " + tempo + " milisegundos");

ERROR

O nível ERROR é utilizado mais freqüentemente, normalmente seguindo uma Java Exception. Essas condições de erro, não necessariamente causam o término anormal da aplicação, sendo que a aplicação pode continuar atendendo às próximas requisições normalmente. Exemplo:

// Dentro de um catch
LOG.error("Erro na tentativa de salvar a conta para o CPF " + cpf + ". Erro: " + exception);

WARN

O nível WARN indica problemas de menor gravidade, normalmente causados por fatores externos, como falta ou inconsistência de parâmetros passados pelo usuário. Exemplo:

LOG.warn("O parâmetro CPF não foi preenchido");

LOG.warn("A Mensagem " + nomeMensagem + " deveria ter 120 caracteres, mas veio com 118");

Exemplo prático

Suponhamos que temos a regra “Ao cadastrar a conta, enviar SMS para cliente.”, a implementação seria algo como:

// Início do método salvarConta
LOG.debug("salvarConta(" + cpf + ", " + usuario + ")");
try {
// Cadastrar Conta
LOG.info("Conta para o CPF " + cpf + " foi cadastrada com sucesso pelo usuário " + usuario);
// Enviar SMS
LOG.info("SMS enviado com sucesso para o cliente " + cpf);
} catch (ExceptionNegocio en) {
// Tratar aqui também com WARN, DEBUG ou ERROR
} catch (Exception exception) {
LOG.error("Erro na tentativa de salvar a conta para o CPF " + cpf + ". Erro: " + exception);
}
LOG.debug("salvarConta finalizado em " + tempo + " milisegundos");
// Fim do método salvarConta

Claro, a forma de uso pode ser mais refinada para cada projeto.

Bysutradi

Uso de Namespaces e Schemas a partir do Java EE 7

Lendo uma questão em uma comunidade JAVA sobre namespace, fiquei curioso com o namespace.

Qual o namespace do JSF devo utilizar. Nas bibliografias consultadas é utilizado o namespace: http://java.sun.com/jsf/html. Porém percebi que também existe o http://xmlns.jcp.org/jsf/html.

Fazendo uma consulta rápida, a Oracle apresenta que a partir do Java EE 7, os novos schemas estarão contidos no namespace http://xmlns.jcp.org/xml/ns/javaee/, mantendo os antigos no namespace http://java.sun.com/xml/ns/javaee/.

Referência: http://www.oracle.com/webfolder/technetwork/jsc/xml/ns/javaee/index.html

Bysutradi

Alterar o posicionamento do componente growl do PrimeFaces

O componente growl, por padrão, é exibido no canto superior direito. As definições de estilo dos componentes do PrimeFaces ficam no arquivo primefaces-3.5.jar, no arquivo META-INFresourcesprimefacesprimefaces.css.

Para alterar o local de apresentação na tela, você precisa apenas redefinir o CSS abaixo.

<h:head>
<style>
.ui-growl{
	position:fixed;
	top:50%;
	right:50%;
	width:301px;
}
</style>
</h:head>