Configurando SSL no servidor de desenvolvimento (Apache)

Configurando SSL

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 vimnanokate 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):

SSLEngineSSLCertificateFile 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