Nombre de dominio personalizado con CDN administrada por el cliente
Aprenda a agregar un nombre de dominio personalizado a un sitio web de AEM as a Cloud Service que use un CDN administrado por el cliente.
AEM En este tutorial, la marca del sitio de muestra WKND se ha mejorado al agregar un nombre de dominio personalizado wkndviaawscdn.enablementadobe.com
al que se puede dirigir mediante HTTPS con Seguridad de la capa de transporte (TLS) mediante una CDN administrada por el cliente. En este tutorial, AWS CloudFront se utiliza como CDN administrada por el cliente, pero cualquier proveedor de CDN debe ser compatible con AEM as a Cloud Service.
Los pasos de alto nivel son los siguientes:
{width="800" modal="regular"}
Requisitos previos
-
Acceso a servicios de terceros:
- Autoridad de certificación (CA): para solicitar el certificado firmado para el dominio del sitio, como DigitCert
- CDN del cliente: para configurar la CDN del cliente y agregar certificados SSL y detalles de dominio, como AWS CloudFront, Azure CDN o Akamai.
- Servicio de alojamiento del Sistema de nombres de dominio (DNS): para agregar registros DNS para su dominio personalizado, como Azure DNS o AWS Route 53.
-
Acceso a Cloud Manager de Adobe para implementar la regla de CDN de validación de encabezado HTTP en el entorno de AEM as a Cloud Service.
-
AEM El sitio de muestra WKND se ha implementado en el entorno de AEM as a Cloud Service del tipo programa de producción.
Si no tiene acceso a servicios de terceros, colabore con su equipo de seguridad o de alojamiento para completar los pasos.
Generar certificado SSL
Tiene dos opciones:
- Con la herramienta de línea de comandos
openssl
, puede generar una clave privada y una solicitud de firma de certificado (CSR) para el dominio del sitio. Para solicitar un certificado firmado, envíe el CSR a una entidad emisora de certificados (CA). - El equipo de alojamiento proporciona la clave privada y el certificado firmado necesarios para el sitio.
Revisemos los pasos de la primera opción.
Para generar una clave privada y una CSR, ejecute los siguientes comandos y proporcione la información necesaria cuando se le solicite:
# 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 un certificado firmado, proporcione el CSR generado a la CA siguiendo su documentación. Una vez que la CA firme el CSR, recibirá el archivo de certificado firmado.
Revisar certificado firmado
Es recomendable revisar el certificado firmado antes de agregarlo a Cloud Manager. Puede revisar los detalles del certificado mediante el siguiente comando:
# Review the certificate details
$ openssl crl2pkcs7 -nocrl -certfile <YOUR-SIGNED-CERT>.crt | openssl pkcs7 -print_certs -noout
El certificado firmado puede contener la cadena de certificados, que incluye los certificados raíz e intermedios junto con el certificado de entidad final.
El Cloud Manager de Adobe acepta el certificado de entidad final y la cadena de certificado en campos de formulario independientes, por lo que debe extraer el certificado de entidad final y la cadena de certificado del certificado firmado.
En este tutorial, se usa como ejemplo el certificado firmado de DigitCert emitido contra el dominio *.enablementadobe.com
. La entidad final y la cadena de certificados se extraen abriendo el certificado firmado en un editor de texto y copiando el contenido entre los marcadores -----BEGIN CERTIFICATE-----
y -----END CERTIFICATE-----
.
Configurar CDN administrado por el cliente
Configure la CDN del cliente, como AWS Cloud Front, Azure CDN o Akamai, y añada el certificado SSL y los detalles de dominio. En este tutorial, se utiliza AWS CloudFront como ejemplo. Sin embargo, según el proveedor de CDN, los pasos pueden variar. Las llamadas clave son:
- Añada el certificado SSL a la CDN.
- Añada el nombre de dominio personalizado a la CDN.
- Configure la CDN para almacenar en caché el contenido, como imágenes, CSS y archivos JavaScript.
- Agregue el encabezado HTTP
X-Forwarded-Host
a la configuración de la CDN para que la CDN incluya este encabezado en todas las solicitudes que envía al origen de AEMCD. - Asegúrese de que el valor del encabezado
Host
esté establecido en el dominio de AEM as a Cloud Service predeterminado que contiene el ID de programa y entorno y termina conadobeaemcloud.com
. El valor de la cabecera del host HTTP pasado desde la CDN del cliente a la CDN de Adobe debe ser el dominio de AEM as a Cloud Service predeterminado; cualquier otro valor genera un estado de error.
Configuración de registros DNS
Para configurar el registro DNS para su dominio personalizado, siga estos pasos,
- Agregue un registro CNAME para el dominio personalizado que apunte al nombre de dominio CDN.
Este tutorial agrega un registro CNAME al DNS de Azure para el dominio personalizado wkndviaawscdn.enablementadobe.com
y lo señala al nombre de dominio de distribución de AWS CloudFront.
Verificación del sitio
Compruebe el nombre de dominio personalizado accediendo al sitio utilizando el nombre de dominio personalizado.
Puede funcionar o no según la configuración de vhhost en el entorno de AEM as a Cloud Service.
Un paso de seguridad crucial es implementar la regla CDN de validación de encabezado HTTP en el entorno de AEM as a Cloud Service. La regla garantiza que la solicitud proviene de la CDN del cliente y no de ninguna otra fuente.
Estado de trabajo actual sin la regla de CDN de validación de encabezado HTTP
Sin la regla de CDN de validación de encabezado HTTP, el valor del encabezado Host
se establece en el dominio de AEM as a Cloud Service predeterminado que contiene el ID de programa y entorno y termina con adobeaemcloud.com
. La CDN de Adobe transforma el valor del encabezado Host
en el valor de X-Forwarded-Host
recibido de la CDN del cliente solo si se implementa la regla CDN de validación de encabezado HTTP. De lo contrario, el valor del encabezado Host
se pasa tal cual al entorno de AEM as a Cloud Service y no se utiliza el encabezado X-Forwarded-Host
.
Código servlet de ejemplo para imprimir el valor del encabezado Host
El siguiente código de servlet imprime los valores de encabezado HTTP Host
, X-Forwarded-*
, Referer
y Via
en la respuesta 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 probar el servlet, actualice el archivo ../dispatcher/src/conf.dispatcher.d/filters/filters.any
con la configuración siguiente. Asegúrese también de que la CDN está configurada para NO almacenar en caché la ruta de acceso /bin/*
.
# Testing purpose bin
/0300 { /type "allow" /extension "json" /path "/bin/*"}
/0301 { /type "allow" /path "/bin/*"}
/0302 { /type "allow" /url "/bin/*"}
Configurar e implementar la regla de CDN de validación de encabezado HTTP
Para configurar e implementar la regla CDN de validación de encabezado HTTP, siga estos pasos:
-
Agregue la regla CDN de validación de encabezado HTTP en el archivo
cdn.yaml
. A continuación se proporciona un ejemplo.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
-
Cree variables de entorno de tipo secreto (CDN_EDGEKEY_080124, CDN_EDGEKEY_110124) mediante la interfaz de usuario de Cloud Manager.
-
Implemente la regla CDN de validación de encabezado HTTP en el entorno de AEM as a Cloud Service mediante la canalización de Cloud Manager.
AEM Pasar secreto en el encabezado HTTP X–Edge-Key
Actualice la CDN del cliente para pasar el secreto en el encabezado HTTP X-AEM-Edge-Key
. El secreto lo utiliza la CDN de Adobe para validar que la solicitud proviene de la CDN del cliente y transformar el valor del encabezado Host
al valor de X-Forwarded-Host
recibido de la CDN del cliente.
Vídeo de principio a fin
También puede ver el vídeo completo que muestra los pasos anteriores para agregar un nombre de dominio personalizado con una CDN administrada por el cliente a un sitio alojado en AEM as a Cloud Service.