Tutorial

Como criar um certificado SSL auto-assinado para o Apache no Ubuntu 20.04

Published on August 19, 2020
Português
Como criar um certificado SSL auto-assinado para o Apache no Ubuntu 20.04

Introdução

O TLS, ou “segurança de camada de transporte” — e seu antecessor, o SSL — são protocolos usados para envolver o tráfego normal em um pacote protegido, criptografado. Ao usar esta tecnologia, os servidores podem enviar informações com segurança aos seus clientes sem que suas mensagens sejam interceptadas ou lidas por terceiros.

Neste guia, mostraremos como criar e usar um certificado SSL auto-assinado com o servidor Web Apache no Ubuntu 20.04.

Nota: um certificado auto-assinado irá criptografar a comunicação entre seu servidor e qualquer cliente. No entanto, uma vez que ele não é assinado por nenhuma das autoridades de certificados confiáveis incluídas com navegadores Web e sistemas operacionais, os usuários não podem usar o certificado para validar a identidade do seu servidor automaticamente. Como resultado, seus usuários irão ver um erro de segurança ao visitar seu site.

Devido a esta limitação, certificados auto-assinados não são adequados para um ambiente de produção que atenda ao público. Eles são normalmente usados para testes, ou para proteger serviços não críticos usados por um único usuário ou um pequeno grupo de usuários que possam estabelecer confiança na validade do certificado através de canais de comunicação alternativos.

Para uma solução de certificado mais pronta para produção, confira o Let’s Encrypt, uma autoridade certificadora gratuita. Você pode aprender como baixar e configurar um certificado Let’s Encrypt em nosso tutorial How To Secure Apache with Let’s Encrypt on Ubuntu 20.04.

Pré-requisitos

Antes de iniciar este tutorial, você precisará do seguinte:

  • Acesso a um servidor Ubuntu 20.04 com um usuário não-root, habilitado no sudo. Nosso guia Initial Server Setup with Ubuntu 20.04 pode lhe mostrar como criar esta conta.
  • Você também precisará ter o Apache instalado. Você pode instalar o Apache usando o apt. Primeiro, atualize o índice de pacotes local para refletir as últimas alterações upstream:
  1. sudo apt update

Então, instale o pacote apache2:

  1. sudo apt install apache2

E, finalmente, se você tiver um firewall ufw configurado, abra as portas http e https:

  1. sudo ufw allow "Apache Full"

Depois de completar estes passos, lembre-se de fazer o login com um usuário não-root para seguir com o tutorial.

Passo 1 — Habilitando o mod_ssl

Antes de usarmos qualquer certificado de SSL, é necessário, primeiramente, habilitar o mod_ssl, um módulo do Apache compatível com criptografia SSL.

Habilite o mod_ssl com o comando a2enmod:

  1. sudo a2enmod ssl

Reinicie o Apache para ativar o módulo:

  1. sudo systemctl restart apache2

O módulo mod_ssl agora está habilitado e pronto para uso.

Passo 2 — Criando o certificado SSL

Agora que o Apache está pronto para usar criptografia, podemos passar para a geração de um novo certificado SSL. O certificado irá armazenar algumas informações básicas sobre seu site, e será acompanhado por um arquivo de chave que permite ao servidor lidar com segurança com dados criptografados.

Podemos criar a chave SSL e os arquivos de certificado com o comando openssl:

  1. sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 -keyout /etc/ssl/private/apache-selfsigned.key -out /etc/ssl/certs/apache-selfsigned.crt

Depois de inserir o comando, você será levado a um prompt onde você pode inserir informações sobre seu site. Antes de passarmos por isso, vamos ver o que está acontecendo no comando que estamos emitindo:

  • openssl: esta é a ferramenta de linha de comando para criação e gerenciamento de certificados OpenSSL, chaves e outros arquivos.
  • req -x509: isto especifica que queremos usar o gerenciamento X.509 de solicitação de assinatura de certificado (CSR). O X.509 é um padrão de infraestrutura de chave pública ao qual o SSL e o TLS aderem para gerenciamento de chaves e certificados.
  • -nodes: isso diz ao OpenSSL para pular a opção de proteger nosso certificado com uma frase secreta. Precisamos que o Apache consiga ler o arquivo, sem a intervenção do usuário, quando o servidor for iniciado. Uma frase secreta impediria que isso acontecesse porque teríamos que digitá-la após cada reinício.
  • -days 365: esta opção define o período de tempo em que o certificado será considerado válido. Aqui, nós configuramos ela para um ano. Muitos navegadores modernos irão rejeitar quaisquer certificados que sejam válidos por mais de um ano.
  • -newkey rsa:2048: isso especifica que queremos gerar um novo certificado e uma nova chave ao mesmo tempo. Não criamos a chave necessária para assinar o certificado em um passo anterior, então precisamos criá-la junto com o certificado. A parte rsa:2048 diz a ele para criar uma chave RSA com 2048 bits.
  • -keyout: esta linha diz ao OpenSSL onde colocar o arquivo de chave privada gerado que estamos criando.
  • -out: isso diz ao OpenSSL onde colocar o certificado que estamos criando.

