Mês: abril 2012

Ciphers no JBoss AS 6.1

Postado em Updated on

Em criptografia, um cipher (ou cifra) é um algoritmo para realizar a criptografia ou descriptografia. No JBoss podemos definir quais cifras desejamos utilizar, e por segurança podemos excluir as cifras mais fracas, lembrando que o JBoss não implementa SSL, simplesmente usa a implementação de SSL que é fornecida pela JVM ou OpenSSL(quando o conector de APR é utilizado). Se você estiver usando connector HTTP, então o SSL é implementado através do Java Secure Socket Extension (JSSE).  Para listar as cifras diponíveis na JVM, compile e execute a classe abaixo:


import javax.net.ssl.SSLSocketFactory;

public class DummySSLSocketFactory
 {

   public static void main(String[] args)
   {
      SSLSocketFactory factory = (SSLSocketFactory) SSLSocketFactory.getDefault();
      String[] ciphers = factory.getDefaultCipherSuites();
      for (int i = 0; i < ciphers.length; i++)
      {
        System.out.println(ciphers[i]);
      }
    }
 }

 $ javac DummySSLSocketFactory.java
 $ java DummySSLSocketFactory

 SSL_RSA_WITH_RC4_128_MD5
 SSL_RSA_WITH_RC4_128_SHA
 TLS_RSA_WITH_AES_128_CBC_SHA
 TLS_DHE_RSA_WITH_AES_128_CBC_SHA
 TLS_DHE_DSS_WITH_AES_128_CBC_SHA
 SSL_RSA_WITH_3DES_EDE_CBC_SHA
 SSL_DHE_RSA_WITH_3DES_EDE_CBC_SHA
 SSL_DHE_DSS_WITH_3DES_EDE_CBC_SHA
 SSL_RSA_WITH_DES_CBC_SHA
 SSL_DHE_RSA_WITH_DES_CBC_SHA
 SSL_DHE_DSS_WITH_DES_CBC_SHA
 SSL_RSA_EXPORT_WITH_RC4_40_MD5
 SSL_RSA_EXPORT_WITH_DES40_CBC_SHA
 SSL_DHE_RSA_EXPORT_WITH_DES40_CBC_SHA
 SSL_DHE_DSS_EXPORT_WITH_DES40_CBC_SHA
 TLS_EMPTY_RENEGOTIATION_INFO_SCSV

Para determinar quais cifras serão utilizadas, basta especificar essa informação no atributo “ciphers” do connector HTTP no arquivo JBOSS_HOME/server/all/deploy/jbossweb.sar/server.xml.


<Connector protocol="HTTP/1.1" SSLEnabled="true"
 port="8443" address="${jboss.bind.address}"
 scheme="https" secure="true" clientAuth="false"
 keystoreFile="${jboss.server.home.dir}/conf/example.keystore"
 keystorePass="123456"
 ciphers="SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA"
 sslProtocol = "TLS" />

Para testar o funcionamento do certificado e verificar as cifras habilitadas pode-se utilizar o openssl via linha de comando, já que o JBoss não ofereçe nenhuma ferramenta para essa finalidade. Veja os passos abaixo.

  keytool -genkey -alias example -keyalg RSA -keystore keystore.jks -keysize 2048

 


<Connector port="8443" protocol="HTTP/1.1" SSLEnabled="true" scheme="https"
 secure="true" address="${jboss.bind.address}" clientAuth="false"
 ciphers="SSL_RSA_WITH_RC4_128_MD5,SSL_RSA_WITH_RC4_128_SHA,TLS_RSA_WITH_AES_128_CBC_SHA,TLS_RSA_WITH_AES_256_CBC_SHA,SSL_RSA_WITH_DES_CBC_SHA"
 keystoreFile="${jboss.server.home.dir}/conf/keystore.jks"
 keystorePass="123456" sslProtocol="TLS"/>

Para testar execute:

 openssl s_client -connect localhost:8443 -showcerts

Fonte:

UTF-8 e URIs no JBoss AS 6.1

Postado em Updated on

Como todos vocês devem saber o contêiner web default do JBoss é o Apache Tomcat. Por padrão o Tomcat não utiliza codificação UTF-8 na URI, isso significa que aplicações rodando sob o JBoss que realizam solicitações GET e contém caracteres UTF-8 codificados (caracteres japoneses por exemplo) não serão decodificadas com precisão pelo servidor.

