Configurando SSL/TLS no JBoss/Tomcat

Segurança sempre soa como uma falácia na maioria dos projetos de software. É como aquele pessoal que não gosta ou não sabe testar: eles sabem que a coisa existe e que é preciso ou muito recomendável a usar, mas no fim das contas dão de ombros e se funcionar funcionou.

Isso acontece muito quando o âmbito é segurança. Qual cliente ou usuário não se preocupa com segurança? Ao menos um controle de acesso com autenticação através de usuário e senha eles sempre exigem. E qualquer desenvolvedor que se preze se preocupa com isso.

Quando pensamos em segurança em aplicações Java temos que conhecer bem como funciona a arquitetura de segurança da plataforma Java, que é bem completa a útil. A divisão se dá em três “áreas” distintas, que são: JCA – Java Cryptography Architecture – Define classes e interfaces que são responsáveis por trabalhar com criptografia e descriptografia de dados e informações; JSSE – Java Secure Socket Extension – Usa a JCA para criar conexões seguras para troca de dados e informações; e JAAS – Java Authentication and Authorization Service – Responsável por autenticação e autorização nas aplicações Java. Neste post vou abordar somente um pouco do JSSE, para saber mais sobre JAAS veja no arquivo do blog.

O SSL (Secure Socket Layer) e o TLS (Transport Layer Security) são protocolos criptográficos usados para garantir a comunicação segura entre serviços de internet. Não vou entrar em detalhes sobre os protocolos e nem nas suas diferenças, para maiores informações sugiro esta leitura.

A necessidade fundamental de uma implementação com SSL é garantir a privacidade e integridade dos dados trafegados entre as aplicações que estão se comunicando. E isso é realizado através da autenticação das aplicações e da utilização de algoritmo criptográfico nos dados que estão sendo trafegados.

Dizer isso é meio bonitinho mas ninguém consegue compreender como isso ocorre de verdade, o que acontece por “por baixo dos panos”. Vamos imaginar um cliente utilizando um browser qualquer para acessar uma aplicação instalada num servidor JBoss, com certificado SSL implantado. Quando a comunicação entre eles é iniciada o servidor envia uma chave pública ao browser, que usa esta chave para criar uma chave privada temporária que é enviada de volta ao servidor. Desta forma as duas partes, servidor e browser, usarão estas chaves para estabelecer uma comunicação segura. Para saber mais sobre chaves públicas, privadas, criptografia simétrica e assimétrica veja a minha apresentação sobre certificação digital.

Vamos então por a mão na massa e configurar a aplicação.

Criando as chaves

Usaremos o keytool para criar um keystore e nele armazenar as chaves.

1
keytool -genkey -keystore jeve.keystore -storepass jevepass -keypass jevepass -keyalg RSA -alias jeve_key -validity 3650 -dname "cn=Jeveaux,ou=Jeveaux,c=Vitoria,s=ES,c=BR"

Detalhamento do comando:

  • keytool: comando
  • -genkey: parrâmetro para criação das chaves
  • -keystore: indica o caminho/nome do keystore (jeve.keystore)
  • -storepass: indica a senha do keystore (jevepass)
  • -keypass: indica a senha da chave (jevepass)
  • -keyalg: indica o algoritmo de criptografia utilizado (RSA)
  • -alias: indica o nome da chave a ser criada dentro do keystore (jeve_key)
  • -validity: Validade do certificado em dias (3650)
  • -dname “[…]”: Informações do certificado (CN = nome comum, OU = unidade organizacional (departamento, divisão), O = nome da organização, L = nome da localidade (cidade), S = estado, C = código do país)

Próximos passos, informar ao JBoss/Tomcat onde está o keystore e qual chave usar.

Instalando as chaves

Basicamente temos que copiar o arquivo do keystore, gerado no passo anterior, para o JBoss. O ideal seria em:

1
$JBOSS_HOME/server/default/conf

Configurando o JBoss ou o Tomcat

Trabalharemos agora no arquivo server.xml para configurar qual keystore usar. Este é um arquivo de configuração do Tomcat.

Se você estiver usando JBoss:

1
$JBOSS_HOME/server/default/deploy/jbossweb.sar/server.xml

Se estiver usando Tomcat:

1
$TOMCAT_HOME/conf/server.xml

Procure por um comentário semelhante a este:

1
2
3
4
<!-- Define a SSL HTTP/1.1 Connector on port 8443
This connector uses the JSSE configuration, when using APR, the
connector should be using the OpenSSL style configuration
described in the APR documentation -->

Haverá um trecho do arquivo comentado logo abaixo, vamos retirar os comentários e ativar este trecho de código. Ajustando as propriedades adequadas chegaremos em algo próximo disso:

