Restaurar o acesso verificado ao site de ajuda

CibersegurançaBeginner
Pratique Agora

Introdução

Uma equipe de suporte implantou um site de ajuda, mas os clientes recusam a conexão HTTPS. O HTTPS usa TLS para criptografar o tráfego e provar qual servidor respondeu. Só a criptografia não estabelece identidade: o cliente também precisa reconhecer o nome solicitado e confiar no emissor do certificado.

Você corrigirá certificados sintéticos de treinamento em um servidor Nginx real. Basta familiaridade básica com o terminal; a inspeção de certificados e a configuração do serviço serão apresentadas aqui. Client e Server são sessões e diretórios distintos da mesma VM, não computadores separados. O Nginx executa em um contêiner preparado. O HTTPS Monitor opcional mostra sondagens TLS internas reais; o cadeado do navegador descreve outra conexão externa.

Obter uma referência confiável

Nesta etapa, obtenha um documento de um serviço funcional antes de compará-lo com o site de ajuda com falha. Um nome de host identifica o serviço solicitado. Todos os nomes de treinamento terminam em .lab.test e são locais a este exercício.

Use a aba Client. curl obtém uma URL. --cacert root.crt confia na autoridade certificadora (CA) fornecida, que assina certificados. Essa CA é uma âncora de confiança de treinamento, não uma autoridade pública. --resolve associa um nome e uma porta a um endereço IP, preservando o nome para TLS e HTTP. 127.0.0.1 significa esta VM; a porta 8443 alcança o Nginx preparado. --noproxy '*' envia a solicitação diretamente; as aspas impedem a expansão de * pelo shell. --fail rejeita erros HTTP e --output salva o documento real do serviço para uso posterior.

curl --noproxy '*' --fail --cacert root.crt --resolve status.lab.test:8443:127.0.0.1 --output reference.txt https://status.lab.test:8443/

cat exibe o conteúdo de um arquivo:

cat reference.txt
status service: training content available

O download é um documento de referência real, não um relatório. Agora solicite o nome previsto do site de ajuda. Espera-se que o comando falhe e retorne ao prompt; continue depois.

curl --noproxy '*' --cacert root.crt --resolve help.lab.test:8443:127.0.0.1 https://help.lab.test:8443/
curl: (60) SSL: no alternative certificate subject name matches target host name 'help.lab.test'
...

A referência funcionou com a mesma CA e endereço. Esse erro aponta especificamente para um nome incompatível, não um servidor parado. Mantenha o nome previsto: alterar a URL testaria outra identidade.

Inspecionar e montar a cadeia de certificados

Nesta etapa, compare a identidade servida com um certificado preparado e construa um pacote utilizável pelo servidor. Um certificado contém uma chave pública e informações de identidade. A chave privada correspondente permanece no servidor. Nunca cole uma chave privada em relatórios nem a envie aos clientes.

Em Client, inspecione o certificado realmente servido. openssl s_client abre uma conexão TLS; -connect fornece o endereço e -servername envia o nome solicitado por Server Name Indication (SNI), permitindo vários sites em um listener Nginx. < /dev/null encerra a entrada interativa. 2>/dev/null oculta os diagnósticos apenas nesta inspeção. O pipe | envia o certificado a openssl x509; -noout suprime o certificado codificado e as outras opções mostram campos selecionados. Essa inspeção não prova, sozinha, a confiança.

openssl s_client -connect 127.0.0.1:8443 -servername help.lab.test </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName
subject=CN = legacy.lab.test
issuer=CN = LabEx Training Issuing CA
notBefore=...
notAfter=...
X509v3 Subject Alternative Name:
    DNS:legacy.lab.test

O nome alternativo do titular (SAN) lista os hosts aceitos. issuer identifica o assinante; as datas delimitam a validade. A preparação gera certificados novos para esta VM: os certificados finais duram 365 dias. Uma data válida não compensa um nome incorreto.

Mude para Server. openssl x509 -in lê um certificado local em vez de uma resposta de rede:

openssl x509 -in certs/help.crt -noout -subject -issuer -dates -ext subjectAltName

Seu SAN é DNS:help.lab.test, correspondente à solicitação. Esta é a relação prevista:

Item Função
help.crt e help.key Certificado do site de ajuda e chave privada correspondente
docs.crt e docs.key Certificado da documentação e chave privada correspondente
issuing.crt CA intermediária que assinou ambos os sites
../client/root.crt CA raiz confiável para o cliente

A cadeia é certificado do site → CA intermediária → CA raiz confiável. O Nginx deve enviar primeiro o certificado final, depois o intermediário. O cliente já confia na raiz, que não precisa ser enviada. Monte o pacote público com cat; > grava a saída em um arquivo, substituindo o conteúdo anterior. A chave privada não faz parte dele.

cat certs/help.crt certs/issuing.crt > certs/help-fullchain.pem

openssl verify verifica o pacote contra a raiz confiável especificada. -untrusted fornece intermediários como possíveis elos, não como raízes adicionais de confiança; -verify_hostname verifica o nome previsto.