Para corrigir esse problema edite o arquivo:

jboss-6.1.0.Final\server\<profile>\deploy\jbossweb.sar\server.xml

Adicione o atributo URIEncoding=”UTF-8″ no connector desejado. Veja abaixo um exemplo para os connectors HTTP e AJP:


<Connector port="8080" address="${jboss.bind.address}"
  maxThreads="250" maxHttpHeaderSize="8192"
  emptySessionPath="true" protocol="HTTP/1.1"
  enableLookups="false" redirectPort="8443" acceptCount="100"
  connectionTimeout="20000" disableUploadTimeout="true" URIEncoding="UTF-8"/>

<Connector port="8009" address="${jboss.bind.address}" protocol="AJP/1.3"
  emptySessionPath="true" enableLookups="false" redirectPort="8443" URIEncoding="UTF-8"/>

Abraços

Como Utilizar o JBoss na porta 80

Postado em Updated on

Quando iniciei o meu aprendizado no JBoss tive muitas dúvidas e uma delas foi: Como posso rodar o JBoss na porta 80? Depois de algumas pesquisas observei que normalmente existem duas opções:

1 – Iniciar o JBoss como root

Isso não é recomendado em hipótese alguma.
Em sistemas operacionais Linux/Unix é necessário ser root para que as aplicações escutem em portas TCP / UDP abaixo de 1024.

2 – Utilizar o JBoss com o mod_jk, mod_proxy ou mod_cluster

Pode-se utilizar um proxy e redirecionar as requisições para JBoss. Essas soluções já foram abordadas em artigos anteriores.

Existem também alguns balanceadores como:

Na dúvida consulte uma pessoa experiente que possa indicar as melhores práticas.

Abraços

Blogs sobre JBoss em Português

Postado em Updated on

E ai galera blz? Eu sempre acompanho a comunidade JBoss em relação ao artigos, publicações, tutoriais, etc. Vou deixar abaixo a lista de alguns blogs de pessoas que estão fazendo ou fizeram um trabalho bem legal ajudando a comunidade:

Meus parabéns a todos acima. Com a ajuda de vocês a tecnologia JBoss cresce cada vez mais na nossa língua :)

Bom existem muitos brasileiros que contribuem com código, até alguns da lista acima mas tentei citar especificamente o pessoal que escreve artigos.

Acho legal também o trabalho do infoblogs que ajuda a divulgar as publicações e o blog da Caelum que sempre divulga as tecnologias JBoss.

Coloquei somente os que conheço… se esqueci de algum por favor me corrijam que eu adiciono nessa lista :)

Abraços e Obrigado a toda comunidade JBoss da língua Portuguesa.

Horário de Verão e JBoss

Postado em Updated on

Brincadeiras a parte isso é uma das coisas que podem gerar alguns contratempos nos ambientes de produção. Alguns vão dizer que esse post é um pouco atrasado pois já estamos no fim de Abril e o horário já voltou ao normal, mas para futuras consultas vou deixar aqui algumas dicas de como deixar o seu ambiente JBoss preparado para o horário de verão. Por default o JBoss utiliza hora da JVM que por suas vez asssume os valores configurados no timezone do sistema operacional.

Então ai vai a primeira dica: Deixe o seu timezone configurado corretamente, sei que pode parecer uma coisa bem primária mas já observei alguns ambientes em que simplesmente essas configurações não estavam de acordo com os requisitos necessários. Para informações sobre essa configuração no CentOS consulte a documentação.

A segunda dica é uma ferramenta da Sun/Oracle que realiza um teste e verifica se o timezone precisa ser atualizado, essa ferramente se chama Timezone Updater Tool ( tzupdater ), o download pode ser realizado no link abaixo:

http://www.oracle.com/technetwork/java/javase/downloads/tzupdater-download-513681.html

Para utilizar o tzupdater  execute:

 java -jar tzupdater.jar -t

Serão listadas todas as divergências que podem ocasionar problemas.

Para atualizar execute:

 java -jar tzupdater.jar -u

Realize o teste novamente, e verifique se foi corrigido.

A terceira e ultima dica é uma classe que a Sun / Oracle disponibiliza e que testa se o Java fará as mudanças de horário corretamente. Essa classe pode ser visualizada abaixo:


