O objetivo deste post é mostrar como proteger as informações confidenciais (ex: login/senha) das aplicações WEB que rodam na sua intranet. Não é necessário comprar um Certificado (ex: verisign.com ou godaddy.com), basta instruir os usuários de como proceder na primeira conexão.
Pré-requisitos:
Sistema Operacional Linux (não testei em outros sistemas), Apache 2 com mod_ssl, OpenSSL e Mod Rewrite…
Passo1: Geração do certificado
Neste passo dois arquivos serão gerados (.key e o .csr). Cuide MUITO BEM deste arquivo .key, ele é a chave privada da segurança do seu servidor. Coloque permissão somente leirura para o usuário root (chmod 400 dominio.com.key). Já o arquivo CSR (Certificate Signing Reques), contém as informações do certificado (Empresa, Estado, etc.) e, também, a chave pública do certificado.
# openssl req -nodes -newkey rsa:2048 -keyout dominio.com.key -out dominio.com.csr
A partir dos arquivos gerados, será criado o arquivo do certificado dominio.com.crt:
# openssl x509 -in cdominio.com.csr -out dominio.com.crt -req -signkeydominio.com.key -days 365
Pronto, seu certificado está gerado!!!
Passo 2: Configuração do apache
É necessário configurar o certificado gerado para o domínio virtual em questão. Dentro do <VirtualHost *:443> (ou algo semelhante), adicione a configuração do certificado:
SSLEngine on
SSLCertificateFile /root/certificados/dominio.com.crt
SSLCertificateKeyFile /root/certificados/dominio.com.key
Verifique as configuracoes com o comando apache2ctl configtest e depois reinicie o servidor. Pronto, você já pode testar:
https://dominio.com
Passo 3: Obrigar conexão segura (HTTPS) para acessar algumas URIs
Muitas vezes você não quer que todo o site fique protegido. Para estes e outros casos, você pode utilizar o mod_rewrite do apache. Vamos para uma configuração simples do apache para as necessidades (por exemplo) do wordpress.
Neste caso, você quer que os usuários acessem o blog utilizando uma conexão normal (não criptografada), porém, ao acessar a área privada, o usuário é obrigado a acessar por via segura (https), protegendo seus dados.
Relembrando, a configuraçao do domínio virtual tem duas entradas, uma para a porta 80 (<VirtualHost *:80> e outra para a porta padrão doHTTPS, a 443 (<VirtualHost *:443>). Precisamos fazer duas configurações: A primeira, deve fazer com que sempre que um usuário acessar wp-admin ou wp-login seja remetido para uma conexão segura. Isso será feiro na porta 80. A segunda configuração, por sua vez, deve ser configurada na porta 443, onde obrigamos o usuário acesssar as páginas não-privadas utilizando uma conexão HTTP normal, não criptografada. Seguem as duas configurações:
<VirtualHost *:80>
…
ServerName dominio.com
…
rewriteEngine On
rewriteRule ^/(.*)(wp-admin|wp-login)(.*)$ https://dominio.com/$1$2$3 [R=301,L]
</VirtualHost>
<VirtualHost *:80>
…
ServerName dominio.com
…
SSLEngine on
SSLCertificateFile /root/certificados/dominio.com.crt
SSLCertificateKeyFile /root/certificados/dominio.com.key
…
rewriteEngine On
rewriteCond %{REQUEST_URI} !^/(.*)(wp-admin|wp-login)(.*)|(.*\.js.*)|(.*\.css.*)$
rewriteRule ^/(.*)$ http://dominio.com/$1 [R=301,L]
</VirtualHost>
Pronto, seu servidor está configurado para aceitar conexoes seguras e forçar com que os usuários utilizem o HTTPS somente nos locais que você definir.