openssl verify -CAfile ../client/root.crt -untrusted certs/help-fullchain.pem -verify_hostname help.lab.test certs/help-fullchain.pem
certs/help-fullchain.pem: OK

Se falhar, confira a ordem dos arquivos e a grafia, depois repita cat. Isso valida o pacote preparado; o servidor ativo ainda precisa usá-lo.

Aplicar a identidade do site de ajuda

Nesta etapa, faça o Nginx servir a identidade correta mantendo o site de status funcional. Em Server, exiba a configuração com cat:

cat conf/help.conf

server_name seleciona o site. ssl_certificate indica a cadeia pública; ssl_certificate_key, a chave privada. Caminhos começando com /tls/ são internos ao contêiner Nginx e correspondem a certs/ neste diretório. A linha return 200 fornece o conteúdo real de ajuda do treinamento. Preserve o listener, o nome e a resposta.

Abra o arquivo com o editor de texto nano:

nano conf/help.conf

Use as setas para encontrar as duas diretivas TLS. Substitua somente essas duas linhas por:

    ssl_certificate /tls/help-fullchain.pem;
    ssl_certificate_key /tls/help.key;

Pontos e vírgulas encerram diretivas Nginx. Salve com Ctrl+O, pressione Enter e saia com Ctrl+X. Se houver um erro no caminho, reabra o mesmo arquivo e corrija-o.

sudo executa um comando com privilégio administrativo. docker exec https-edge executa o comando seguinte no contêiner preparado. nginx -t testa a configuração sem aplicá-la:

sudo docker exec https-edge nginx -t

Procure syntax is ok e test is successful. Se falhar, corrija primeiro o arquivo e a linha indicados. nginx -s reload solicita ao serviço ativo que carregue a configuração testada:

sudo docker exec https-edge nginx -s reload

Mude para Client e repita a solicitação prevista. A recarga pode levar um instante; repita se ainda receber o certificado antigo.

curl --noproxy '*' --fail --cacert root.crt --resolve help.lab.test:8443:127.0.0.1 https://help.lab.test:8443/
help service: training content available

Preserve também o funcionamento normal do site de referência:

curl --noproxy '*' --fail --cacert root.crt --resolve status.lab.test:8443:127.0.0.1 https://status.lab.test:8443/

O sucesso verifica nome, cadeia e datas realmente servidos antes de aceitar a resposta. Editar apenas um certificado não utilizado não produziria esse resultado.

Corrigir um certificado intermediário ausente

Nesta etapa, diferencie uma cadeia incompleta do nome incompatível já corrigido. Em Client, solicite o site de documentação preparado. Esta falha é intencional:

curl --noproxy '*' --cacert root.crt --resolve docs.lab.test:8443:127.0.0.1 https://docs.lab.test:8443/
curl: (60) SSL certificate problem: unable to get local issuer certificate
...

Ambas as falhas usam o código de saída 60; leia a explicação associada. Inspecione o certificado servido com o mesmo formato de comando:

openssl s_client -connect 127.0.0.1:8443 -servername docs.lab.test </dev/null 2>/dev/null | openssl x509 -noout -subject -issuer -dates -ext subjectAltName

Agora o SAN é DNS:docs.lab.test. O nome está correto, mas o Nginx envia apenas o certificado final, impedindo o cliente de ligar seu emissor à raiz.

Para uma comparação controlada, -k ignora a verificação do certificado. Isso mostra que é possível obter conteúdo mesmo com a confiança quebrada:

curl --noproxy '*' -k --resolve docs.lab.test:8443:127.0.0.1 https://docs.lab.test:8443/

Ver docs service: training content available aqui não é uma correção. Volte a Server, inspecione o arquivo ativo e abra-o:

cat conf/docs.conf
nano conf/docs.conf

O arquivo preparado docs-fullchain.pem já contém o certificado final e o intermediário em ordem. Substitua somente a linha ssl_certificate:

    ssl_certificate /tls/docs-fullchain.pem;

Mantenha /tls/docs.key como chave privada. Salve e saia como antes; depois teste e recarregue:

sudo docker exec https-edge nginx -t
sudo docker exec https-edge nginx -s reload

Em Client, solicite os três nomes previstos sem -k. O laço atribui cada valor a host; $host insere esse valor e as aspas duplas mantêm cada argumento resultante unido.

for host in help docs status; do
  curl --noproxy '*' --fail --cacert root.crt --resolve "$host.lab.test:8443:127.0.0.1" "https://$host.lab.test:8443/"
done

Espere as três respostas correspondentes. Você pode atualizar HTTPS Monitor para comparar suas sondagens independentes em tempo real. Corrija erros na configuração apropriada, teste e recarregue; não altere a raiz do cliente nem os nomes previstos. Em implantações reais, obtenha certificados aprovados pelo processo da organização; aqui há candidatos sintéticos para você se concentrar no diagnóstico.

Resumo

Você obteve uma referência confiável, inspecionou nomes e emissores reais, montou um pacote final/intermediário e o aplicou por uma recarga testada do Nginx. Corrigiu um nome incompatível e uma cadeia incompleta preservando o serviço normal. O próximo desafio combina essas decisões em outro portal.