/*
* Timezone test to check that the new US 2007 DST rules have been
* picked up by the JRE. TimeZone used is the default one on OS.
* Sample result :
* $java DSTTest "11/04/2007 0:00 AM"
* JRE version : 1.4.2_13
* Sun Nov 04 00:00:00 EDT 2007
* TimeZone tested : Eastern Daylight Time
* Your tested time is in daylight-savings time.
* $java DSTTest "11/04/2007 3:00 AM"
* JRE version : 1.4.2_13
* Sun Nov 04 03:00:00 EST 2007
* TimeZone tested : Eastern Standard Time
* Your tested time is not in daylight-savings time.
* $echo $TZ
* America/New_York
*
*/

import java.text.ParsePosition;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.TimeZone;

public class DSTTest {
 private static final String DATE_FORMAT_PATTERN = "MM/dd/yyyy hh:mm a";

 public static void main(String[] args) {

 try {

   String ver = System.getProperty("java.version");
   String testDate = args[0]; // "11/04/2007 1:00 AM";

   SimpleDateFormat df = new SimpleDateFormat(DATE_FORMAT_PATTERN);
   Date currentDate = df.parse(testDate, new ParsePosition(0));
   System.out.println("JRE version : " + ver);
   System.out.println(currentDate);
   // Default timezone from the system is used.
   TimeZone tz = TimeZone.getDefault();
   // Could manually set the timezone above. e.g :
   //TimeZone tz = TimeZone.getTimeZone("America/New_York");
   System.out.println("TimeZone tested : " + tz.getDisplayName(tz.inDaylightTime(currentDate), TimeZone.LONG));
   boolean indaylight = tz.inDaylightTime(currentDate);
   System.out.println("Your tested time is " + (indaylight ? "in " : "not in ")  + "daylight-savings time.");
  } catch (Exception e) {
   System.out.println("Error encoutered. Please insure you supply a valid date format pattern.");
   System.out.println("Ensure you've quotes placed around the pattern!");
   System.out.println("e.g java DSTTest \"11/04/2007 1:00 AM\"");
  }
 }
}

Para testar compile e execute a classe passando os parâmetros abaixo:

java DSTTest "02/25/2012 10:59 PM"
java DSTTest "02/26/2012 00:01 AM"

Lembrando que o JBoss precisa ser reiniciado na mudança de horário de verão, para assumir as novas configurações.

Espero que ajude alguém :)

Abraços

Apostila JBoss AS

Postado em

Esses dias dando uma “googleada” encontrei uma apostila bem interessante escrita pelo Fernando Lozano / 4linux. , achei bem legal o conteúdo e bom para que está iniciando no mundo JBoss :)

Segue o Link: Apostila JBoss AS

Estudem :P

Abraços

 

Limitando o Número de Sessões no JBoss AS 6.1

Postado em Updated on

Existe uma maneira bem simples de limitar o número de sessões ( entenda-se usuários ) no JBoss. Para essa finalidade existe o atributo maxActiveSessions  que deve ser adicionado ao context.xml do jbossweb.sar. Siga os passos abaixo:

Edite o arquivo context.xml:

jboss-6.1.0.Final\server\default\deploy\jbossweb.sar\context.xml

Adicione o atributo maxActiveSessions:

<Context cookies="true" crossContext="true">

<Manager pathname="" />

<InstanceListener>org.jboss.web.tomcat.service.NamingListener</InstanceListener>

<Manager maxActiveSessions="2"/>

</Context>

Configuramos o JBoss para ter no máximos dois usuário conectados, quando o terceiro usuário se conectar a exceção “Exception initializing page context java.lang.IllegalStateException: createSession: Too many active sessions” será lançada  gerando o código HTTP 500.

Para realizar os testes tente realizar o login no jmx-console em três navegadores diferente.  Veja abaixo:

  • Google Chrome

  • Mozilla Firefox

  • Internet Explorer

Perceba que com o Google Chrome e Mozilla Firefox o JBoss já possui dois usuários conectados ao tentarmos acessar pelo Interner Explorer a página fica em branco pois o número máximo de sessões foi atingindo.

Caso seja necessário customizar a página de erro, os atributos abaixo devem ser adicionados no web.xml da aplicação desejada:

<error-page>
  <error-code>500</error-code>
  <location>error_500.jsp</location>
