segunda-feira, 4 de fevereiro de 2008

Conexão segura - Apache2 + OpenSSL no Linux

Com certeza falei neste blog e no meu outro que sempre quis montar uma estação de trabalho para web development bacana em Linux.

Batalhei bastante com isso, mas nunca de forma contínua. Sempre foram de saltos, afinal também preciso estudar, trabalhar e dividir minhas atenções com entes queridos.

Para mim a estação de desenvolvimento ideal é aquela que simula os recursos disponíveis nos servidores. Então além de um servidor web, também deve ter um servidor de e-mail, interpretadores de código (PHP, Perl, Python...), container Java (Tomcat), servidores de bancos de dados (MySQL, Postgre), e por aí vai... Além de ferramentas que ajudem em outras funções, como programar (Eclipse, Quanta Plus, Bluefish) e criar layouts (GIMP, Inkscape)...

Faz um tempão que eu estava querendo colocar aqui SSL, para simular ambientes de produção onde se reproduzem operações seguras, em geral financeiras; hoje realizei. Passei o final da tarde da segundona de carnaval aprontando essa e vou compartilhar aqui com vocês.

O ambiente: Ubuntu 6.06 + Apache 2 (instalado pelo Synaptic) + OpenSSL (também instalado pelo Synaptic).

Creio que as únicas diferenças significativas aqui para que este tutorial se torne válido para outros sabores do GNU/Linux, e formas de instalação (via pacotes RPM, compilando na unha, por outro gerenciador de pacotes) são:
- a localização de alguns arquivos e paths;
- a instalação pelo Synaptic deixa o httpd.conf bem fragmentado. Citarei vários arquivos aqui que nada mais são que partes do httpd.conf que foram separadas.

Bem vamos ao desafio:
Quero que uma parte do site seja pública (passando por uma conexão comum) e outra privada (passando por SSL).

Então criei um diretório para o site e dois subdiretórios, assim:
/var/www/meusite/
/var/www/meusite/public/
/var/www/meusite/private/

Quero que a parte pública seja acessada como "http://www.meusite.com/" e que a parte privada seja acessada como "https://secure.meusite.com/

O primeiro passo é instalar os pacotes. Deixo isso por sua conta o que importa é ter o Apache 2.0 e o OpenSSL instalados. Tem muitos tutoriais de como se fazer isso e como não vou reinventar a roda, dê uma boa lida nas documentações. Estes tutoriais aqui podem dar uma simplificada na sua vida: este e este.

O que interessa é dividir o site em duas partes. Edite o arquivo /etc/hosts. Acrescente lá os sites que você quer. Eu acrescentei as linhas:

127.0.0.1 meusite www.meusite.com
127.0.0.1 secure.meusite secure.meusite.com


E dê uma conferida no arquivo "/etc/host.conf", ele deve conter uma linha assim:

order hosts,bind


Isso significa que quando uma requisição for feita, sua máquina olhará primeiro no arquivo hosts que acabamos de editar, depois vai para os resolvedores de nome. Isso é o que permite que você possa ter e acessar um site com o nome www.algumacoisa.com no seu PC sem conflitar com um da internet (note que se você nomear o site com algum nome existente como google.com, por exemplo - você não conseguirá mais acessar este site pelo nome, já que o arquivo /etc/hosts vai resolver ele antes de procurar nos resolvedores de nome!).

Agora para configurar os virtual hosts no Apache.
Para o parte pública acrescente:

<VirtualHost *>
ServerName www.meusite.com
DocumentRoot /var/www/meusite/public
</VirtualHost>


No httpd.conf ou no arquivo /etc/apache2/sites-available/default
Se você criou o arquivo /etc/apache2/sites-available/ssl
acrescente isso como conteúdo dele:

NameVirtualHost *:443
<VirtualHost *:443 >
ServerName secure.meusite.com
DocumentRoot /var/www/meusite/private

SSLEngine On
SSLCertificateFile /etc/apache2/ssl/apache.pem
</VirtualHost>


Ou acrescente isso depois dos outros virtual hosts comuns.

Isso deve dar conta do recado.
Confira se você não esqueceu de colocar a porta 443 na escuta. No httpd.conf ou no ports.conf deve estar uma linha assim:

Listen 443


Também não esqueça de gerar e corrigir os nomes e paths dos certificados.

Se tudo der certo, depois de você reiniciar o Apache, abra um navegador e digite:
http://www.meusite.com/
https://secure.meusite.com/

E veja o resultado =]

Até mais.
-----------
keepReading