使用 JCE 提供者連線到多個叢集 - AWS CloudHSM

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

使用 JCE 提供者連線到多個叢集

此組態可讓單一用戶端執行個體與多個叢集進行通訊。與單一執行個體僅能與單一叢集進行通訊相比,該組態可節省某些使用案例的成本。該CloudHsmProvider類 AWS CloudHSM是 Java 安全提供程序類的實現。這個類的每個實例代表到整個 AWS CloudHSM 集群的連接。您可以將此類別實例化,並將其新增至 Java 安全提供者清單中,以便您可以使用標準的 JCE 類別與其進行互動。

下面範例會將此類別實例化,並將其新增至 Java 安全提供者清單:

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

CloudHsmProvider 組態

可以使用下列兩種方式來對 CloudHsmProvider 進行設定:

  1. 使用檔案進行設定 (預設組態)

  2. 使用程式碼設定

使用檔案進行設定 (預設組態)

當您使用預設建構函數實例化 CloudHsmProvider 時,根據預設,它會在 Linux 的 /opt/cloudhsm/etc/cloudhsm-jce.cfg 路徑中尋找組態檔案。可使用 configure-jce 設定此組態檔案。

使用預設的建構函數所建立的物件將會使用預設的 CloudHSM 提供者名稱 CloudHSM。提供者名稱有助於與 JCE 進行互動,以讓它了解各種作業應使用哪個提供者。以下為使用 CloudHSM 提供者名稱進行加密作業的範例:

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

使用程式碼設定

從用戶端 SDK 5.8.0 版開始,您還可以使用 Java 程式碼來設定 CloudHsmProvider。使用 CloudHsmProviderConfig 類別的物件可以進行設定。您可以使用 CloudHsmProviderConfigBuilder 建置此物件。

CloudHsmProvider 有另一個接受 CloudHsmProviderConfig 物件的建構函數,如下列範例顯示。

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

在此範例中,JCE 提供者的名稱為 CloudHsmCluster1。這是應用程式可用來與 JCE 互動的名稱:

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

或者,應用程式還可以使用上面建立的提供者物件,讓 JCE 了解要使用該提供者以進行作業:

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

如果未使用 withClusterUniqueIdentifier 方法指定唯一識別碼,則會為您建立一個隨機產生的提供者名稱。若要取得此隨機產生的識別碼,應用程式可以呼叫 provider.getName() 以取得識別碼。

連接至多個叢集

如上所述,每個 CloudHsmProvider 都代表與 CloudHSM 叢集的連線。如果您想要從同一個應用程式與另一個叢集進行通訊,您可以使用其他叢集的組態建立另一個物件 CloudHsmProvider,然後您可以使用提供者物件或使用提供者名稱與該叢集互動,如下列範例所顯示。

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

設定上述兩個提供者 (兩個叢集) 後,您可以使用提供者物件或使用提供者名稱與其進行互動。

擴展此示例,顯示如何交談cluster1,您可以使用以下示例進行 AES/GCM/ NoPadding 操作:

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

在同一個應用程序中使用提供者名稱在第二個叢集上產生「AES」金鑰,您還可以使用下列範例:

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