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.
Antes de iniciar este tutorial, você precisará do seguinte:
apt
. Primeiro, atualize o índice de pacotes local para refletir as últimas alterações upstream:Então, instale o pacote apache2
:
E, finalmente, se você tiver um firewall ufw
configurado, abra as portas http
e https
:
Depois de completar estes passos, lembre-se de fazer o login com um usuário não-root para seguir com o tutorial.
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
:
Reinicie o Apache para ativar o módulo:
O módulo mod_ssl
agora está habilitado e pronto para uso.
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
:
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.
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
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:
Cole nele a seguinte configuração mínima do 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:
Abra um novo arquivo index.html
com seu editor de texto:
Cole o seguinte no arquivo em branco:
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
:
Em seguida, vamos testar à procura de erros de configuração:
Se tudo for bem-sucedido, você receberá um resultado que se parecerá com este:
OutputAH00558: 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:
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
:
Em seguida, adicionaremos outra seção VirtualHost
à nossa configuração para atender requisições HTTP simples e redirecioná-las ao 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:
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:
Salve e feche este arquivo quando você tiver terminado, então teste sua sintaxe de configuração novamente e recarregue o Apache:
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.
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.