</error-page>

<error-page>
  <exception-type>java.lang.IllegalStateException</exception-type>
  <location>error_exception.jsp</location>
</error-page>

Veja abaixo a página customizada:

Espero que tenha ajudado.

Abraços

Postado em

Mauricio Magnani Jr:

Excelente Artigo Sobre JBoss AS 7.
Bruno Rosseto e Rafael Tuelho

Postado originalmente em Rafaeltuelho's Weblog:

Saiu na edição #102 da Java Magazine um excelente artigo sobre as novidades do JBoss AS 7 – A Revolução do JBoss AS 7. Nesta primeira parte do artigo tentamos mostrar as principais novidades da nova versão do JBoss AS. Tópicos como a nova estrutura de diretórios, instalação, novos modos de operação (standalone e domain), novo kernel (100% modular), novos consoles de gerência e configuração foram destaques dessa primeira parte do artigo.

Java Magazine #102 - A Revolução do JBoss AS 7

Adquira seu exemplar e confira em detalhes essas novidades.

;-)

Ver original

Evitando Erros de Deploy no JBoss AS 5.1

Postado em Updated on

Um problema muito comum ao realizar deploy de arquivos no JBoss é que  o deployment scanner  pode tentar implantar a aplicação antes que ela tenha sido totalmente copiada para o diretório de implantação.

A primeira dica é bem simples: Evite realizar deploy de aplicações em máquinas remotas, uma alternativa seria copiar para um diretório local onde o JBoss esteja instalado e em seguida copiar esse arquivo para o diretório de implantação adequado. Eu mesmo por muitas vezes a alguns anos atrás tentava realizar o hot deploy de uma aplicação  WAR de 50 MB  e na época não entendia o por que dos erros. A causa raiz é que por padrão o deployment scanner percorre os diretório de deploy a cada 5 segundos em busca de novas aplicações, caso encontre automaticamente a aplicação é implantada mesmo que não tenha sido totalmente copiada ocasionando erros.

Observando esse cenário podemos escolher entre duas opções: Desabilitar o deployment scanner ou alterar o valor do “Scan Period” dos diretório de deploy.

Para alterar o Scan Period edite o arquivo:


jboss-5.1.0.GA\jboss-5.1.0.GA\server\<profile>\deploy\hdscanner-jboss-beans.xml

E altere o valor da propriedade:


<!-- Frequency in milliseconds to rescan the URLs for changes -->

<property name="scanPeriod">15000</property>

Para desabilitar deployment scanner simplesmente remova o arquivo:

jboss-5.1.0.GA\jboss-5.1.0.GA\server\<profile>\deploy\hdscanner-jboss-beans.xml

Espero que tenha ajudado.

Abraços

Fonte: https://community.jboss.org/wiki/TurnDeploymentScannerDown

Melhorando a Performance da Conexão JDBC no JBoss AS 6.1

Postado em Updated on

A alguns meses atrás fiquei curioso sobre como melhorar a performance de conexões JDBC que utilizam o data source no JBoss. Pesquisando a documentação acabei encontrando alguns parâmetros (tcpSndBuf, tcpRcvBuf, tcpNoDelay) que ajudam a “tunar” as conexões JDBC.

Uma conexão JDBC por baixo dos panos, nada mais é que um soquete, portanto podemos aplicar os mesmos conceitos de performance aplicados aos sockets do sistema operacional, como por exemplo quando manipulamos o tamanho do buffer TCP para que seja maior que o padrão (32 KB). Podemos dizer as nossas conexões que utilizem valores superiores, veja como isso pode ser utilizado no data source do JBoss:

<datasources>
<local-tx-datasource>
<jndi-name>MySqlDS</jndi-name>
<connection-url>jdbc:mysql://localhost:3306/test</connection-url>
<driver-class>com.mysql.jdbc.Driver</driver-class>
<user-name>root</user-name>
<password>123456</password>

    <connection-property name="tcpSndBuf">64000</connection-property>
    <connection-property name="tcpRcvBuf">64000</connection-property>
    <connection-property name="tcpNoDelay">true</connection-property>

<metadata>
     <type-mapping>mySQL</type-mapping>
</metadata>
  </local-tx-datasource>
</datasources>
Uma ressalva é de que algumas propriedades como essas dependem dos providers dos drivers JDBC.
Abraços