Configurando SSL no servidor de desenvolvimento (Apache)

Configurando SSL

Configurando SSL no servidor de desenvolvimento (Apache)

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

  • Mario

    Excelente POST.

    Isso era algo que sempre me gerou dúvida! Como fazer meu servidor rodar https.

    Muito obrigado.

    Abraços.

  • Erus

    Muito obrigado pelo post!!
    Vou tentar fazer aqui no meu ambiente!!

  • Jardel Rodrigues

    Rafael ótima postagem !

    Uma dica:
    apt-get install apache2.2-common
    (tive que fazer esta instalação para o comando a2enmod ssl funcionar)

    • Eduardo Mendes da Costa

      Show.. obrigado.

  • Lucas

    Opa, tudo bom?
    Tentei fazer esse tutorial para um trabalho da faculdade, porem aparece um erro quando reinicio o apache.
    Já refiz duas vezes e aparece o mesmo erro. Diz que o arquivo .pem não existe ou está vazio.

    Mensagem de erro:
    * Restarting web server apache2 [fail]
    * The apache2 configtest failed.
    Output of config test was:
    AH00526: Syntax error on line 57 of /etc/apache2/sites-enabled/000-default.conf:
    SSLCertificateFile: file ‘/etc/apache2/ssl/phpit.pem’ does not exist or is empty
    Action ‘configtest’ failed.
    The Apache error log may have more information.

    O arquivo .pem não está vazio e está na pasta ssl.

    Se puder me ajudar, fico muito grato.
    Abraço.

    • E aí Lucas. Tudo bem?
      Na verdade, o problema está no nome do arquivo. Você criou seus arquivos com o nome “phppit”, ou seja, tem um “P” a mais ali.
      Corrige isso que deve resolver o teu problema.

      Abraços!

      • Lucas

        E ai , tudo bom?
        Obrigado por responder!

        Deu certo heheh, pura falta de atenção minha. Certamente iria demorar um tempo até eu perceber que os nomes estavam errado.

        Muito obrigado!
        Abraço.

  • Ótimo post, o passo a passo foi perfeito, direto ao ponto sem deixar de lado os detalhes importantes… Funcionou direitinho!

  • Eduardo Mendes da Costa

    Oi, como vai? Gostaria de agradecer a simplicidade do artigo. Sou desenvolvedor PHP e JS. Ultimamente estou estudando mais o boom dos frameworks js e conceitos de web app, mas vou precisar subir um servidor de testes em casa e rodar ssl para sites de testes.

    No Windows eu já descobri como fazer, mas no dia a dia eu uso OSX e o servidor que ficará online pra testes pretendo deixar um ubuntu mesmo..

    Com o seu artigo acredito que conseguirei recursos para fechar a instalação nas 3 plataformas..

    Ainda não tentei fazer mas já li, entendi o processo, e salvei seu artigo nos favoritos rsrs..

    Mais uma vez, muito obrigado pela sua contribuição.

    Sucesso.

  • joao cesar

    Seguindo certinho, o passo a passo, sem querer inventar……….. funfou legal.!!! Parabens!!!!