HTTPS com Certificado Autoassinado no Nginx em Linux

CompTIABeginner
Pratique Agora

Introdução

Neste laboratório, você aprenderá como proteger um servidor web Nginx no Linux implementando HTTPS com um certificado autoassinado. Você começará instalando o servidor web Nginx e garantindo que ele esteja funcionando corretamente, estabelecendo a base para a configuração segura. Após a configuração inicial, você usará o kit de ferramentas OpenSSL para gerar um certificado SSL autoassinado, um componente crítico para habilitar comunicações criptografadas.

Uma vez que o certificado for criado, você prosseguirá para modificar a configuração do Nginx para servir conteúdo web através do protocolo seguro HTTPS. As etapas finais do laboratório focam na verificação e teste. Você ativará a nova configuração e usará ferramentas de linha de comando como curl e openssl para testar a conexão HTTPS e inspecionar os detalhes do seu certificado autoassinado recém-criado, confirmando que seu servidor está devidamente protegido.

Este é um Lab Guiado, que fornece instruções passo a passo para ajudá-lo a aprender e praticar. Siga as instruções cuidadosamente para completar cada etapa e ganhar experiência prática. Dados históricos mostram que este é um laboratório de nível iniciante com uma taxa de conclusão de 92%. Recebeu uma taxa de avaliações positivas de 100% dos estudantes.

Instalar e Iniciar o Servidor Web Nginx

Nesta etapa, você instalará o servidor web Nginx. Nginx é um servidor web de alta performance amplamente utilizado para servir conteúdo web. Primeiro, nós o instalaremos e depois verificaremos se ele está funcionando corretamente. Esta instância Nginx em execução servirá como base para nossa configuração HTTPS subsequente.

Primeiro, é uma boa prática atualizar a lista de pacotes do seu sistema para garantir que você está obtendo as versões mais recentes de software.

Execute o seguinte comando no seu terminal:

sudo apt update

Você verá o sistema buscando informações de pacotes de suas fontes configuradas. A saída será semelhante a esta:

Hit:1 http://archive.ubuntu.com/ubuntu jammy InRelease
Get:2 http://archive.ubuntu.com/ubuntu jammy-updates InRelease [119 kB]
...
Fetched 1,585 kB in 2s (924 kB/s)
Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
All packages are up to date.

Agora, você pode prosseguir para instalar o Nginx. Usaremos o comando apt install. A flag -y é adicionada para confirmar automaticamente a instalação, evitando quaisquer prompts interativos.

sudo apt install nginx -y

O processo de instalação baixará e configurará o Nginx e suas dependências. Após a conclusão, você deverá ver uma saída indicando que o pacote nginx foi configurado.

Reading package lists... Done
Building dependency tree... Done
Reading state information... Done
The following additional packages will be installed:
  nginx-common nginx-core
...
Setting up nginx-common (1.18.0-6ubuntu14.4) ...
Setting up nginx-core (1.18.0-6ubuntu14.4) ...
Setting up nginx (1.18.0-6ubuntu14.4) ...
Processing triggers for ufw (0.36.1-4ubuntu0.1) ...
Processing triggers for man-db (2.10.2-1) ...

Embora o processo de instalação geralmente inicie o serviço, é uma boa prática gerenciá-lo explicitamente. Usaremos systemctl, a utilidade padrão para controlar serviços em sistemas Linux modernos.

Inicie o serviço Nginx com este comando:

sudo systemctl start nginx

Este comando não produzirá nenhuma saída se for executado com sucesso. Para confirmar que o serviço está em execução, verifique seu status.

sudo systemctl status nginx

A saída fornecerá informações detalhadas sobre o serviço. Procure pela linha Active: active (running), que confirma que o Nginx está ativo e em execução.

● nginx.service - A high performance web server and a reverse proxy server
     Loaded: loaded (/lib/systemd/system/nginx.service; enabled; vendor preset: enabled)
     Active: active (running) since Mon 2023-10-30 08:30:00 UTC; 5s ago
       Docs: man:nginx(8)
   Main PID: 1234 (nginx)
      Tasks: 2 (limit: 4617)
     Memory: 4.8M
        CPU: 43ms
     CGroup: /system.slice/nginx.service
             ├─1234 "nginx: master process /usr/sbin/nginx -g daemon on; master_process on;"
             └─1235 "nginx: worker process"

Você agora instalou e iniciou com sucesso o servidor web Nginx. Na próxima etapa, você gerará um certificado digital, que é um pré-requisito para habilitar o HTTPS.

