

Las traducciones son generadas a través de traducción automática. En caso de conflicto entre la traducción y la version original de inglés, prevalecerá la version en inglés.

# Configuraciones avanzadas para AWS CloudHSM JCE for Client SDK 5
<a name="java-lib-configs"></a>

El proveedor de AWS CloudHSM JCE incluye las siguientes configuraciones avanzadas, que no forman parte de las configuraciones generales que utilizan la mayoría de los clientes.
+ [Conexión a múltiples clústeres](java-lib-configs-multi.md)
+ [Extracción de claves mediante JCE](java-lib-configs-getencoded.md)
+ [Vuelva a intentar la configuración del JCE](java-lib-configs-retry.md).

# Conexión a varios AWS CloudHSM clústeres con el proveedor de JCE
<a name="java-lib-configs-multi"></a>

Esta configuración permite que una sola instancia de cliente se comunique con varios clústeres de AWS CloudHSM . En comparación con tener una sola instancia que solo se comunique con un único clúster, esta característica puede suponer un ahorro de costos en algunos casos de uso. La `CloudHsmProvider` clase es AWS CloudHSM la implementación de la [clase Provider de Java Security](https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html). Cada instancia de esta clase representa una conexión a todo el AWS CloudHSM clúster. Cree una instancia de esta clase y añádala a la lista de proveedores de seguridad de Java para poder interactuar con ella mediante clases de JCE estándar.

En el siguiente ejemplo, se crea una instancia de esta clase y se añade a la lista de proveedores de seguridad de Java:

```
if (Security.getProvider(CloudHsmProvider.PROVIDER_NAME) == null) {
    Security.addProvider(new CloudHsmProvider());
}
```

`CloudHsmProvider` puede configurarse de dos formas:

1. Configurar con un archivo (configuración predeterminada)

1. Configuración mediante código

En los siguientes temas, se describen estas configuraciones y cómo conectarse a varios clústeres.

**Topics**
+ [Configurar la clase `CloudHsmProvider` de AWS CloudHSM con un archivo (configuración predeterminada)](java-lib-configs-default.md)
+ [Configurar la clase `CloudHsmProvider` de AWS CloudHSM con un código](java-lib-configs-using-code.md)
+ [Conéctese a varios AWS CloudHSM clústeres](java-lib-connecting-to-multiclusters.md)

# Configurar la clase `CloudHsmProvider` de AWS CloudHSM con un archivo (configuración predeterminada)
<a name="java-lib-configs-default"></a>

La forma predeterminada de configurar la AWS CloudHSM `CloudHsmProvider` clase es con un archivo.

Al iniciar `CloudHsmProvider` con el constructor predeterminado, de forma predeterminada buscará el archivo de configuración en la ruta `/opt/cloudhsm/etc/cloudhsm-jce.cfg` en Linux. Este archivo de configuración se puede configurar usando `configure-jce`. 

Un objeto creado con el constructor predeterminado utilizará el nombre de proveedor de CloudHSM predeterminado `CloudHSM`. El nombre del proveedor es útil para interactuar con el JCE y decirle qué proveedor debe utilizar para las distintas operaciones. A continuación, se muestra un ejemplo de cómo utilizar el nombre del proveedor de CloudHSM para la operación de cifrado:

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "CloudHSM");
```

# Configurar la clase `CloudHsmProvider` de AWS CloudHSM con un código
<a name="java-lib-configs-using-code"></a>

A partir de la versión 5.8.0 del SDK de cliente, también puede configurar la AWS CloudHSM `CloudHsmProvider` clase mediante código Java. La forma de hacerlo es utilizando un objeto de clase `CloudHsmProviderConfig`. Puede construir este objeto utilizando `CloudHsmProviderConfigBuilder`. 

`CloudHsmProvider` tiene otro constructor que toma el objeto `CloudHsmProviderConfig`, como se muestra en el siguiente ejemplo.

**Example**  

```
CloudHsmProviderConfig config = CloudHsmProviderConfig.builder()  
                                    .withCluster(  
                                        CloudHsmCluster.builder()  
                                            .withHsmCAFilePath(hsmCAFilePath)
                                            .withClusterUniqueIdentifier("CloudHsmCluster1")
        .withServer(CloudHsmServer.builder().withHostIP(hostName).build())  
                        .build())  
        .build();
CloudHsmProvider provider = new CloudHsmProvider(config);
```

En este ejemplo, el nombre del proveedor JCE es `CloudHsmCluster1`. Este es el nombre que la aplicación puede utilizar posteriormente para interactuar con JCE.

**Example**  

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", "CloudHsmCluster1");
```

