Configurar subdomínio HTTPS com Apache no Ubuntu

Muitas vezes você contrata um VPS (Virtual Private Server) e coloca uma aplicação lá para rodar. Pode ser que essa aplicação comece a crescer e você precisa criar novos módulos ou então decide adicionar novas aplicações, eis então que surge a necessidade da configuração de subdomínios.

Nesse artigo, vou descrever a minha experiência configurando um subdomínio HTTPS e veremos todos os passos para fazer a configuração. Todo o processo realizado neste artigo foi feito no Apache 2.4 rodando no Ubuntu 16.04.

Configuração DNS

Primeiramente, precisamos ir no gerenciador de DNS do nosso domínio e configurar o subdomínio para apontar para nosso servidor. No meu caso, o domínio está sendo gerenciado pela Digital Ocean, porém o conceito é o mesmo para qualquer outro gerenciador de DNS.

Imagem 1 – Configuração do DNS na Digital Ocean

Criamos um registro tipo A com o nome do subdomínio que irá direcionar para o IP do nosso servidor. Criamos também um registro do tipo CNAME para que o sufixo www também funcione nesse subdomínio.

Repare que tanto o domínio quanto o subdomínio apontam para o IP nosso servidor. Quando a conexão chegar lá, o Apache vai decidir qual página carregar de acordo com o endereço e as configurações de Virtual Host definidas, assim como exemplificado na Imagem 2.

Imagem 2 – Demonstração do funcionamento do Apache

Criação da pasta do subdomínio

O próximo passo é a criação da pasta raiz dos arquivos para este subdomínio. Para isso, vamos abrir um terminal e acessar nosso servidor via SSH.

ssh rafael@rafaelcouto.com.br

Agora vamos criar a nossa pasta e definir as permissões básicas.

# Entrando na pasta padrão dos arquivos do apache
cd /var/www

# Criando pasta do subdomínio
sudo mkdir subdominio

# Mudando o dono do diretório para meu usuário e para o grupo padrão do apache
sudo chown -R rafael:www-data subdominio

E para verificarmos se o subdomínio está funcionando, vamos adicionar um arquivo index.html.

# Entrando na pasta que criamos
cd /var/www/subdominio

# Criando arquivo
nano index.html

Estou utilizando o nano como editor, porém você pode utilizar o vim ou qualquer editor de sua preferência. Vamos então colocar o conteúdo no arquivo, depois basta pressionar CTRL+X e depois Y para salvar.

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Subdomínio</title>
</head>
<body>
    <h1>Subdomínio está funcionando!</h1>
</body>
</html>

Arquivo de configuração

O próximo passo é criar um Virtual Host no Apache, para isso vamos criar um arquivo que irá conter a configuração do nosso subdomínio.

# Entrando na pasta padrão dos sites do apache
cd /etc/apache2/sites-available

# Criando arquivo de configuração
sudo nano subdominio.conf

E então vamos colocar a configuração no arquivo.

<VirtualHost *:80>

    ServerName subdominio.rafaelcouto.com.br
    ServerAlias www.subdominio.rafaelcouto.com.br

    ErrorLog ${APACHE_LOG_DIR}/subdominio.error.log
    CustomLog ${APACHE_LOG_DIR}/subdominio.access.log combined

    DocumentRoot /var/www/subdominio
    
    <Directory /var/www/subdominio>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

</VirtualHost>
  • Linha 1: O Apache irá considerar o grupo de diretivas dentro desse bloco para qualquer IP (*) que venha na porta 80, que é a porta padrão do HTTP;
  • Linha 3: O ServerName é o identificador do endereço do subdomínio. É através dessa diretiva que o Apache vai saber que deve utilizar essas configurações;
  • Linha 4: O ServerAlias permite definir endereços alternativos para o endereço base, no caso definimos o www;
  • Linha 6 e 7: Definimos o caminho dos arquivos de log desse subdomínio. No caso, o valor padrão da variável ${APACHE_LOG_DIR} é o caminho /var/log/apache2;
  • Linha 9: O DocumentRoot indica o caminho dos arquivos que serão visíveis na web. Se nossa aplicação fosse Laravel, por exemplo, você poderia colocar /var/www/subdominio/public;
  • Linha 11: Definimos algumas configurações adicionais para o diretório;
  • Linha 12: Indica se o diretório pode ser um link simbólico. Poderíamos, por exemplo, colocar o projeto na pasta do nosso usuário /home/rafael/subdominio e então criar apenas um link simbólico no /var/www/subdominio apontando para ela;
  • Linha 13: O AllowOverride nos permite definir as diretivas que podem ser utilizadas no arquivo .htaccess. Como utilizamos All, qualquer diretiva poderá ser utilizada;
  • Linha 14: Indica que qualquer requisição será permitida.

