

기계 번역으로 제공되는 번역입니다. 제공된 번역과 원본 영어의 내용이 상충하는 경우에는 영어 버전이 우선합니다.

# 클라이언트 SDK 5용 AWS CloudHSM JCE의 고급 구성
<a name="java-lib-configs"></a>

 AWS CloudHSM JCE 공급자에는 대부분의 고객이 활용하는 일반 구성의 일부가 아닌 다음과 같은 고급 구성이 포함되어 있습니다.
+ [여러 클러스터에 연결](java-lib-configs-multi.md)
+ [JCE를 사용한 키 추출](java-lib-configs-getencoded.md)
+ [JCE 구성 재시도](java-lib-configs-retry.md)

# JCE 공급자를 사용하여 여러 AWS CloudHSM 클러스터에 연결
<a name="java-lib-configs-multi"></a>

이 구성을 사용하면 단일 클라이언트 인스턴스가 여러 AWS CloudHSM 클러스터와 통신할 수 있습니다. 단일 인스턴스가 단일 클러스터와만 통신하는 것과 비교하면 일부 사용 사례에서는 이 기능을 통해 비용을 절감할 수 있습니다. `CloudHsmProvider` 클래스는 Java Security의 공급자 클래스를 AWS CloudHSM구현한 것입니다. [https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html](https://docs.oracle.com/javase/8/docs/api/java/security/Provider.html) 이 클래스의 각 인스턴스는 전체 AWS CloudHSM 클러스터에 대한 연결을 나타냅니다. 이 클래스를 인스턴스화하고 Java Security 공급자 목록에 추가하면 표준 JCE 클래스를 사용하여 이 클래스와 상호 작용할 수 있습니다.

다음 예제는 이 클래스를 인스턴스화하여 Java Security 공급자 목록에 추가합니다.

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

`CloudHsmProvider` 다음 두 가지 방법으로 구성할 수 있습니다:

1. 파일로 구성(기본 구성)

1. 코드로 구성

다음 주제에서는 이러한 구성과 여러 클러스터에 연결하는 방법을 설명합니다.

**Topics**
+ [파일로 AWS CloudHSM `CloudHsmProvider` 클래스 구성(기본 구성)](java-lib-configs-default.md)
+ [코드를 사용하여 AWS CloudHSM `CloudHsmProvider` 클래스 구성](java-lib-configs-using-code.md)
+ [여러 AWS CloudHSM 클러스터에 연결](java-lib-connecting-to-multiclusters.md)

# 파일로 AWS CloudHSM `CloudHsmProvider` 클래스 구성(기본 구성)
<a name="java-lib-configs-default"></a>

클래스를 AWS CloudHSM `CloudHsmProvider` 구성하는 기본 방법은 파일을 사용하는 것입니다.

기본 생성자를 사용하여 `CloudHsmProvider`를 인스턴스화하면 기본적으로 Linux의 `/opt/cloudhsm/etc/cloudhsm-jce.cfg` 경로에서 구성 파일을 찾습니다. 이 구성 파일은 `configure-jce`를 사용하여 구성할 수 있습니다. 

기본 생성자를 사용하여 생성한 객체는 기본 CloudHSM 공급자 이름 `CloudHSM`을 사용합니다. 공급자 이름은 JCE와 상호 작용하여 다양한 작업에 사용할 공급자를 알려주는 데 유용합니다. 암호화 작업에 CloudHSM 공급자 이름을 사용하는 예는 다음과 같습니다.

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

# 코드를 사용하여 AWS CloudHSM `CloudHsmProvider` 클래스 구성
<a name="java-lib-configs-using-code"></a>

클라이언트 SDK 버전 5.8.0부터 Java 코드를 사용하여 클래스를 AWS CloudHSM `CloudHsmProvider` 구성할 수도 있습니다. 이 작업을 수행하는 방법은 `CloudHsmProviderConfig` 클래스의 객체를 사용하는 것입니다. `CloudHsmProviderConfigBuilder`를 사용하여 이 객체를 빌드할 수 있습니다.

`CloudHsmProvider`에는 다음 예제에서 볼 수 있듯이 `CloudHsmProviderConfig` 객체를 취하는 다른 생성자가 있습니다.

**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);
```

이 예제에서 JCE 공급자의 이름은 `CloudHsmCluster1`입니다. 애플리케이션이 JCE와 상호 작용하기 위해 사용할 수 있는 이름입니다.

**Example**  

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

또는 애플리케이션에서 위에서 생성한 공급자 객체를 사용하여 작업에 해당 공급자를 사용하도록 JCE에 알릴 수도 있습니다.

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

`withClusterUniqueIdentifier` 메서드에 고유 식별자를 지정하지 않은 경우 임의로 생성된 공급자 이름이 자동으로 생성됩니다. 임의로 생성된 이 식별자를 가져오기 위해 애플리케이션은 식별자를 가져오기 위해 `provider.getName()`을 호출할 수 있습니다.

# 여러 AWS CloudHSM 클러스터에 연결
<a name="java-lib-connecting-to-multiclusters"></a>

각각은 AWS CloudHSM 클러스터에 대한 연결을 `CloudHsmProvider` 나타냅니다. 동일한 애플리케이션의 다른 `CloudHsmProvider` 클러스터와 통신하려는 경우 다른 클러스터의 구성을 사용하여 다른 객체를 생성하고 다음 예와 같이 공급자 객체 또는 공급자 이름을 사용하여 이 다른 클러스터와 상호 작용할 수 있습니다.

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

위의 두 공급자(두 클러스터 모두)를 구성한 후에는 공급자 객체 또는 공급자 이름을 사용하여 두 공급자와 상호 작용할 수 있습니다.

`cluster1`과 대화하는 방법을 보여주는 이 예제를 확장하면 다음 샘플을 AES/GCM/NoPadding 작업에 사용할 수 있습니다.

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

또한 동일한 애플리케이션에서 공급자 이름을 사용하여 두 번째 클러스터에서 “AES” 키 생성을 수행하는 경우 다음 샘플을 사용할 수도 있습니다.

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

# 용 JCE를 사용한 키 추출 AWS CloudHSM
<a name="java-lib-configs-getencoded"></a>

Java Cryptography Extension(JCE)은 다양한 암호화 구현을 연결할 수 있는 아키텍처를 사용합니다.는 암호화 작업을 HSM으로 오프로드하는 JCE 공급자를 AWS CloudHSM 제공합니다. 대부분의 다른 JCE 공급자가 AWS CloudHSM에 저장된 키를 사용하려면 HSM에서 일반 텍스트 형식의 키 바이트를 추출하여 시스템 메모리로 사용해야 합니다. HSM은 일반적으로 키를 래핑된 객체로만 추출하고 일반 텍스트로는 추출할 수 없습니다. 그러나 공급자 간 통합 사용 사례를 지원하기 위해는 옵트인 구성 옵션을 AWS CloudHSM 허용하여 일반에서 키 바이트를 추출할 수 있습니다.

**중요**  
JCE는 AWS CloudHSM 공급자가 지정되거나 AWS CloudHSM 키 객체가 사용될 AWS CloudHSM 때마다 작업을 로 오프로드합니다. 작업이 HSM 내에서 수행될 것으로 예상되는 경우 키를 명확하게 추출할 필요가 없습니다. 일반 텍스트로 키를 추출하는 것은 타사 라이브러리 또는 JCE 공급자의 제한으로 인해 애플리케이션에서 키 래핑 및 래핑 해제와 같은 보안 메커니즘을 사용할 수 없는 경우에만 필요합니다.

 AWS CloudHSM JCE 공급자를 사용하면 기본적으로 외부 JCE 공급자와 함께 작동하도록 **퍼블릭 키를** 추출할 수 있습니다. 항상 허용되는 방법은 다음과 같습니다.


| Class | 메서드 | 형식(getEncoded) | 
| --- | --- | --- | 
| EcPublicKey | getEncoded() | X.509 | 
|  | GetW () | 해당 사항 없음 | 
| RSA 퍼블릭 키 | getEncoded() | X.509 | 
|  | getPublicExponent() | 해당 사항 없음 | 
| CloudHsmRsaPrivateCrtKey | getPublicExponent() | 해당 사항 없음 | 

 AWS CloudHSM JCE 공급자는 기본적으로 **프라이빗** 또는 **보안** 키에 대해 키 바이트의 추출을 허용하지 않습니다. 사용 사례에 필요한 경우 다음과 같은 조건에서 **프라이빗** 또는 **비밀** 키에 대해 키 바이트를 선명하게 추출할 수 있습니다. 

1. 프라이빗 및 비밀 키의 `EXTRACTABLE` 속성은 **true**로 설정됩니다.
   + 기본적으로 프라이빗 및 비밀 키의 `EXTRACTABLE` 속성은 **true로** 설정됩니다. `EXTRACTABLE`키는 HSM에서 내보낼 수 있는 키입니다. 지원되는 Java 속성에 대한 자세한 내용은 [Client SDK 5](java-lib-attributes_5.md)를 참조하십시오.

1. 프라이빗 키와 비밀 키의 `WRAP_WITH_TRUSTED` 속성은 **false**로 설정됩니다.
   + `getEncoded`, `getPrivateExponent`, 그리고 `getS`는 명확하게 내보낼 수 없는 프라이빗 키와 함께 사용할 수 없습니다. `WRAP_WITH_TRUSTED`는 프라이빗 키를 HSM 밖으로 명확하게 내보낼 수 없습니다. 자세한 내용은 [신뢰할 수 있는 키를 사용하여 키 래핑 해제 제어](manage-keys-using-trusted-keys.md)를 참조하십시오.

# JCE 공급자가에서 프라이빗 키 보안 암호를 추출하도록 허용 AWS CloudHSM
<a name="get-encoded-take-out-private-keys"></a>

다음 단계를 사용하여 AWS CloudHSM JCE 공급자가 프라이빗 키 보안 암호를 추출하도록 허용합니다.

**중요**  
이 구성 변경을 통해 HSM 클러스터에서 모든 `EXTRACTABLE` 키 바이트를 안전하게 추출할 수 있습니다. 보안을 강화하려면 [키 래핑 방법](java-lib-supported_5.md)을 사용하여 HSM에서 키를 안전하게 추출하는 것을 고려해야 합니다. 이렇게 하면 HSM에서 실수로 키 바이트를 추출하는 것을 방지할 수 있습니다.

1. 다음 명령을 사용하여 **프라이빗** 또는 **비밀** 키를 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. 지우기 키 추출을 활성화하면 다음과 같은 방법으로 프라이빗 키를 메모리로 추출할 수 있습니다.    
[\[See the AWS documentation website for more details\]](http://docs.aws.amazon.com/ko_kr/cloudhsm/latest/userguide/get-encoded-take-out-private-keys.html)

기본 동작을 복원하고 JCE가 키를 정상적으로 내보내지 못하도록 하려면 다음 명령을 실행하십시오.

------
#### [ 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
```