Gerar um Certificado SSL Autoassinado com OpenSSL

Nesta etapa, você criará um certificado digital autoassinado e sua chave privada correspondente. Para habilitar o HTTPS, um servidor web precisa de um certificado digital para provar sua identidade aos clientes e uma chave privada para estabelecer uma conexão segura e criptografada. Usaremos a ferramenta de linha de comando openssl, uma utilidade robusta para trabalhar com SSL/TLS.

Um certificado digital vincula uma chave pública a uma identidade (como o nome de domínio de um site). Normalmente, os certificados são emitidos e assinados por uma Autoridade Certificadora (CA) confiável. No entanto, para fins de teste e desenvolvimento, podemos criar um certificado autoassinado, que é assinado por seu próprio criador. Embora os navegadores exibam um aviso de segurança para tais certificados, eles são perfeitamente funcionais para um ambiente de laboratório como este.

Primeiro, vamos criar um diretório dedicado dentro da pasta de configuração do Nginx para armazenar nosso certificado SSL e chave. Isso mantém nossos arquivos organizados e seguros.

sudo mkdir -p /etc/nginx/ssl

Agora, usaremos um único comando openssl para gerar tanto a chave privada RSA de 2048 bits quanto o certificado autoassinado, válido por 365 dias. Nós os colocaremos diretamente no diretório /etc/nginx/ssl/.

Aqui está uma descrição das opções do comando:

  • req -x509: Cria um certificado autoassinado.
  • -nodes: Impede que a chave privada seja criptografada com uma senha. Isso é importante para que o Nginx possa iniciar sem intervenção manual.
  • -days 365: Define o período de validade do certificado para um ano.
  • -newkey rsa:2048: Gera uma nova chave privada RSA de 2048 bits.
  • -keyout: Especifica o arquivo de saída para a chave privada (/etc/nginx/ssl/nginx.key).
  • -out: Especifica o arquivo de saída para o certificado (/etc/nginx/ssl/nginx.crt).
  • -subj: Fornece as informações do assunto do certificado de forma não interativa. CN=localhost é o Nome Comum (Common Name), que deve corresponder ao endereço que você usa para acessar o site.

Execute o seguinte comando:

sudo openssl req -x509 -nodes -days 365 -newkey rsa:2048 \
  -keyout /etc/nginx/ssl/nginx.key \
  -out /etc/nginx/ssl/nginx.crt \
  -subj "/C=US/ST=State/L=City/O=LabOrg/OU=IT/CN=localhost"

Após executar o comando, você verá uma saída confirmando a geração da chave.

Generating a RSA private key
writing new private key to '/etc/nginx/ssl/nginx.key'
-----

A chave privada (/etc/nginx/ssl/nginx.key) é extremamente sensível. Se ela for comprometida, um atacante poderá se passar pelo seu servidor. Portanto, é crucial restringir suas permissões de arquivo para que apenas o usuário root possa lê-la.

sudo chmod 600 /etc/nginx/ssl/nginx.key

Este comando define as permissões para leitura e escrita apenas para o proprietário (root), e nenhuma permissão para mais ninguém. Esta é uma medida de segurança crucial.

Excelente! Você agora criou um certificado autoassinado (nginx.crt) e uma chave privada segura (nginx.key). Na próxima etapa, você configurará o Nginx para usar esses dois arquivos para habilitar o HTTPS.

Configurar o Nginx para Servir Conteúdo via HTTPS

Nesta etapa, você modificará a configuração do Nginx para habilitar o HTTPS. Com o certificado e a chave privada prontos da etapa anterior, você agora precisa instruir o Nginx a usá-los. Isso envolve editar o arquivo de configuração do site do Nginx para escutar na porta 443 (a porta padrão para HTTPS) e especificar os caminhos para seus arquivos de certificado e chave.

Antes de editar qualquer arquivo de configuração, é uma prática recomendada criar um backup. Isso permite que você reverta facilmente para o estado original se algo der errado. Vamos fazer backup do arquivo de configuração padrão do site do Nginx.

sudo cp /etc/nginx/sites-available/default /etc/nginx/sites-available/default.bak

Agora, você editará o arquivo de configuração principal usando o editor de texto nano. Este arquivo contém blocos de servidor que definem como o Nginx lida com as requisições de entrada.

sudo nano /etc/nginx/sites-available/default

Dentro do editor nano, você verá um bloco de servidor padrão configurado para HTTP na porta 80. Role para baixo até encontrar a seção de configuração SSL, que geralmente está comentada. Você precisa descomentar esta seção e garantir que ela corresponda à configuração abaixo. Este bloco informa ao Nginx para escutar conexões seguras na porta 443 e especifica qual certificado e chave usar para o handshake TLS.