Ativando e testando

Por fim, basta nós ativarmos nosso arquivo de configuração.

# Ativando o site no Apache
sudo a2ensite subdominio.conf

# Reiniciando serviço do Apache
sudo service apache2 restart

Pronto, dessa forma se você acessar o endereço do subdomínio, já deveria estar funcionando, porém sem HTTPS. Caso não esteja funcionando, não se desespere! Pode ser que o DNS ainda não foi propagado. Então antes de sair mexendo nas configurações, aguarde um pouco, não costuma demorar muito.

Imagem 3 – Subdomínio com HTTP funcionando

Agora que já temos o nosso subdomínio funcionando, veremos como habilitar o HTTPS.

Habilitando o HTTPS

Você pode utilizar o subdomínio sem HTTPS, porém não é nada recomendado. Com o protocolo HTTPS todo o tráfego entre o cliente e o servidor é criptografado, provendo uma segurança extra para sua aplicação.

Para habilitar o HTTPS precisamos de um certificado que é disponibilizado por uma Autoridade Certificadora. Uma das mais conhecidas é o Let’s Encrypt, com ele é possível emitir e instalar um certificado de forma simples e de graça. E para isso, o Let’s Encrypt disponibiliza um cliente chamado Certbot. Então, antes de qualquer coisa, vamos instalá-lo.

# Adicionando repositório no Ubuntu
# Pressione ENTER após rodar o comando
sudo add-apt-repository ppa:certbot/certbot

# Atualizando pacotes
sudo apt-get update

# Instalando o pacote Apache do Certbot
sudo apt install python-certbot-apache

Pronto, agora basta rodar o comando para instalar os certificados e configurar o Apache.

sudo certbot --apache -d subdominio.rafaelcouto.com.br -d www.subdominio.rafaelcouto.com.br
Please choose whether or not to redirect HTTP traffic to HTTPS, removing HTTP access.
-------------------------------------------------------------------------------
1: No redirect - Make no further changes to the webserver configuration.
2: Redirect - Make all requests redirect to secure HTTPS access. Choose this for
new sites, or if you're confident your site works on HTTPS. You can undo this
change by editing your web server's configuration.
-------------------------------------------------------------------------------
Select the appropriate number [1-2] then [enter] (press 'c' to cancel):

O Certbot irá perguntar se você deseja redirecionar as requisições HTTP para HTTPS. É recomendado que você selecione a segunda opção (Redirect), para evitar que os usuários acessem o endereço HTTP por engano.

IMPORTANT NOTES:
 - Congratulations! Your certificate and chain have been saved at:
   /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/fullchain.pem
   Your key file has been saved at:
   /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/privkey.pem
   Your cert will expire on 2020-08-04. To obtain a new or tweaked
   version of this certificate in the future, simply run certbot again
   with the "certonly" option. To non-interactively renew *all* of
   your certificates, run "certbot renew"
 - If you like Certbot, please consider supporting our work by:

   Donating to ISRG / Let's Encrypt:   https://letsencrypt.org/donate
   Donating to EFF:                    https://eff.org/donate-le

Se tudo der certo, o Certbot irá gerar os arquivos de certificado nos locais indicados, criar o arquivo /etc/apache2/sites-available/subdominio-le-ssl.conf, ativá-lo e editar o arquivo /etc/apache2/sites-available/subdominio.conf adicionando o redirecionamento.

Basta acessar o endereço agora para verificar se deu tudo certo.

Imagem 4 – Subdomínio com HTTPS funcionando

Configuração manual (Opcional)

