Conectando-se a vários clusters com o provedor JCE - AWS CloudHSM

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Conectando-se a vários clusters com o provedor JCE

Essa configuração permite que uma única instância cliente se comunique com vários clusters. Comparado a ter uma única instância se comunicando apenas com um único cluster, esse pode ser um atributo de economia de custos para alguns casos de uso. A CloudHsmProvider classe é a implementação AWS CloudHSM da classe Provider da Java Security. Cada instância dessa classe representa uma conexão com todo o AWS CloudHSM cluster. Você instancia essa classe e a adiciona à lista do provedor de segurança Java para poder interagir com ela usando classes JCE padrão.

O exemplo a seguir instancia essa classe e a adiciona à lista do provedor de segurança Java:

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

Configuração de CloudHsmProvider

CloudHsmProviderpode ser configurado de duas maneiras:

  1. Configurar com arquivo (configuração padrão)

  2. Configurar usando código

Configurar com arquivo (configuração padrão)

Quando você instancia CloudHsmProvider usando o construtor padrão, por padrão, ele procurará o arquivo de configuração no /opt/cloudhsm/etc/cloudhsm-jce.cfg caminho no Linux. Esse arquivo de configuração pode ser configurado usando configure-jce.

Um objeto criado usando o construtor padrão usará o nome padrão do provedor do CloudHSM CloudHSM. O nome do provedor é útil para interagir com o JCE para que ele saiba qual provedor usar para várias operações. Um exemplo de uso do nome do provedor CloudHSM para a operação Cipher é o seguinte:

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

Configurar usando código

A partir do Client SDK versão 5.8.0, você também pode configurar o CloudHsmProvider usando o código Java. A maneira de fazer isso é usando um objeto de CloudHsmProviderConfig classe. Você pode criar esse objeto usandoCloudHsmProviderConfigBuilder.

CloudHsmProvidertem outro construtor que pega o CloudHsmProviderConfig objeto, como mostra o exemplo a seguir.

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

Neste exemplo, o nome do provedor do JCE éCloudHsmCluster1. Esse é o nome que o aplicativo pode então usar para interagir com o JCE:

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

Como alternativa, os aplicativos também podem usar o objeto provedor criado acima para informar à JCE que deve usar esse provedor para a operação:

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

Se um identificador exclusivo não for especificado com o método withClusterUniqueIdentifier, um nome de provedor gerado aleatoriamente será criado para você. Para obter esse identificador gerado aleatoriamente, os aplicativos podem chamar provider.getName() para obter o identificador.

Conectando-se a vários clusters

Conforme mencionado acima, cada CloudHsmProvider representa uma conexão com seu cluster do CloudHSM. Se quiser se comunicar com outro cluster do mesmo aplicativo, você pode criar outro objeto de CloudHsmProvider com configurações para seu outro cluster e interagir com esse outro cluster usando o objeto provedor ou usando o nome do provedor, conforme mostrado no exemplo a seguir.

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); }

Depois de configurar os dois provedores (os dois clusters) acima, você pode interagir com eles usando o objeto do provedor ou usando o nome do provedor.

Expandindo esse exemplo que mostra como falar comcluster1, você pode usar o exemplo a seguir para uma operação NoPadding AES/GCM/:

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

E no mesmo aplicativo para fazer a geração da chave “AES” no segundo cluster usando o nome do provedor, você também pode usar o seguinte exemplo:

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