Introdução
O endpoint funciona, mas os clientes devem ler o conteúdo por uma conexão cifrada que verifique a identidade do servidor. Associe um certificado ACM preparado a um nome alternativo do CloudFront, exija HTTPS e teste a página real, a confiança no certificado e seu nome.
Conclua primeiro o laboratório de distribuição privada do S3. Esta VM independente fornece uma nova conexão privada com a origem, um certificado importado para content.labex-n04.test e a âncora pública de confiança practice-ca.pem. O certificado ainda não está associado à distribuição. Observe o estado no AWS View, acima, e use o Terminal, abaixo. Não é preciso ter conta pessoal da AWS ou domínio comprado.
O certificado de prática é assinado por uma autoridade certificadora privada preparada. Confie em seu arquivo público de CA para um único comando, sem alterar o armazenamento de confiança do sistema. Um site público do CloudFront precisa de um certificado publicamente confiável. Aqui você pratica a associação e verificações TLS reais, sem registro de domínio nem emissão pública de certificado.
Objetivos de certificação
| Certificação | Tarefa do exame | Prática |
|---|---|---|
| Cloud Practitioner (CLF-C02) | Tarefa 2.2 | Identificar criptografia em trânsito com HTTPS e distingui-la da política de acesso à origem privada. |
| Solutions Architect – Associate (SAA-C03) | Tarefa 1.3 | Associar um certificado ACM e verificar confiança TLS, correspondência do nome e acesso cifrado ao conteúdo. |
Visão geral do laboratório

Associar o certificado e exigir HTTPS
Nesta etapa, conecte o certificado e o nome alternativo preparados à distribuição e exija solicitações cifradas.
TLS cifra uma conexão e permite verificar a identidade do servidor. Um certificado contém nomes e uma chave pública, assinados por uma autoridade certificadora (CA). ACM, AWS Certificate Manager, gerencia certificados para serviços AWS. Ter um certificado no ACM não o associa automaticamente a uma distribuição.
Identifique os recursos preparados. $(...) guarda a saída em variáveis do shell; --query seleciona o recurso e --output text permite usar seu ID como argumento. Mantenha o Terminal aberto:
cd /home/labex/project
HOST_NAME=content.labex-n04.test
DIST_ID=$(aws cloudfront list-distributions \
--query "DistributionList.Items[?Comment=='labex-n04:private-content'].Id | [0]" \
--output text)
CERT_ARN=$(aws acm list-certificates \
--query "CertificateSummaryList[?DomainName=='content.labex-n04.test'].CertificateArn | [0]" \
--output text)
aws acm describe-certificate \
--certificate-arn "$CERT_ARN" \
--query 'Certificate.{Name:DomainName,Names:SubjectAlternativeNames,Status:Status}'
Espere ISSUED e o nome de prática em Names. O ARN identifica conta e região. Certificados de usuário do CloudFront no ACM devem estar em us-east-1; o ARN preparado usa essa região. O certificado precisa cobrir o nome alternativo associado.
Leia a configuração atual e seu ETag, token de versão necessário para atualizar. > salva a saída em um arquivo:
aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query DistributionConfig > current-config.json
ETAG=$(aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query ETag \
--output text)
Um nome alternativo, ou alias, permite reconhecer o nome do conteúdo. SNI, Server Name Indication, envia o nome durante a configuração TLS para selecionar o certificado. A política de protocolo do usuário controla HTTP e HTTPS separadamente da permissão da origem S3.
jq edita JSON preservando as demais configurações. --arg fornece os valores capturados como strings JSON. Os operadores | na expressão entre aspas aplicam três mudanças em sequência: alias, certificado personalizado e acesso https-only. A política de segurança selecionada exige TLS 1.2 ou posterior:
jq --arg host "$HOST_NAME" --arg cert "$CERT_ARN" '.Aliases = {Quantity: 1, Items: [$host]} |
.ViewerCertificate = {CloudFrontDefaultCertificate: false,
ACMCertificateArn: $cert, SSLSupportMethod: "sni-only",
MinimumProtocolVersion: "TLSv1.2_2021"} |
.DefaultCacheBehavior.ViewerProtocolPolicy = "https-only"' current-config.json > https-config.json
aws cloudfront update-distribution \
--id "$DIST_ID" \
--if-match "$ETAG" \
--distribution-config file://https-config.json
aws cloudfront wait distribution-deployed \
--id "$DIST_ID"
Inspecione os ajustes salvos antes de testar a conexão:
aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query 'DistributionConfig.{Names:Aliases.Items,Certificate:ViewerCertificate.ACMCertificateArn,Protocol:DefaultCacheBehavior.ViewerProtocolPolicy}'
Espere o nome exato, seu ARN e https-only. O AWS View mostra alias e certificado ACM associado. A configuração nativa está pronta; a próxima etapa comprova uma solicitação cifrada real. Execute a verificação de associação.