Se por algum motivo o Certbot gerar o certificado, porém não criar o arquivo de configuração, você pode criá-lo manualmente.

sudo nano /etc/apache2/sites-available/subdominio-le-ssl.conf
<IfModule mod_ssl.c>
<VirtualHost *:443>

    ServerName subdominio.rafaelcouto.com.br
    ServerAlias www.subdominio.rafaelcouto.com.br

    ErrorLog ${APACHE_LOG_DIR}/subdominio.error.log
    CustomLog ${APACHE_LOG_DIR}/subdominio.access.log combined

    DocumentRoot /var/www/subdominio
    
    <Directory /var/www/subdominio>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    Include /etc/letsencrypt/options-ssl-apache.conf
    SSLCertificateFile /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/fullchain.pem
    SSLCertificateKeyFile /etc/letsencrypt/live/subdominio.rafaelcouto.com.br/privkey.pem
</VirtualHost>
</IfModule>

É basicamente o mesmo arquivo que definimos anteriormente, com alguns ajustes:

  • Linha 1: No caso do HTTPS, utilizamos a porta 443 por padrão;
  • Linha 18 a 20: Incluímos as configurações padrões do Let’s Encrypt e indicamos os caminhos do certificado e da chave que foram gerados pelo Certbot.

E caso necessário, adicionar o redirecionamento na configuração HTTP.

sudo nano /etc/apache2/sites-available/subdominio.conf
<VirtualHost *:80>

    ServerName subdominio.rafaelcouto.com.br
    ServerAlias www.subdominio.rafaelcouto.com.br

    ErrorLog ${APACHE_LOG_DIR}/subdominio.error.log
    CustomLog ${APACHE_LOG_DIR}/subdominio.access.log combined

    DocumentRoot /var/www/subdominio
    
    <Directory /var/www/subdominio>
        Options Indexes FollowSymLinks
        AllowOverride All
        Require all granted
    </Directory>

    RewriteEngine on
    RewriteCond %{SERVER_NAME} =subdominio.rafaelcouto.com.br [OR]
    RewriteCond %{SERVER_NAME} =www.subdominio.rafaelcouto.com.br
    RewriteRule ^ https://%{SERVER_NAME}%{REQUEST_URI} [END,NE,R=permanent]
</VirtualHost>
  • Linha 17: Habilitamos o RewriteEngine que nos permite sobrescrever URLs;
  • Linha 18 e 19: Com o RewriteCond definimos as condições da nossa sobrescrita, ou seja, se o endereço base for subdominio.rafaelcouto.com.br ou www.subdominio.rafaelcouto.com.br, será executada a regra adiante.
  • Linha 20: O RewriteRule permite executar uma ação se as condições definidas anteriormente forem verdadeiras, no caso redirecionamos para o mesmo endereço, porém com o protocolo https://.

Por fim, basta ativar o subdomínio HTTPS e reiniciar o Apache.

# Ativando o site HTTPS no Apache
sudo a2ensite subdominio-le-ssl.conf

# Reiniciando serviço do Apache
sudo service apache2 restart

Renovação do certificado

Os certificados gerados pela Let’s Encrypt tem validade de 90 dias. Entretanto, o Certbot já configura uma rotina para renovação automática dos certificados. Esse script fica localizado em /etc/cron.d e faz a verificação duas vezes por dia, renovando qualquer certificado que expire dentro de 30 dias.

Caso você queira testar o processo de renovação, basta rodar o comando abaixo.

sudo certbot renew --dry-run

Conclusão

Neste artigo, tentei detalhar a minha experiência na criação de um subdomínio HTTPS. Apesar desse procedimento ter sido feito no Ubuntu, o processo é o mesmo para qualquer distribuição Linux, você só terá que adaptar os comandos.

Caso você utilize Nginx ao invés de Apache, terá que criar um Server Block (equivalente ao Virtual Host) para configuração do subdomínio. E terá que adaptar os comandos do Certbot, porém todo o conceito é o mesmo.

Lembrando também que todo esse processo serve para domínios. Caso você tenha mais de um domínio apontando para a mesma VPS, poderá fazer esse mesmo processo para o novo domínio.

Espero que de alguma forma este artigo tenha sido útil para que você, até a próxima.

Referências