1
2
3
4
5
6
7
<Connector protocol="HTTP/1.1" SSLEnabled="true"
          port="8443" address="${jboss.bind.address}"
          maxThreads="100" strategy="ms" maxHttpHeaderSize="8192"
          emptySessionPath="true"
          scheme="https" secure="true" clientAuth="false"
          keystoreFile="${jboss.server.home.dir}/conf/jeve.keystore"
          keystorePass="jevepass" sslProtocol = "TLS" />

Os pontos mais importantes são: port, keystoreFile e keystorePass, que são responsáveis por, respectivamente, definir a porta para utilização do SSL, qual o arquivo contém as chaves e qual a senha do arquivo que contém as chaves.

Neste ponto já conseguimos utilizar a aplicação através do protocolo HTTPS, basta acessar:

1
https://localhost:8443/aplicacao

Configurando a aplicação

Até aqui a aplicação está disponível tanto através de HTTP quando através de HTTPS. Em algumas situações isso é desejado, em outras não. Existem casos onde precisaremos que algumas partes ou módulos da aplicação só funcionem com HTTPS e outras situações que toda a aplicação responda somente sob HTTPS, e ambas são possíveis de serem atendidas, veremos.

1
2
3
4
5
6
7
8
9
    <security-constraint>
        <web-resource-collection>
            <web-resource-name>app-name</web-resource-name>
            <url-pattern>/*</url-pattern>
        </web-resource-collection>
        <user-data-constraint>
            <transport-guarantee>CONFIDENTIAL</transport-guarantee>
        </user-data-constraint>
    </security-constraint>

Inserindo este trecho no seu web.xml nós faremos com que a aplicação inteira responda apenas sob protocolo HTTPS.

Importando um certificado válido

Tudo foi feito utilizando um certificado fictício e poderá correr assim durante o desenvolvimento, não há problema algum. Mas em produção este certificado terá o mesmo valor que uma nota de um cruzado novo. Então você, ou sua empresa, farão a aquisição de um certificado válido através de um autoridade certificadora e, quando isso ocorrer importaremos o certificado válido para nosso keystore, utilizando a mesma ferramenta que usamos para criar o certificado anterior (keytool) vejamos:

1
keytool -import -alias jeve_key -keystore $JBOSS_HOME/server/default/conf/jeve.keystore -trustcacerts -file $ENDERECO_DO_CERTIFICADO_VALIDO/certificado_valido.cer

E pronto, certificado válido importado e comunicação segura garantida.


5 comentários sobre “Configurando SSL/TLS no JBoss/Tomcat

  1. Fala Jeveaux´s blz?

    Como diz a Regina Casé : “facim, facim”…

    Agora, e pra deixar o os dois protocolos (http e https) respondendo na mesma porta, tem como?

  2. Luiz,

    Eu não estou certo se é possível fazer alguma configuração como esta no JBoss e nem em outro web server. Eu já trabalhei certa vez para fazer o Apache HTTP Server redirecionar as requisições HTTP na porta 80 para HTTPS na porta 443, mas fiz usando o mod_rewrite, foi até relativamente simples. Não é exatamente o que você quer, mas talvez já ajude.

    Abraço,

  3. Ola Jeveaux,

    Muito bom o seu tutorial, no meu caso estou desesperado para fazer uma autenticacao via cliente, ou seja, quero que o cliente so acesse a aplicacao se tiver o devido certificado instalado, ja fiz todos os passos descritos acima, porem usando o keyman para geracao das chaves e keystores, sera que voce poderia me dar uma ajuda? so falta implementar a parte cliente, que nao tenho idéia de como fazer e nao encontro material na net explicando…

    Abraços

    André

  4. Oi Jeveaux, muito bom o seu tutorial, ajudou bastante no processo para adicionar certificação digital em minhas aplicações….
    Agora direcionando um pouco para o lado de certicação digital no JBoss, você sabe se eu conseguo com essas configurações atráves da API java.security.cert.X509Certificate, buscar informações de um certificado digital do TIPO A3(Token)?

  5. Bom dia Jeveaux!
    Muito bom seu tutorial! Mas estou com um problema que está difícil de solucionar!
    No meu trabalho existe uma aplicação que quando tento executar aparece a seguinte mensagem de erro no browser:

    Ocorreu um erro durante uma conexão com xx.xx.xx.xx:8283. O SSL recebeu um registro que excedia o comprimento máximo permitido. (Código do erro: ssl_error_rx_record_too_long)

    A página que você está tentando abrir não pode ser exibida porque a autenticidade dos dados recebidos não pôde ser comprovada.
    Por favor, contate os responsáveis pelo site para informá-los sobre este problema. Você também pode usar comando localizado no menu Ajuda para reportar o site como incompatível.

    Já fiz check em várias coisas e parece estar tudo ok! O sistema foi desenvolvido em outro local, e os desenvolvedores insistem em dizer que o problema está no meu ambiente.

    Poderia me ajudar?
    Desde já obrigado!!

Deixe uma resposta

O seu endereço de email não será publicado. Campos obrigatórios são marcados com *