Como alternativa, las aplicaciones también pueden usar el objeto de proveedor creado anteriormente para que JCE sepa que debe usar ese proveedor para la operación:

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", provider);
```

Si no se especifica un identificador único con el método de `withClusterUniqueIdentifier`, se crea para usted un nombre de proveedor generado aleatoriamente. Para obtener este identificador generado aleatoriamente, las aplicaciones pueden llamar `provider.getName()` para obtener el identificador.

# Conéctese a varios AWS CloudHSM clústeres
<a name="java-lib-connecting-to-multiclusters"></a>

Cada uno `CloudHsmProvider` representa una conexión a su AWS CloudHSM clúster. Si desea comunicarse con otro clúster desde la misma aplicación, puede crear otro objeto de `CloudHsmProvider` con las configuraciones del otro clúster e interactuar con este otro clúster mediante el objeto del proveedor o el nombre del proveedor, como se muestra en el siguiente ejemplo.

**Example**  

```
CloudHsmProviderConfig config = CloudHsmProviderConfig.builder()  
                                    .withCluster(  
                                        CloudHsmCluster.builder()  
                                            .withHsmCAFilePath(hsmCAFilePath)
                                            .withClusterUniqueIdentifier("CloudHsmCluster1")
        .withServer(CloudHsmServer.builder().withHostIP(hostName).build())  
                        .build())  
        .build();
CloudHsmProvider provider1 = new CloudHsmProvider(config);

if (Security.getProvider(provider1.getName()) == null) {
    Security.addProvider(provider1);
}

CloudHsmProviderConfig config2 = CloudHsmProviderConfig.builder()  
                                    .withCluster(  
                                        CloudHsmCluster.builder()  
                                            .withHsmCAFilePath(hsmCAFilePath2)
                                            .withClusterUniqueIdentifier("CloudHsmCluster2")
        .withServer(CloudHsmServer.builder().withHostIP(hostName2).build())  
                        .build())  
        .build();
CloudHsmProvider provider2 = new CloudHsmProvider(config2);

if (Security.getProvider(provider2.getName()) == null) {
    Security.addProvider(provider2);
}
```

Una vez que haya configurado los dos proveedores (ambos clústeres) anteriores, podrá interactuar con ellos mediante el objeto del proveedor o mediante el nombre del proveedor. 

Ampliando este ejemplo que muestra cómo hablar con`cluster1`, puede utilizar el siguiente ejemplo para una AES/GCM/NoPadding operación:

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", provider1);
```

Y en la misma aplicación para generar la clave «AES» en el segundo clúster con el nombre del proveedor, también puede usar el siguiente ejemplo:

```
Cipher cipher = Cipher.getInstance("AES/GCM/NoPadding", provider2.getName());
```

# Extracción de claves mediante JCE para AWS CloudHSM
<a name="java-lib-configs-getencoded"></a>

La extensión de criptografía de Java (JCE) utiliza una arquitectura que permite conectar diferentes implementaciones de criptografía. AWS CloudHSM envía uno de esos proveedores de JCE que transfiere las operaciones criptográficas al HSM. Para que la mayoría de los demás proveedores de JCE trabajen con claves almacenadas en AWS CloudHSM, deben extraer los bytes clave del texto sin cifrar y llevarlos a la memoria HSMs de la máquina para su uso. HSMs por lo general, solo permiten extraer las claves como objetos empaquetados, no como texto claro. Sin embargo, para facilitar los casos de uso de la integración entre proveedores, ofrece una opción de configuración opcional que AWS CloudHSM permite extraer los bytes clave en blanco.

**importante**  
JCE transfiere las operaciones a AWS CloudHSM cada vez que se especifique el proveedor de AWS CloudHSM o se utilice un objeto clave. AWS CloudHSM No necesita extraer las claves sin cifrar si espera que la operación se lleve a cabo dentro del HSM. La extracción de claves en texto no cifrado solo es necesaria cuando la aplicación no puede utilizar mecanismos seguros, como encapsular y desencapsular una clave, debido a las restricciones de una biblioteca externa o de un proveedor de JCE. 

De forma predeterminada, el proveedor de AWS CloudHSM JCE permite la extracción de **claves públicas** para que funcionen con proveedores de JCE externos. Siempre se permiten los siguientes métodos:


| Clase | Método | Formato (GetEncoded) | 
| --- | --- | --- | 
| EcPublicKey | getEncoded() | X.509 | 
|  | getW() | N/A | 
| RSAPublicClave | getEncoded() | X.509 | 
|  | getPublicExponent() | N/A | 
| CloudHsmRsaPrivateCrtKey | getPublicExponent() | N/A | 

El proveedor AWS CloudHSM JCE no permite la extracción de los bytes de la clave en blanco para las claves **privadas** o **secretas** de forma predeterminada. Si su caso de uso lo requiere, puede habilitar la extracción de los bytes de claves sin cifrar para claves **privadas** o **secretas** en las siguientes condiciones:

1. El atributo `EXTRACTABLE` para claves privadas y secretas se establece como **true**.
   + De forma predeterminada, el atributo `EXTRACTABLE` de las claves privadas y secretas está establecido como **true**. Las claves de `EXTRACTABLE` son claves que se pueden exportar fuera del HSM. Para obtener más información, consulte Atributos de Java admitidos para [SDK 5 de cliente](java-lib-attributes_5.md).

1. El atributo `WRAP_WITH_TRUSTED` para claves privadas y secretas se establece en **false**. 
   + `getEncoded`, `getPrivateExponent` y `getS` no se pueden usar con claves privadas que no se puedan exportar sin cifrar. `WRAP_WITH_TRUSTED` no permite exportar sus claves privadas fuera del HSM de sin cifrar. Para obtener más información, consulte [Cómo usar claves de confianza para controlar el desencapsulamiento de claves](manage-keys-using-trusted-keys.md).

# Permita que el proveedor de JCE extraiga los secretos de las claves privadas de AWS CloudHSM
<a name="get-encoded-take-out-private-keys"></a>

Siga los siguientes pasos para permitir que el proveedor de AWS CloudHSM JCE extraiga sus secretos de clave privada.

**importante**  
Este cambio de configuración permite extraer todos los bytes de claves `EXTRACTABLE` sin procesar del clúster de HSM. Para mejorar la seguridad, debería considerar la posibilidad de utilizar [métodos de encapsulamiento de claves](java-lib-supported_5.md) para extraer la clave del HSM de forma segura. Esto evita la extracción involuntaria de los bytes clave del HSM. 

1. Utilice los siguientes comandos para permitir que sus claves **privadas** o **secretas** se extraigan en JCE:

------
#### [ Linux ]

   ```
   $ /opt/cloudhsm/bin/configure-jce --enable-clear-key-extraction-in-software
   ```

------
#### [ Windows ]

   ```
   PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\configure-jce.exe" --enable-clear-key-extraction-in-software
   ```

------

1. Una vez que habilite la extracción de claves sin cifrar, se habilitarán los siguientes métodos para extraer las claves privadas de la memoria.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/es_es/cloudhsm/latest/userguide/get-encoded-take-out-private-keys.html)

Si quiere restaurar el comportamiento predeterminado y no permitir que JCE exporte las claves en formato sin cifrar, ejecute el siguiente comando:

------
#### [ Linux ]

```
$ /opt/cloudhsm/bin/configure-jce --disable-clear-key-extraction-in-software
```

------
#### [ Windows ]

```
PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\configure-jce.exe" --disable-clear-key-extraction-in-software
```

------

# Vuelva a intentar los comandos de JCE para AWS CloudHSM
<a name="java-lib-configs-retry"></a>

AWS CloudHSM El SDK de cliente 5.8.0 y las versiones posteriores tienen una estrategia de reintento automático integrada que reintentará las operaciones reguladas por HSM desde el lado del cliente. Cuando un HSM limita las operaciones porque está demasiado ocupado realizando operaciones anteriores y no puede aceptar más solicitudes, el cliente intentará volver a intentar las operaciones restringidas hasta 3 veces y, al mismo tiempo, SDKs retrocederá exponencialmente. Esta estrategia de reintento automático se puede configurar en uno de estos dos modos: **desactivado** y **estándar**.
+ **desactivado**: el SDK de cliente no realizará ninguna estrategia de reintentos para ninguna operación limitada por parte del HSM.
+ **estándar**: este es el modo predeterminado para la versión 5.8.0 y posteriores de SDK de cliente. En este modo, el cliente SDKs volverá a intentar automáticamente las operaciones restringidas y se retrasará exponencialmente.

Para obtener más información, consulte [Limitación de HSM](troubleshoot-hsm-throttling.md).

## Configuración de los comandos de reintento en modo desactivado
<a name="w2aac25c21c25c25c15b9"></a>

------
#### [ Linux ]

**Cómo configurar los comandos de reintento en **off** para SDK 5 de cliente en Linux**
+ Puede utilizar los siguientes comandos para administrar la configuración de reintento en modo **off**:

  ```
  $ sudo /opt/cloudhsm/bin/configure-jce --default-retry-mode off
  ```

------
#### [ Windows ]

**Cómo configurar los comandos de reintento en **off** para SDK 5 de cliente en Windows**
+ Puede utilizar los siguientes comandos para administrar la configuración de reintento en modo **off**:

  ```
  PS C:\> & "C:\Program Files\Amazon\CloudHSM\bin\configure-jce.exe" --default-retry-mode off
  ```

------