AEM Autenticación de seguridad de la capa de transporte mutuo (mTLS) desde el punto de vista de la seguridad de

AEM Obtenga información sobre cómo realizar llamadas HTTPS desde el punto de vista de la seguridad a las API web que requieren autenticación de Seguridad de capa de transporte mutuo (mTLS).

La autenticación mTLS o TLS bidireccional mejora la seguridad del protocolo TLS al requerir el cliente y el servidor para autenticarse mutuamente. Esta autenticación se realiza mediante certificados digitales. Se utiliza comúnmente en escenarios donde la seguridad sólida y la verificación de identidad son críticas.

De forma predeterminada, al intentar establecer una conexión HTTPS con una API web que requiera autenticación mTLS, la conexión falla con el siguiente error:

javax.net.ssl.SSLHandshakeException: Received fatal alert: certificate_required

Este problema se produce cuando el cliente no presenta un certificado para autenticarse a sí mismo.

Vamos a aprender a llamar correctamente a las API que requieren autenticación mTLS mediante Apache HttpClient y AEM KeyStore y TrustStore.

AEM HttpClient y cargar material de KeyStore de la

AEM En un nivel superior, se requieren los siguientes pasos para llamar a una API protegida con mTLS desde el.

AEM Generación de certificados de

AEM Solicite el certificado de asociándose con el equipo de seguridad de su organización. El equipo de seguridad proporciona o solicita los detalles relacionados con el certificado, como la clave, la solicitud de firma de certificado (CSR) y, mediante CSR, se emite el certificado.

Para fines de demostración, genere los detalles relacionados con el certificado, como la clave, la solicitud de firma de certificado (CSR). En el siguiente ejemplo, se utiliza una CA autofirmada para emitir el certificado.

  • En primer lugar, genere el certificado interno de la entidad de certificación (CA).

    code language-shell
    # Create an internal Certification Authority (CA) certificate
    openssl req -new -x509 -days 9999 -keyout internal-ca-key.pem -out internal-ca-cert.pem
    
  • AEM Genere el certificado de la.

    code language-shell
    # Generate Key
    openssl genrsa -out client-key.pem
    
    # Generate CSR
    openssl req -new -key client-key.pem -out client-csr.pem
    
    # Generate certificate and sign with internal Certification Authority (CA)
    openssl x509 -req -days 9999 -in client-csr.pem -CA internal-ca-cert.pem -CAkey internal-ca-key.pem -CAcreateserial -out client-cert.pem
    
    # Verify certificate
    openssl verify -CAfile internal-ca-cert.pem client-cert.pem
    
  • AEM AEM Convierta la clave privada en formato DER, ya que el almacén de claves requiere la clave privada en formato DER para la conversión de la clave privada a formato DER.

    code language-shell
    openssl pkcs8 -topk8 -inform PEM -outform DER -in client-key.pem -out client-key.der -nocrypt
    
TIP
Los certificados de CA firmados automáticamente solo se utilizan con fines de desarrollo. Para la producción, utilice una entidad emisora de certificados (CA) de confianza para emitir el certificado.

Intercambio de certificados

AEM Si utiliza una CA autofirmada para el certificado de la, como se ha indicado anteriormente, envíe el certificado o el certificado de la entidad de certificación (CA) interno al proveedor de la API.

Además, si el proveedor de API utiliza un certificado de CA autofirmado, reciba el certificado o el certificado de entidad de certificación (CA) interno del proveedor de API.

Importación de certificados

AEM Para importar certificados de, siga los siguientes pasos:

  1. Iniciar sesión en AEM Autor de como un administrador.

  2. Vaya a AEM Autor de la aplicación > Herramientas > Seguridad > Usuarios > Crear o seleccionar un usuario existente.

    Crear o seleccionar un usuario existente

    Para fines de demostración, un nuevo usuario denominado mtl-demo-user se ha creado.

  3. Para abrir Propiedades del usuario, haga clic en el nombre de usuario.

  4. Clic Keystore y luego haga clic en Crear almacén de claves botón. A continuación, en la Establecer contraseña de acceso a KeyStore , establezca una contraseña para el almacén de claves de este usuario y haga clic en Guardar.

    Crear almacén de claves

  5. En la nueva pantalla, en AÑADIR CLAVE PRIVADA DEL ARCHIVO DER , siga los siguientes pasos:

    1. Especificar alias

    2. AEM Importe la clave privada de la en formato DER, generado anteriormente.

    3. Importe los archivos de la cadena de certificados generados anteriormente.

    4. Haga clic en Enviar

      AEM Importar clave privada

  6. Compruebe que el certificado se haya importado correctamente.

    AEM Clave privada y certificado importados

AEM Si el proveedor de API utiliza un certificado de CA autofirmado, importe el certificado recibido en el almacén de confianza de la entidad emisora de certificados (TrustStore), siga los pasos que se indican a continuación: aquí.