Preencha os prompts devidamente. A linha mais importante é aquela que requisita o Common Name. Você precisa digitar o nome do host que usará para acessar o servidor ou o IP público do mesmo. É importante que este campo corresponda ao que você colocar na barra de endereços do seu navegador para acessar o site, pois uma incompatibilidade irá causar mais erros de segurança.

A lista completa de prompts será algo parecido com isto:

Country Name (2 letter code) [XX]:US
State or Province Name (full name) []:Example
Locality Name (eg, city) [Default City]:Example 
Organization Name (eg, company) [Default Company Ltd]:Example Inc
Organizational Unit Name (eg, section) []:Example Dept
Common Name (eg, your name or your server's hostname) []:your_domain_or_ip
Email Address []:webmaster@example.com

Ambos os arquivos que você criou serão colocados nos subdiretórios apropriados em /etc/ssl.

Em seguida, atualizaremos nossa configuração do Apache para usar o novo certificado e chave.

Passo 3 — Configurando o Apache para usar SSL

Agora que temos nosso certificado auto-assinado e a chave disponíveis, precisamos atualizar nossa configuração do Apache para usá-los. No Ubuntu, você pode colocar novos arquivos de configuração do Apache (eles devem terminar em .conf) dentro de /etc/apache2/sites-available/ e eles serão carregados da próxima vez que o processo do Apache for recarregado ou reiniciado.

Para este tutorial, criaremos um novo arquivo de configuração mínima. (Se você já tiver um Apache <Virtualhost> configurado e apenas precisar adicionar SSL a ele, você provavelmente precisará copiar as linhas de configuração que começam com SSL, e mudar a porta do VirtualHost de 80 para 443. Cuidaremos da porta 80 no próximo passo.)

Abra um novo arquivo no diretório /etc/apache2/sites-available:

  1. sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Cole nele a seguinte configuração mínima do VirtualHost:

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:443>
   ServerName your_domain_or_ip
   DocumentRoot /var/www/your_domain_or_ip

   SSLEngine on
   SSLCertificateFile /etc/ssl/certs/apache-selfsigned.crt
   SSLCertificateKeyFile /etc/ssl/private/apache-selfsigned.key
</VirtualHost>

Certifique-se de atualizar a linha ServerName para o que você pretende endereçar ao seu servidor. Isso pode ser um nome de host, nome de domínio completo, ou um endereço IP. Verifique se o que você escolhe corresponde ao Common Name que você escolheu ao criar o certificado.

As linhas restantes especificam um diretório DocumentRoot a partir do qual serão apresentados os arquivos e as opções SSL necessárias para apontar o Apache para nosso certificado e chave recém-criados.

Agora, vamos criar nosso DocumentRoot e colocar um arquivo HTML nele apenas para fins de teste:

  1. sudo mkdir /var/www/your_domain_or_ip

Abra um novo arquivo index.html com seu editor de texto:

  1. sudo nano /var/www/your_domain_or_ip/index.html

Cole o seguinte no arquivo em branco:

/var/www/your_domain_or_ip/index.html
<h1>it worked!</h1>

Este não é um arquivo HTML completo, claro, mas os navegadores são flexíveis e isso será suficiente para verificar nossa configuração.

Salve e feche o arquivo. Em seguida, precisamos habilitar o arquivo de configuração com a ferramenta a2ensite:

  1. sudo a2ensite your_domain_or_ip.conf

Em seguida, vamos testar à procura de erros de configuração:

  1. sudo apache2ctl configtest

Se tudo for bem-sucedido, você receberá um resultado que se parecerá com este:

Output
AH00558: apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.1.1. Set the 'ServerName' directive globally to suppress this message Syntax OK

A primeira linha é apenas uma mensagem informando que a diretiva ServerName não está definida globalmente. Se você quiser se livrar dessa mensagem, você pode definir ServerName como o nome de domínio do seu servidor ou o endereço IP em /etc/apache2/apache2.conf. Isso é opcional, uma vez que a mensagem não causará problemas.

Se seu resultado tiver Syntax OK nele, seu arquivo de configuração não possui erros de sintaxe. Podemos recarregar com segurança o Apache para implementar nossas alterações:

  1. sudo systemctl reload apache2

Agora, carregue seu site em um navegador, garantindo usar https:// no início.

Você deve ver um erro. Isso é normal para um certificado auto-assinado! O navegador está lhe alertando que ele não pode verificar a identidade do servidor, pois nosso certificado não é assinado por nenhuma das suas autoridades certificadoras conhecidas. Para fins de teste e uso pessoal, isso está ok. Você deve ser capaz de clicar em avançado ou obter mais informações e optar por prosseguir.

Depois que fizer isso, o navegador irá carregar it worked! como mensagem.

Nota: se seu navegador não se conectar ao servidor, certifique-se de que sua conexão não esteja sendo bloqueada por um firewall. Se você estiver usando o ufw, os seguintes comandos abrirão as portas 80 e 443:

  1. sudo ufw allow "Apache Full"

Em seguida, adicionaremos outra seção VirtualHost à nossa configuração para atender requisições HTTP simples e redirecioná-las ao HTTPS.

Passo 4 — Redirecionando HTTP para HTTPS

Atualmente, nossa configuração irá responder apenas às requisições HTTPS na porta 443. É uma boa prática também responder na porta 80, mesmo que você queira forçar todo o tráfego a ser criptografado. Vamos configurar um VirtualHost para responder a essas requisições não criptografadas e redirecioná-las para HTTPS.

Abra o mesmo arquivo de configuração do Apache que iniciamos nos passos anteriores:

  1. sudo nano /etc/apache2/sites-available/your_domain_or_ip.conf

Ao final, crie outro bloco VirtualHost para corresponder às requisições na porta 80. Use a diretiva ServerName para corresponder novamente ao seu nome de domínio ou endereço IP. Em seguida, use Redirect para corresponder a quaisquer requisições e enviá-las para o VirtualHost SSL. Certifique-se de incluir a barra final:

/etc/apache2/sites-available/your_domain_or_ip.conf
<VirtualHost *:80>
	ServerName your_domain_or_ip
	Redirect / https://your_domain_or_ip/
</VirtualHost>

Salve e feche este arquivo quando você tiver terminado, então teste sua sintaxe de configuração novamente e recarregue o Apache:

  1. sudo apachectl configtest
  2. sudo systemctl reload apache2

Você pode testar a nova funcionalidade de redirecionar visitando seu site com o http:// simples em frente ao endereço. Você deve ser redirecionado para https:// automaticamente.

Conclusão

Agora, você configurou o Apache para atender requisições criptografadas usando um certificado SSL auto-assinado, e para redirecionar requisições HTTP não criptografadas para HTTPS.

Se você estiver planejando usar SSL para um site público, você deve procurar comprar um nome de domínio e usar uma autoridade certificadora amplamente suportada, como o Let’s Encrypt.

Para obter mais informações sobre o uso do Let’s Encrypt com o Apache, leia nosso tutorial How To Secure Apache with Let’s Encrypt on Ubuntu 20.04.

Thanks for learning with the DigitalOcean Community. Check out our offerings for compute, storage, networking, and managed databases.

Learn more about us


About the authors
Default avatar

Senior Manager, DevEd

Open source advocate and lover of education, culture, and community.



Still looking for an answer?

Ask a questionSearch for more help

Was this helpful?
 
Leave a comment


This textbox defaults to using Markdown to format your answer.

You can type !ref in this text area to quickly search our full set of tutorials, documentation & marketplace offerings and insert the link!

Try DigitalOcean for free

Click below to sign up and get $200 of credit to try our products over 60 days!

Sign up

Join the Tech Talk
Success! Thank you! Please check your email for further details.

Please complete your information!

Get our biweekly newsletter

Sign up for Infrastructure as a Newsletter.

Hollie's Hub for Good

Working on improving health and education, reducing inequality, and spurring economic growth? We'd like to help.

Become a contributor

Get paid to write technical tutorials and select a tech-focused charity to receive a matching donation.

Welcome to the developer cloud

DigitalOcean makes it simple to launch in the cloud and scale up as you grow — whether you're running one virtual machine or ten thousand.

Learn more
DigitalOcean Cloud Control Panel