Verificar conteúdo cifrado e certificado
Nesta etapa, leia a página por HTTPS confiável, observe o acesso sem criptografia negado e diferencie confiança no certificado de correspondência do nome.
curl --cacert practice-ca.pem confia na CA pública preparada somente neste comando. --resolve conecta nome e porta exatos a esta VM preservando o nome para SNI e verificação. Não registra domínio público nem altera DNS do sistema. O endpoint HTTPS preparado usa a porta 8443:
curl --fail --include --noproxy '*' --cacert practice-ca.pem --resolve "${HOST_NAME}:8443:127.0.0.1" "https://${HOST_NAME}:8443/index.html"
Espere HTTP 200 e Release one. O cliente estabeleceu TLS real, verificou emissor e nome e recebeu a página S3 verdadeira. Isso comprova mais que um ARN salvo.
Teste o endpoint de usuário sem criptografia e a origem direta anônima:
curl --noproxy '*' --output /dev/null --resolve "${HOST_NAME}:8082:127.0.0.1" --write-out 'Plaintext viewer: HTTP %{http_code}\n' "http://${HOST_NAME}:8082/index.html"
curl --noproxy '*' --output /dev/null --write-out 'Anonymous origin: HTTP %{http_code}\n' http://127.0.0.1:5000/labex-n04-content/index.html
Ambos devem retornar HTTP 403. Exigir HTTPS do usuário não torna o bucket S3 público; são proteções separadas.
Agora omita o arquivo CA para testar a confiança. Este comando deve falhar deliberadamente:
curl --fail --noproxy '*' --resolve "${HOST_NAME}:8443:127.0.0.1" "https://${HOST_NAME}:8443/index.html"
Espere um erro de verificação, normalmente o erro 60 do curl: o armazenamento padrão não confia nesta CA privada. Continue após a falha esperada. A solicitação bem-sucedida escolheu a âncora correta; desativar a verificação removeria a proteção que você pratica.
openssl s_client separa o nome de seleção SNI do nome a verificar. Envie o SNI correto e confie na CA, mas peça um nome deliberadamente errado. -verify_return_error interrompe a verificação na falha, e < /dev/null evita entrada interativa:
openssl s_client -connect 127.0.0.1:8443 -servername "$HOST_NAME" -CAfile practice-ca.pem -verify_hostname wrong.labex-n04.test -verify_return_error < /dev/null
Espere hostname mismatch e falha de verificação. Confiar no emissor não basta: o certificado também deve cobrir a identidade solicitada. O AWS View conserva o resultado cifrado real e a rejeição sem criptografia. Execute a verificação HTTPS.


Remover somente seus recursos de distribuição
Nesta etapa, desative e exclua primeiro a distribuição, depois seu OAC, conteúdo S3 e certificado preparado. Preserve o bucket de referência.
CloudFront usa ETag como token de versão. Obtenha configuração e ETag atuais, sem adivinhar. Primeiro capture o OAC exato conectado à origem:
OAC_ID=$(aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query 'DistributionConfig.Origins.Items[0].OriginAccessControlId' \
--output text)
Salve a configuração e capture seu ETag:
aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query DistributionConfig \
--output json > distribution-current.json
DIST_ETAG=$(aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query ETag \
--output text)
Na configuração atual, Enabled da distribuição é o único atributo desse nome com valor true. A substituição normal com sed cria uma cópia desativada preservando a origem:
sed 's/"Enabled": true/"Enabled": false/' distribution-current.json > distribution-disabled.json
aws cloudfront update-distribution \
--id "$DIST_ID" \
--if-match "$DIST_ETAG" \
--distribution-config file://distribution-disabled.json
Espere a implantação da configuração desativada. A propagação na AWS pode levar tempo; este laboratório não mede o atraso mundial:
aws cloudfront wait distribution-deployed \
--id "$DIST_ID"
Atualizar muda o ETag. Leia o mais recente antes de excluir a distribuição desativada:
DIST_ETAG=$(aws cloudfront get-distribution-config \
--id "$DIST_ID" \
--query ETag \
--output text)
aws cloudfront delete-distribution \
--id "$DIST_ID" \
--if-match "$DIST_ETAG"
Exclua OAC com seu próprio ETag. Os IDs da distribuição e do OAC identificam recursos diferentes:
OAC_ETAG=$(aws cloudfront get-origin-access-control \
--id "$OAC_ID" \
--query ETag \
--output text)
aws cloudfront delete-origin-access-control \
--id "$OAC_ID" \
--if-match "$OAC_ETAG"
Exclua somente o objeto de conteúdo e o bucket do laboratório:
aws s3api delete-object \
--bucket labex-n04-content \
--key index.html
aws s3api delete-bucket \
--bucket labex-n04-content
aws s3api list-buckets \
--query 'Buckets[].Name'
Após excluir a distribuição, exclua somente o certificado preparado usando o ARN selecionado antes. Isso remove o recurso ACM; o arquivo público de CA pode permanecer como material local independente:
aws acm delete-certificate \
--certificate-arn "$CERT_ARN"
aws acm list-certificates \
--query 'CertificateSummaryList[].CertificateArn'
O certificado do laboratório deve estar ausente. O bucket de referência deve permanecer e o de conteúdo deve desaparecer. O AWS View deve mostrar nenhuma distribuição de conteúdo e apenas a referência. Execute a verificação da limpeza. Uma solicitação API que falhou não prova exclusão.

Resumo
Você associou um certificado ACM e um nome alternativo ao CloudFront, exigiu HTTPS e leu conteúdo real com TLS verificado. Diferenciou emissor confiável, nome correspondente, criptografia do usuário e acesso privado à origem. Solicitações sem criptografia foram negadas; verificações de emissor não confiável e nome errado falharam. Removeu somente seus recursos e o certificado do laboratório, preservando a referência independente.



