segunda-feira, 28 de janeiro de 2013

Configurando SSL no Apache Tomcat

Olá, hoje vamos fazer uma atividade relativamente simples: ativar o suporte a SSL no Tomcat. Observe que há duas etapas distintas, uma que resolve para você continuar a desenvolver seja lá o que for sem maiores complicações e outra relacionada à produção. Esta última depende da contratação dos serviços de uma Autoridade de Certificação, e como não me deram dinheiro pra escrever isso vou deixar você escolher uma, :-)

O ambiente que usaremos segue:

Efetue o download do tomcat mais recente (à época da escrita do artigo era o 7.0.26) e salve em lugar conhecido. Dê preferência à versão .tar.gz, que vem preparada para funcionar em qualquer lugar.

Resolva a forma como você vai instalar o jdk; aqui irei fazer o download dele.

Visando comodidade, pois usarei o terminal para fazer o trabalho, abra um terminal e entre com os seguintes comandos:

cd ~
echo "source /etc/profile" >> .bashrc
echo "export TOMCAT_HOME=\$HOME/Downloads/apache-tomcat-7.0.26" >> .bashrc
echo "export PATH=\$PATH:\$TOMCAT_HOME/bin" >> .bashrc

Estou presumindo que seus downloads vão para a pasta Download. Se assim não for, ajeite os echos acima.

Feito isso, ainda neste terminal entre na pasta de downloads e descompacte o tomcat que você baixou:

cd ~/Downloads
tar xvf apache-tomcat-7.0.26.tar.gz

Agora (ainda no mesmo terminal) vire root e instale o pacote do jdk:

su
# pede senha...
installpkg jdk-6u25-x86_64-1.txz

E parabéns campeão, seu slack está armado e perigoso com java e tomcat.

Vamos tratar do SSL propriamente dito: o tomcat tem um conceito chamado Connector para representar, em termos gerais, as portas e os protocolos que o tomcat atenderá. iremos descomentar e habilitar o conector SSL, fornecendo em seguida toda a estrutura necessária ao funcionamento do mesmo. Com o terminal ou um editor gráfico que você goste, (tem o gvim e o kate para você escolher) abra o server.xml do tomcat. (pode usar o comando abaixo do terminal se estiver com problemas para encontrar o server.xml):

gvim $TOMCAT_HOME/conf/server.xml

Virá algo parecido com isso:

O conector encontra-se comentado lá na linha 85:


Descomente-o e adicione um novo atributo, o keystorePass com uma senha que você deve inventar. eu usarei segredo. Ficará assim:


Em seguida, abra um novo console e crie o keystore com os seguinte comando:

keytool -genkey -keysize 2048 -keyalg RSA -alias tomcat

Este comando dispara em seu console o seguinte diálogo interativo, que irá lhe perguntar algumas coisas. Em negrito o que eu escrevi como respostas:

Enter keystore password:  
Re-enter new password: 
What is your first and last name?
  [Unknown]:  www.energeticdance.com
What is the name of your organizational unit?
  [Unknown]:  www.energeticdance.com
What is the name of your organization?
  [Unknown]:  www.energeticdance.com
What is the name of your City or Locality?
  [Unknown]:  Fortaleza
What is the name of your State or Province?
  [Unknown]:  Ceara
What is the two-letter country code for this unit?
  [Unknown]:  BR
Is CN=www.energeticdance.com, OU=www.energeticdance.com, O=www.energeticdance.com, L=Fortaleza, ST=Ceara, C=BR correct?
  [no]:  yes

Enter key password for <tomcat>
	(RETURN if same as keystore password):  

Pontos importantes:

  1. A senha não foi ecoada, mas eu escrevi segredo, a mesma senha que coloquei na configuração do tomcat.
  2. Quando ele pergunta "What is your first and last name?", não coloque seu primeiro e último nome. Este campo é o Common Name (CN) e se você estiver assinando pra valer (um website externo de produção, por exemplo) aí vai o nome do domínio que foi registrado. Mais sobre este assunto a seguir.
  3. Quando ele perguntar Enter key password for <tomcat> dê enter mesmo, o keystore e o alias tomcat devem ter a mesma senha. O tomcat conseguirá esta senha tranquilamente.

Não fornecemos o nome do keystore, o que significa dizer que um arquivo chamado .keystore (atenção no ponto na frente do nome) foi criado no diretório do usuário, que é o lugar padrão para estas cosias. O tomcat também saabe lidar com isso, só a senha que deixar padrão é esculhambação total.

Não vá perder ou apagar este arquivo, ele é crítico para os passos seguintes.

Caso você deseje apenas um tomcat para testes pequenos, está feito todo o trabalho. dê startup.sh no console:

Veja o tomcat no navegador:

Agora veja como está o SSL (em uma nova aba coloque o endereço https://localhost:8443/):

Como o seu navegador não é bobo nem nada, ele bloqueou o acesso a este site cujo certificado não é reconhecido por nenhuma das autoridades certificadoras. Se a sua necessidade termina aqui, selecione "I Understand the Risks" e adicione a exceção:

Veja como fica:

Se o seu assunto é mais sério, continue lendo.

No exemplo de criação do .keystore, utilizei o host fictício www.energeticdance.com no Common Name e onde mais pude escreve-lo. Vamos supor que eu tenha um webhosting com este nome, uma máquina EC2 da Amazon, por exemplo. Neste caso, desejo que meu website tenha conexão segura porque planejo subir uma lojinha já, webcommerce, essas coisas.

Assim sendo, devo agora conseguir um certificado reconhecido de verdade, daqueles que os navegadores de internet adicionam sinais visuais para que você saiba que a conexão é segura de verdade, nada de ficar implorando aos seus usuários para adicionar exceção de segurança. Coisa antiprática isso. Além de não inspirar confiança em quem planeja lhe fornecer os números do cartão de crédito, :-)

O primeiro passo para requisitar um certificado de verdade, apenas insistindo para você não esquecer, é ter uma máquina de verdade na grande rede com um domínio registrado. Quer registrar um ssl para www.bozo.com, mas não tem direitos sobre este domínio ou máquina que atende pelo mesmo, esqueça, resolva isso primeiro.

O segundo passo é ter um servidor de emails funcional (SMTP) atendendo neste endereço, por um motivo muito simples: uma das técnicas de confirmação dos seus direitos sobre este host que você pretende registrar é o envio de um email de confirmação para uma conta nesta máquina. Lamento dizer que configurar um sendmail ou postfix e uma maneira limpa de checar estes emails no host foge muito do que pretendo aqui, mas saiba que pode ser necessário. Não confirmo que todos os CA's vão exigir isso, mesmo porque não registrei certificado em todos eles, mas é uma técnica comum então esteja preparado.

O terceiro é coçar os bolsos. Estes certificados são pagos, então esteja ciente desde já. Mais ainda, a flutuação de preço é enorme! uma busca rápida no google por ssl pricing vai te ofertar toda sorte de preços. Vai de menos de 10 doletas até obscenos 400 dólares, isso para as modalidades mais ordinárias (domínio único) de certificação.

Dito isto, de volta ao trabalho. Novo console, entre com o seguinte comando:

keytool -certreq -keyalg RSA -alias tomcat -file tomcat.csr

Pronto, geramos a requisição de certificado:

Este arquivo tem um propósito simples, a autoridade certificadora vai requisitar o upload disto. Não tem detalhamento maior porque muda dependendo de quem você sorteou lá na busca do google (dica: busque cheap ssl que ajuda, hehe) pra comprar o certificado.

Não muito tempo depois, você receberá um email para confirmar a identidade do site (daí a estória do servidor de email) e em seguida um aquivo, normalmente um zip anexado, com o certificado raíz, o intermediário e o seu certificado homologado, ou coisa que o valha.

Há variação de uma Autoridade Certificadora para outra, em alguns pontos a documentação e o suporte de quem você tiver contratado será importante, mas o principal é o que vem abaixo. No meu exemplo eu recebi os certificados do meu host fictício usado nos exemplos anteriores, um aquivo zip chamado www_energeticdance_com.zip; Salve em diretório conhecido e descompacte:

cd ~/Downloads
unzip -d www_energeticdance_com www_energeticdance_com.zip
Archive:  www_energeticdance_com.zip
www_energeticdance_com/AddTrustExternalCARoot.crt
www_energeticdance_com/PositiveSSLCA2.crt
www_energeticdance_com/www_energeticdance_com.crt

Agora importe cada um deles para dentro do seu keytool:

cd ~
keytool -import -trustcacerts -alias root -file ~/Downloads/www_energeticdance_com/AddTrustExternalCARoot.crt
Enter keystore password:  
Certificate already exists in system-wide CA keystore under alias 
Do you still want to add it to your own keystore? [no]:  yes
Certificate was added to keystore

Este foi o raiz e como o keytool lhe alertou ele existe no keystore da jvm. Adiante, e aproveite o mesmo console.

keytool -import -trustcacerts -alias INTER -file ~/Downloads/www_energeticdance_com/PositiveSSLCA2.crt
Enter keystore password:  
Certificate was added to keystore

Esta foi a importação do intermediário, note o -alias diferente. Por fim, o certificado do seu host:

keytool -import -trustcacerts -alias tomcat -file ~/Downloads/www_energeticdance_com/www_energeticdance_com.crt 
Enter keystore password:  
Certificate reply was installed in keystore

Com isso este keytool irá fazer seu tomcat responder com as chaves corretas quando uma conexão segura for negociada. Recomendo bakcup imediato deste keytool.

Agora seu host é um domínio respeitável da internet, reconhecidamente seguro, hehe.

Espero que estes guia seja útil, embora deixe a parte de qual serviço contratar totalmente à sua escolha. Os passos não mudarão muito de um fornecedor para outro, no fim quem realmente vai resolver é você, :-)

Sem mais, até outra hora.

Nenhum comentário :

Postar um comentário