AEM Del mismo modo, si el usuario utiliza un certificado de CA firmado automáticamente, solicite al proveedor de la API que lo importe.

Código de invocación de API de mTLS prototípico mediante HttpClient

Actualice el código Java™ como se muestra a continuación. Para usar @Reference AEM anotación para obtener la KeyStoreService servicio el código de llamada debe ser un componente/servicio OSGi o un modelo Sling (y @OsgiService se utiliza allí).

...

// Get AEM's KeyStoreService reference
@Reference
private com.adobe.granite.keystore.KeyStoreService keyStoreService;

...

// Get AEM KeyStore using KeyStoreService
KeyStore aemKeyStore = getAEMKeyStore(keyStoreService, resourceResolver);

if (aemKeyStore != null) {

    // Create SSL Context
    SSLContextBuilder sslbuilder = new SSLContextBuilder();

    // Load AEM KeyStore material into above SSL Context with keystore password
    // Ideally password should be encrypted and stored in OSGi config
    sslbuilder.loadKeyMaterial(aemKeyStore, "admin".toCharArray());

    // If API provider cert is self-signed, load AEM TrustStore material into above SSL Context
    // Get AEM TrustStore
    KeyStore aemTrustStore = getAEMTrustStore(keyStoreService, resourceResolver);
    sslbuilder.loadTrustMaterial(aemTrustStore, null);

    // Create SSL Connection Socket using above SSL Context
    SSLConnectionSocketFactory sslsf = new SSLConnectionSocketFactory(
            sslbuilder.build(), NoopHostnameVerifier.INSTANCE);

    // Create HttpClientBuilder
    HttpClientBuilder httpClientBuilder = HttpClientBuilder.create();
    httpClientBuilder.setSSLSocketFactory(sslsf);

    // Create HttpClient
    CloseableHttpClient httpClient = httpClientBuilder.build();

    // Invoke API
    closeableHttpResponse = httpClient.execute(new HttpGet(MTLS_API_ENDPOINT));

    // Code that reads response code and body from the 'closeableHttpResponse' object
    ...
}

/**
 * Returns the AEM KeyStore of a user. In this example we are using the
 * 'mtl-demo-user' user.
 *
 * @param keyStoreService
 * @param resourceResolver
 * @return AEM KeyStore
 */
private KeyStore getAEMKeyStore(KeyStoreService keyStoreService, ResourceResolver resourceResolver) {

    // get AEM KeyStore of 'mtl-demo-user' user, you can create a user or use an existing one.
    // Then create keystore and upload key, certificate files.
    KeyStore aemKeyStore = keyStoreService.getKeyStore(resourceResolver, "mtl-demo-user");

    return aemKeyStore;
}

/**
 *
 * Returns the global AEM TrustStore
 *
 * @param keyStoreService OOTB OSGi service that makes AEM based KeyStore
 *                         operations easy.
 * @param resourceResolver
 * @return
 */
private KeyStore getAEMTrustStore(KeyStoreService keyStoreService, ResourceResolver resourceResolver) {

    // get AEM TrustStore from the KeyStoreService and ResourceResolver
    KeyStore aemTrustStore = keyStoreService.getTrustStore(resourceResolver);

    return aemTrustStore;
}

...
  • Inyectar el OOTB com.adobe.granite.keystore.KeyStoreService Servicio OSGi en el componente OSGi.
  • AEM Obtener el almacén de claves de la clave de acceso del usuario mediante KeyStoreService y ResourceResolver, el getAEMKeyStore(...) El método hace eso.
  • AEM Si el proveedor de API utiliza un certificado de CA autofirmado, obtenga el almacén de confianza de la red global de certificados de la red (GitStore), el getAEMTrustStore(...) El método hace eso.
  • Crear un objeto de SSLContextBuilder, consulte Java™ Detalles de API.
  • AEM Cargue el almacén de claves de la clave de acceso del usuario en SSLContextBuilder usando loadKeyMaterial(final KeyStore keystore,final char[] keyPassword) método.
  • La contraseña del repositorio de claves es la contraseña que se estableció al crear el repositorio de claves; debe almacenarse en la configuración OSGi. Consulte Valores de configuración secretos.

Evitar cambios en el almacén de claves JVM

Un enfoque convencional para invocar de forma eficaz las API de mTLS con certificados privados implica la modificación del repositorio de claves JVM. Se logra importando los certificados privados mediante Java™ keytool comando.

AEM Sin embargo, este método no está alineado con las prácticas recomendadas de seguridad y ofrece una opción superior a través de la utilización del Almacenes de claves específicos del usuario y almacén de confianza global y KeyStoreService.

Paquete de soluciones

El proyecto Node.js de muestra degradado en el vídeo se puede descargar desde aquí.

AEM El código de servlet de la está disponible en el sitio web del proyecto WKND Sites tutorial/web-api-invocation rama, consulte.

recommendation-more-help
c92bdb17-1e49-4e76-bcdd-89e4f85f45e6