------

# 용 JCE에 대한 명령 재시도 AWS CloudHSM
<a name="java-lib-configs-retry"></a>

AWS CloudHSM 클라이언트 SDK 5.8.0 이상에는 클라이언트 측에서 HSM 제한 작업을 재시도하는 자동 재시도 전략이 내장되어 있습니다. HSM이 이전 작업을 수행하느라 너무 바빠서 더 많은 요청을 받을 수 없어 작업을 제한하는 경우 Client SDK는 제한이 발생한 작업을 최대 3회까지 재시도하고 기하급수적으로 백오프합니다. 이 자동 재시도 전략은 **끄기 모드**와 **표준 모드** 중 하나로 설정할 수 있습니다.
+ **끄기 모드**: Client SDK는 HSM에서 병목 현상이 발생한 작업에 대해 재시도 전략을 수행하지 않습니다.
+ **표준 모드**: Client SDK 5.8.0 이상의 기본 모드입니다. 이 모드에서는 Client SDK가 기하급수적으로 백오프를 수행하여 병목 현상이 발생한 작업을 자동으로 재시도합니다.

자세한 내용은 [HSM 스로틀링](troubleshoot-hsm-throttling.md) 단원을 참조하십시오.

## 재시도 명령을 끄기 모드로 설정합니다.
<a name="w2aac25c21c25c25c15b9"></a>

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

**Linux용 Client SDK 5의 재시도 명령을 **off**로 설정하려면**
+ 다음 명령을 사용하여 재시도 구성을 **off** 모드로 설정할 수 있습니다.

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

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

**Client SDK 5 on Windows에 대한 재시도 명령을 **off**로 설정하려면**
+ 다음 명령을 사용하여 재시도 구성을 **off** 모드로 설정할 수 있습니다.

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

------