Postado em 11 de novembro de 2014
Configurando SSL no servidor de desenvolvimento (Apache)
Atenção! Essa postagem foi escrita há mais de 2 anos. Na informática tudo evolui muito rápido e algumas informações podem estar desatualizadas. Embora o conteúdo possa continuar relevante, lembre-se de levar em conta a data de publicação enquanto estiver lendo. Caso tenha sugestões para atualizá-la, não deixe de comentar!
Você já deve ter se perguntado como funciona o protocolo HTTPS ou então como configurá-lo na sua máquina.
Antes de levar um sistema ao servidor de produção, é essencial testá-lo em um ambiente o mais semelhante possível ao servidor de produção. Muitas pessoas já perguntaram como é possível disponibilizar uma conexão HTTPS com o localhost do Apache.
Pois bem, hoje vou ensinar como configurar o HTTPS no Apache a partir de um certificado SSL auto-assinado.
Neste exemplo eu estou utilizando uma distro Linux chamada Crunchbang (Debian-based – assim como Ubuntu e Mint), mas deve funcionar em qualquer sistema Unix-like. Para os que usam Windows, infelizmente, vou ficar devendo…
Antes de começar, é importante ter um conhecimento básico do Terminal e o openssl
instalado. Também usarei o gedit
, mas você pode utilizar qualquer alternativa, como vim, nano, kate etc.
Gerando um certificado SSL auto-assinado
Abra o terminal e preste atenção em qual diretório você está. Se estiver com o usuário normal, provavelmente estará na sua home. Os comandos vão gerar os certificados no diretório corrente. Não há problema em gerá-los na sua home, já que esses arquivos servirão apenas para o servidor de testes. Se alguém tiver acesso a eles, nada extraordinariamente ruim deverá acontecer. Mas, enfim, você está avisado! :)
Todos os comandos neste tutorial assumem que você esteja autenticado como root. Para isso, basta utilizar o comando sudo su
, ou apenas su
(dependendo da sua distro).
Vamos começar gerando um certificado SSL de 1024 bits. A sua chave pública será X.509 (PKI). Meus nomes de arquivo serão todos phpit, para ficar mais fácil de visualizar. Você pode utilizar o nome que quiser, mas cuide para não se perder!
Utilize os seguintes comandos:
$ openssl genrsa -out phpit.key 1024 $ openssl req -new -key phpit.key -x509 -out phpit.crt
Guardando o certificado no diretório do Apache
Depois de gerar o certificado e a chave pública, precisamos guardar esses arquivos em um diretório do Apache.
Caso ainda não exista (o que é bastante provável), vamos criar esse diretório.
$ mkdir /etc/apache2/ssl/
Agora é só mover os dois arquivos para o novo diretório:
$ mv phpit.key phpit.crt /etc/apache2/ssl/
Por fim, precisamos gerar um arquivo pem para que nosso certificado seja compatível com todos os navegadores. A diferença entre o arquivo crt e o pem é apenas a extensão, o conteúdo é o mesmo. Vamos então, apenas copiar:
$ cd /etc/apache2/ssl/ $ cp phpit.crt phpit.pem
Configurando o certificado SSL para permitir o tráfego HTTPS na porta 443
Agora precisamos criar um VHost que aceite o tráfego via HTTPS. Para isso, precisaremos do certificado que foi criado.
A porta padrão do HTTP é a 80. Já a porta padrão do tráfego HTTPS é 443. O navegador irá automaticamente trafegar por essa porta quando o protocolo for definido para HTTPS. Caso o servidor não esteja escutando nessa porta, o servidor não receberá os dados.
É bastante provável que o Apache já esteja configurado para escutar na porta 443 mas, por via das dúvidas, vamos conferir o arquivo de portas.
$ cd /etc/apache2/ports.conf
Por padrão, o Apache já vem configurado para escutar na porta 443 caso o mod_ssl esteja habilitado. Você deve ver algo semelhante nesse arquivo:
<IfModule mod_ssl.c> Listen 443 </IfModule>
Se não houver nada semelhante, pode adicionar.
O próximo passo é configurar o caminho dos arquivos de SSL. Aqui vou usar o gedit, mas você pode utilizar o editor que preferir.
$ gedit /etc/apache2/sites-enabled/000-default
Ao acessar o arquivo, você deve ter algo parecido com isso (destaquei as linhas mais importantes):
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory "/var/www/"> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Essa é a configuração para porta 80. Precisamos configurar a porta 443. O que eu fiz foi duplicar o conteúdo do arquivo e apenas modificar a porta 80 para 443, ficando, assim, com VirtualHosts.
Agora precisamos configurar três diretivas (mas só no VHost 443):
SSLEngine
, SSLCertificateFile
e SSLCertificateKeyFile
.
Logo após o fechamento da última declaração de diretório, vamos adicionar as seguintes linhas:
SSLEngine on SSLCertificateFile /etc/apache2/ssl/phpit.pem SSLCertificateKeyFile /etc/apache2/ssl/phpit.key
Com essas três diretivos nós ativamos o SSL apenas para a porta 443 (visto que estamos editando o VHost dessa porta) e apontamos para os dois arquivos do certificado.
Ao final, o arquivo deve ficar mais ou menos assim:
<VirtualHost *:80> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost> <VirtualHost *:443> ServerAdmin webmaster@localhost DocumentRoot /var/www <Directory /> Options FollowSymLinks AllowOverride None </Directory> <Directory /var/www/> Options Indexes FollowSymLinks MultiViews AllowOverride None Order allow,deny Allow from all </Directory> ScriptAlias /cgi-bin/ /usr/lib/cgi-bin/ <Directory "/usr/lib/cgi-bin"> AllowOverride None Options +ExecCGI -MultiViews +SymLinksIfOwnerMatch Order allow,deny Allow from all </Directory> SSLEngine on SSLCertificateFile /etc/apache2/ssl/phpit.pem SSLCertificateKeyFile /etc/apache2/ssl/phpit.key ErrorLog ${APACHE_LOG_DIR}/error.log # Possible values include: debug, info, notice, warn, error, crit, # alert, emerg. LogLevel warn CustomLog ${APACHE_LOG_DIR}/access.log combined </VirtualHost>
Salve o arquivo e estamos prontos.
Agora só resta ativar o módulo SSL no Apache:
a2enmod ssl
Importante (dica do leitor Jardel Rodrigues): se o seu sistema não reconhecer o comando a2enmod
, você deve instalar essa funcionalidade. Em distribuições baseadas em Debian (Mint, Ubuntu, Crunchbag etc.), você pode utilizar o comando apt-get install apache2.2-common
para instalar o pacote básico de funcionalidades do Apache.
Só falta reiniciar o apache:
/etc/init.d/apache2 restart
Para verificar que tudo está OK, você deve tentar acessar https://localhost/.
Pelo fato de o certificado ser auto-assinado, ele não pertence a nenhuma entidade certificadora confiável. Sendo assim, a primeira coisa que o navegador vai acusar é isso. Basta adicionar uma exceção e tudo estará OK para trafegar utilizando criptografia SSL.
Considerações finais
Caso não tenha conseguido fazer funcionar, tente refazer os passos e verificar se fez tudo certinho. Se, mesmo assim, não rolar, deixe um comentário e vamos tentar te ajudar.
Fazia tempo que eu queria escrever um artigo desse tipo, mas nunca tirei tempo para esmiuçar o processo. Espero que possa ajudar vocês a tornarem o ambiente local o mais parecido possível com o servidor de produção.
Um abraço a todos e até a próxima.
Fiquem com Deus.
Rafael Jaques