Exclua o bloco de servidor SSL comentado existente e substitua-o pelo conteúdo a seguir, ou simplesmente descomente e edite-o para corresponder.

## --- CONTENT TO ADD/UNCOMMENT IN /etc/nginx/sites-available/default ---
server {
    listen 443 ssl;
    listen [::]:443 ssl;

    root /var/www/html;
    index index.html index.htm index.nginx-debian.html;

    server_name localhost;

    ssl_certificate /etc/nginx/ssl/nginx.crt;
    ssl_certificate_key /etc/nginx/ssl/nginx.key;

    location / {
        try_files $uri $uri/ =404;
    }
}
## --- END CONTENT ---

Aqui está o significado dessas diretivas:

  • listen 443 ssl: Informa ao Nginx para escutar conexões de entrada na porta 443 e tratá-las usando o protocolo SSL/TLS.
  • server_name localhost: Define qual bloco de servidor usar para requisições para localhost.
  • ssl_certificate: Especifica o caminho para o seu arquivo de certificado público (nginx.crt).
  • ssl_certificate_key: Especifica o caminho para o seu arquivo de chave privada (nginx.key).

Após adicionar o conteúdo, salve o arquivo e saia do nano pressionando Ctrl+X, seguido por Y e, em seguida, Enter.

Antes de aplicar as alterações, é crucial testar a configuração do Nginx para quaisquer erros de sintaxe. Isso evita que uma configuração quebrada derrube seu servidor web.

sudo nginx -t

Se a configuração estiver correta, você verá uma mensagem de sucesso.

nginx: the configuration file /etc/nginx/nginx.conf syntax is ok
nginx: configuration file /etc/nginx/nginx.conf test is successful

Se você vir algum erro, reabra o arquivo de configuração e verifique cuidadosamente se há erros de digitação ou pontos e vírgulas ausentes.

Você agora configurou com sucesso o Nginx para servir conteúdo via HTTPS. A próxima etapa é aplicar essas alterações reiniciando o serviço e testando a conexão.

Ativar e Testar a Configuração HTTPS com curl

Nesta etapa, você aplicará a nova configuração do Nginx e confirmará que seu servidor web está servindo conteúdo corretamente via HTTPS. Embora você tenha modificado o arquivo de configuração no disco, o processo Nginx em execução ainda está usando a configuração antiga. Você deve reiniciar o serviço para que as alterações entrem em vigor.

Para aplicar a nova configuração, reinicie o serviço Nginx usando systemctl.

sudo systemctl restart nginx

Este comando não produz nenhuma saída se for bem-sucedido. O Nginx agora estará escutando na porta 443 e pronto para lidar com requisições HTTPS usando o certificado e a chave que você forneceu.

Agora, vamos testar o endpoint HTTPS. Usaremos curl, uma ferramenta de linha de comando para transferir dados com URLs. Tentaremos buscar a página inicial do nosso servidor usando o protocolo https://.

Quando você se conecta a um servidor usando HTTPS, seu cliente (neste caso, curl) verifica se o certificado do servidor é assinado por uma Autoridade Certificadora (CA) confiável. Como criamos um certificado autoassinado, ele não é confiável por padrão, e o curl se recusará a conectar, exibindo um erro de validação de certificado.

Para contornar isso em nosso teste, usamos o sinalizador -k ou --insecure. Este sinalizador informa ao curl para pular a validação do certificado. Isso é inseguro e não deve ser usado em produção, mas é necessário para testar um certificado autoassinado em um ambiente de laboratório.

Execute o seguinte comando para testar seu servidor HTTPS:

curl -k https://localhost

Se sua configuração estiver correta, o curl se conectará com sucesso ao servidor e imprimirá o conteúdo HTML da página de boas-vindas padrão do Nginx.

<!DOCTYPE html>
<html>
<head>
<title>Welcome to nginx!</title>
<style>
    body {
        width: 35em;
        margin: 0 auto;
        font-family: Tahoma, Verdana, Arial, sans-serif;
    }
</style>
</head>
<body>
<h1>Welcome to nginx!</h1>
<p>If you see this page, the nginx web server is successfully installed and
working. Further configuration is required.</p>

<p>For online documentation and support please refer to
<a href="http://nginx.org/">nginx.org</a>.<br/>
Commercial support is available at
<a href="http://nginx.com/">nginx.com</a>.</p>

