Nome de domínio personalizado com CDN gerenciado pelo cliente
Saiba como adicionar um nome de domínio personalizado a um site do AEM as a Cloud Service que usa uma CDN gerenciada pelo cliente.
Neste tutorial, a identidade visual do site AEM WKND de exemplo é aprimorada com a adição de um nome de domínio personalizado endereçável por HTTPS wkndviaawscdn.enablementadobe.com
com TLS (Transport Layer Security) usando uma CDN gerenciada pelo cliente. Neste tutorial, o AWS CloudFront é usado como a CDN gerenciada pelo cliente, no entanto, qualquer provedor de CDN deve ser compatível com o AEM as a Cloud Service.
As etapas de alto nível são:
{width="800" modal="regular"}
Pré-requisitos
-
Acesso a serviços de terceiros:
- Autoridade de Certificação (CA) - para solicitar o certificado assinado para o domínio do site, como DigitCert
- CDN do cliente - para configurar o CDN do cliente e adicionar certificados SSL e detalhes de domínio, como AWS CloudFront, CDN do Azure ou Akamai.
- Serviço de hospedagem de DNS (Sistema de Nomes de Domínio) - para adicionar registros DNS ao seu domínio personalizado, como Azure DNS ou AWS Route 53.
-
Acesso ao Adobe Cloud Manager para implantar a regra CDN de validação do Cabeçalho HTTP no ambiente do AEM as a Cloud Service.
-
O site AEM WKND de amostra foi implantado no ambiente AEM as a Cloud Service do tipo programa de produção.
Se você não tiver acesso a serviços de terceiros, colabore com a equipe de segurança ou hospedagem para concluir as etapas.
Gerar certificado SSL
Você tem duas opções:
- Usando a ferramenta de linha de comando
openssl
- você pode gerar uma chave privada e uma Solicitação de Assinatura de Certificado (CSR) para o domínio do site. Para solicitar um certificado assinado, envie a CSR a uma CA (Autoridade de Certificação). - Sua equipe de hospedagem fornece a chave privada necessária e o certificado assinado para o site.
Vamos analisar as etapas da primeira opção.
Para gerar uma chave privada e uma CSR, execute os seguintes comandos e forneça as informações necessárias quando solicitado:
# Generate a private key and a CSR
$ openssl req -newkey rsa:2048 -keyout <YOUR-SITE-NAME>.key -out <YOUR-SITE-NAME>.csr -nodes
Para solicitar um certificado assinado, forneça a CSR gerada à CA seguindo a documentação. Depois que a CA assinar a CSR, você receberá o arquivo de certificado assinado.
Revisar certificado assinado
Revisar o certificado assinado antes de adicioná-lo à Cloud Manager é uma boa prática. Você pode revisar os detalhes do certificado usando o seguinte comando:
# Review the certificate details
$ openssl crl2pkcs7 -nocrl -certfile <YOUR-SIGNED-CERT>.crt | openssl pkcs7 -print_certs -noout
O certificado assinado pode conter a cadeia de certificados, que inclui os certificados raiz e intermediário junto com o certificado da entidade final.
O Adobe Cloud Manager aceita o certificado de entidade final e a cadeia de certificados em campos de formulário separados, portanto, você deve extrair o certificado de entidade final e a cadeia de certificados do certificado assinado.
Neste tutorial, o certificado assinado DigitCert emitido para o domínio *.enablementadobe.com
é usado como exemplo. A entidade final e a cadeia de certificados são extraídas abrindo o certificado assinado em um editor de texto e copiando o conteúdo entre os marcadores -----BEGIN CERTIFICATE-----
e -----END CERTIFICATE-----
.
Configurar a CDN gerenciada pelo cliente
Configure o CDN do cliente, como AWS CloudFront, Azure CDN ou Akamai, e adicione o certificado SSL e os detalhes do domínio. Neste tutorial, o AWS CloudFront é usado como exemplo. No entanto, dependendo do fornecedor de CDN, as etapas podem variar. As principais chamadas de retorno são:
- Adicione o certificado SSL ao CDN.
- Adicione o nome de domínio personalizado à CDN.
- Configure a CDN para armazenar o conteúdo em cache, como imagens, CSS e arquivos JavaScript.
- Adicione o cabeçalho HTTP
X-Forwarded-Host
às configurações de CDN para que sua CDN inclua esse cabeçalho em todas as solicitações enviadas à origem do AEMCD. - Verifique se o valor do cabeçalho
Host
está definido como o domínio padrão do AEM as a Cloud Service que contém a ID do programa e do ambiente e que termina comadobeaemcloud.com
. O valor do cabeçalho do host HTTP passado do CDN do cliente para o CDN do Adobe deve ser o domínio padrão do AEM as a Cloud Service. Qualquer outro valor deve resultar em um estado de erro.
Configurar registros DNS
Para configurar o registro DNS para seu domínio personalizado, siga estas etapas,
- Adicione um registro CNAME para o domínio personalizado que aponta para o nome de domínio CDN.
Este tutorial adiciona um registro CNAME ao DNS do Azure para o domínio personalizado wkndviaawscdn.enablementadobe.com
e o aponta para o nome do domínio de distribuição do AWS CloudFront.
Verificação do site
Verifique o nome de domínio personalizado acessando o site com o nome de domínio personalizado.
Pode ou não funcionar, dependendo da configuração do vhhost no ambiente do AEM as a Cloud Service.
Uma etapa de segurança crucial é implantar a regra CDN de validação de cabeçalho HTTP no ambiente do AEM as a Cloud Service. A regra garante que a solicitação vem da CDN do cliente e não de qualquer outra fonte.
Estado de trabalho atual sem a regra CDN de validação do Cabeçalho HTTP
Sem a regra CDN de validação do Cabeçalho HTTP, o valor do cabeçalho Host
é definido como o domínio padrão do AEM as a Cloud Service que contém a ID do programa e do ambiente e termina com adobeaemcloud.com
. O CDN do Adobe transforma o valor do cabeçalho Host
no valor de X-Forwarded-Host
recebido do CDN do cliente somente se a regra CDN de validação do Cabeçalho HTTP for implantada. Caso contrário, o valor do cabeçalho Host
será passado como está para o ambiente AEM as a Cloud Service e o cabeçalho X-Forwarded-Host
não será usado.
Exemplo de código de servlet para imprimir o valor do cabeçalho do Host
O código de servlet a seguir imprime os valores do cabeçalho HTTP Host
, X-Forwarded-*
, Referer
e Via
na resposta JSON.
package com.adobe.aem.guides.wknd.core.servlets;
import java.io.IOException;
import java.util.Enumeration;
import javax.servlet.Servlet;
import javax.servlet.ServletException;
import org.apache.sling.api.SlingHttpServletRequest;
import org.apache.sling.api.SlingHttpServletResponse;
import org.apache.sling.api.resource.ResourceResolverFactory;
import org.apache.sling.api.servlets.HttpConstants;
import org.apache.sling.api.servlets.ServletResolverConstants;
import org.apache.sling.api.servlets.SlingSafeMethodsServlet;
import org.osgi.service.component.annotations.Component;
import org.osgi.service.component.annotations.Reference;
@Component(service = Servlet.class, property = {
ServletResolverConstants.SLING_SERVLET_PATHS + "=/bin/verify-headers",
ServletResolverConstants.SLING_SERVLET_METHODS + "=" + HttpConstants.METHOD_GET
})
public class VerifyHeadersServlet extends SlingSafeMethodsServlet {
@Reference
private ResourceResolverFactory resourceResolverFactory;
@Override
protected void doGet(SlingHttpServletRequest request, SlingHttpServletResponse response)
throws ServletException, IOException {
response.setContentType("application/json");
response.setCharacterEncoding("UTF-8");
// Create JSON response
StringBuilder jsonResponse = new StringBuilder();
jsonResponse.append("{");
Enumeration<String> headerNames = request.getHeaderNames();
boolean firstHeader = true;
while (headerNames.hasMoreElements()) {
String headerName = headerNames.nextElement();
if (headerName.startsWith("X-Forwarded-") || headerName.startsWith("Host")
|| headerName.startsWith("Referer") || headerName.startsWith("Via")) {
if (!firstHeader) {
jsonResponse.append(",");
}
jsonResponse.append("\"").append(headerName).append("\": \"").append(request.getHeader(headerName))
.append("\"");
firstHeader = false;
}
}
jsonResponse.append("}");
response.getWriter().write(jsonResponse.toString());
}
}
Para testar o servlet, atualize o arquivo ../dispatcher/src/conf.dispatcher.d/filters/filters.any
com a seguinte configuração. Verifique também se o CDN está configurado para NÃO armazenar em cache o caminho /bin/*
.
# Testing purpose bin
/0300 { /type "allow" /extension "json" /path "/bin/*"}
/0301 { /type "allow" /path "/bin/*"}
/0302 { /type "allow" /url "/bin/*"}
Configurar e implantar a regra CDN de validação do Cabeçalho HTTP
Para configurar e implantar a regra CDN de validação do Cabeçalho HTTP, siga estas etapas:
-
Adicione a regra CDN de validação de Cabeçalho HTTP ao arquivo
cdn.yaml
. Um exemplo é fornecido abaixo.code language-yaml kind: "CDN" version: "1" metadata: envTypes: ["prod"] data: authentication: authenticators: - name: edge-auth type: edge edgeKey1: ${{CDN_EDGEKEY_080124}} edgeKey2: ${{CDN_EDGEKEY_110124}} rules: - name: edge-auth-rule when: { reqProperty: tier, equals: "publish" } action: type: authenticate authenticator: edge-auth
-
Crie variáveis de ambiente do tipo secreto (CDN_EDGEKEY_080124, CDN_EDGEKEY_110124) usando a interface do Cloud Manager.
-
Implante a regra CDN de validação de cabeçalho HTTP no ambiente do AEM as a Cloud Service usando o pipeline do Cloud Manager.
Passar segredo no cabeçalho HTTP X-AEM-Edge-Key
Atualize o CDN do cliente para transmitir o segredo no Cabeçalho HTTP X-AEM-Edge-Key
. O segredo é usado pelo CDN do Adobe para validar se a solicitação vem do CDN do cliente e transformar o valor do cabeçalho Host
no valor do X-Forwarded-Host
recebido do CDN do cliente.
Vídeo completo
Você também pode assistir ao vídeo completo que demonstra as etapas acima para adicionar um nome de domínio personalizado com um CDN gerenciado pelo cliente a um site hospedado pela AEM as a Cloud Service.