<p><em>Thank you for using nginx.</em></p>
</body>
</html>

Receber esta saída HTML confirma que seu servidor Nginx está configurado com sucesso e servindo conteúdo através de uma conexão HTTPS criptografada. Na etapa final, você aprenderá como inspecionar o certificado que o servidor está apresentando.

Inspecionar o Certificado SSL do Servidor com OpenSSL

Nesta etapa final, você examinará os detalhes do certificado digital que seu servidor Nginx está apresentando aos clientes. Esta é uma habilidade crucial para solucionar problemas de TLS/HTTPS e verificar a identidade de um servidor. Você usará a ferramenta openssl novamente, mas desta vez como um cliente para se conectar ao seu próprio servidor e inspecionar o certificado que ele fornece.

Usaremos uma combinação de dois comandos openssl conectados por um pipe (|).

  • openssl s_client -connect localhost:443: Este comando atua como um cliente SSL/TLS genérico e se conecta ao servidor e porta especificados. Ele exibirá o certificado do servidor juntamente com detalhes da sessão.
  • openssl x509 -text -noout: Este comando é usado para analisar e exibir o conteúdo de um certificado X.509 em um formato legível por humanos.

Encaminharemos a saída do s_client diretamente para o x509 para analisar o certificado em tempo real. O echo | no início impede que o s_client espere por entrada do usuário, e 2>/dev/null oculta as mensagens de status da conexão. Salvaremos a saída em um arquivo para clareza.

Execute o seguinte comando para se conectar ao seu servidor, extrair o certificado, analisá-lo e salvar os detalhes em um arquivo chamado /tmp/server_certificate_details.txt.

echo | openssl s_client -connect localhost:443 2> /dev/null | openssl x509 -text -noout > /tmp/server_certificate_details.txt

Agora, exiba o conteúdo do arquivo que você acabou de criar para ver os detalhes do certificado.

cat /tmp/server_certificate_details.txt

Você verá uma análise detalhada das propriedades do certificado.

Certificate:
    Data:
        Version: 3 (0x2)
        Serial Number:
            XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX:XX
    Signature Algorithm: sha256WithRSAEncryption
        Issuer: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Validity
            Not Before: Oct 30 09:00:00 2023 GMT
            Not After : Oct 29 09:00:00 2024 GMT
        Subject: C = US, ST = State, L = City, O = LabOrg, OU = IT, CN = localhost
        Subject Public Key Info:
            Public Key Algorithm: rsaEncryption
                Public-Key: (2048 bit)
                Modulus:
                    00:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:xx:
                    ...
                Exponent: 65537 (0x10001)
...

Reserve um momento para examinar a saída. Observe estes campos-chave:

  • Issuer: A entidade que assinou o certificado.
  • Subject: A entidade para a qual o certificado foi emitido.
  • CN (Common Name): O domínio específico para o qual o certificado é (localhost).

Como este é um certificado autoassinado, os campos Issuer e Subject são idênticos. Esta é a característica definidora de um certificado autoassinado. Você também pode ver o período de validade e os detalhes da chave pública.

Parabéns! Você configurou com sucesso um servidor web Nginx com um certificado SSL autoassinado, configurou-o para HTTPS, testou a conexão e inspecionou os detalhes do certificado. Agora você tem uma compreensão fundamental dos componentes envolvidos na proteção do tráfego web com TLS/HTTPS.

Resumo

Neste laboratório, você aprendeu o processo completo de implementação do HTTPS em um servidor web Nginx em um ambiente Linux usando um certificado autoassinado. Você começou configurando a base, que envolveu a atualização da lista de pacotes do sistema e a instalação do servidor web Nginx usando o gerenciador de pacotes apt. O cerne do laboratório focou na segurança, onde você usou o toolkit OpenSSL para gerar uma chave privada e um certificado SSL autoassinado correspondente, que são os componentes essenciais para habilitar conexões criptografadas.

Com o certificado criado, você prosseguiu para configurar o servidor Nginx. Isso envolveu a modificação de seus arquivos de configuração para criar um bloco de servidor que escuta na porta 443 para tráfego HTTPS e aponta para os caminhos do seu novo certificado e chave privada. Para finalizar o processo, você ativou a nova configuração e realizou etapas cruciais de verificação. Você usou o comando curl para testar a conexão HTTPS a partir da linha de comando e confirmou que o servidor estava respondendo de forma segura. Finalmente, você usou o OpenSSL como uma ferramenta cliente para inspecionar o certificado do servidor, validando que o certificado correto estava sendo servido.