

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

# 클라이언트 SDK 3용AWS CloudHSM KeyStore Java 클래스
<a name="alternative-keystore"></a>

클래스는 AWS CloudHSM `KeyStore` **keytool** 및 **jarsigner**와 같은 애플리케이션을 통해 키에 액세스할 수 있는 특수 목적의 PKCS12 AWS CloudHSM 키 스토어를 제공합니다. 이 키 스토어는 키 데이터와 함께 인증서를 저장하고 AWS CloudHSM에 저장된 키 데이터와 상호 연관시킬 수 있습니다.

**참고**  
인증서는 퍼블릭 정보이므로 암호화 키의 스토리지 용량을 최대화하기 위해 AWS CloudHSM 는 HSMs에 인증서 저장을 지원하지 않습니다.

클래스는 AWS CloudHSM `KeyStore` Java 암호화 확장(JCE)의 `KeyStore` 서비스 공급자 인터페이스(SPI)를 구현합니다. `KeyStore` 사용에 대한 자세한 내용은 [Class KeyStore](https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html)를 참조하십시오.

## AWS CloudHSM 클라이언트 SDK 3에 적합한 키 스토어 선택
<a name="choosing_keystore"></a>

 AWS CloudHSM Java 암호화 확장(JCE) 공급자는 모든 트랜잭션을 HSM에 전달하는 기본 패스스루 읽기 전용 키 스토어와 함께 제공됩니다. 이 기본 키 스토어는 특수 용도의 AWS CloudHSM KeyStore와 구별됩니다. 대부분의 상황에서 기본값을 사용하여 더 나은 런타임 성능과 처리량을 얻을 수 있습니다. HSM으로 키 작업을 오프로드하는 것 외에도 인증서 및 인증서 기반 작업에 대한 지원이 필요한 애플리케이션에만 AWS CloudHSM KeyStore를 사용해야 합니다.

두 키 저장소 모두 작업을 위해 JCE 공급자를 사용하지만, 이 둘은 독립 개체이며 서로 정보를 교환하지 않습니다.

다음과 같이 Java 애플리케이션에 대한 기본 키 스토어를 로드합니다.

```
KeyStore ks = KeyStore.getInstance("Cavium");
```

다음과 같이 특수 용도의 CloudHSM KeyStore를 로드합니다.

```
KeyStore ks = KeyStore.getInstance("CloudHSM")
```

## 클라이언트 SDK 3용 AWS CloudHSM KeyStore 초기화
<a name="initialize_cloudhsm_keystore"></a>

JCE 공급자에 로그인하는 것과 동일한 방식으로 AWS CloudHSM KeyStore에 로그인합니다. 환경 변수 또는 시스템 속성 파일을 사용할 수 있으며 CloudHSM KeyStore의 사용을 시작하기 전에 로그인해야 합니다. JCE 공급자를 사용하여 HSM에 로그인하는 예는 [HSM에 로그인](https://github.com/aws-samples/aws-cloudhsm-jce-examples/blob/master/src/main/java/com/amazonaws/cloudhsm/examples/LoginRunner.java)을 참조하십시오.

원하는 경우, 암호를 지정하여 키 스토어 데이터를 보유하는 로컬 PKCS12 파일을 암호화할 수 있습니다. AWS CloudHSM Keystore를 생성할 때 로드, 설정 및 가져오기 메서드를 사용할 때 암호를 설정하고 제공합니다.

다음과 같이 새 CloudHSM KeyStore 객체를 인스턴스화합니다.

```
ks.load(null, null);
```

`store` 메서드를 사용하여 파일에 키 스토어 데이터를 씁니다. 이 시점부터 다음과 같이 소스 파일 및 암호와 함께 `load` 메서드를 사용하여 기존 키 스토어를 로드할 수 있습니다.

```
ks.load(inputStream, password);
```

## AWS CloudHSM 클라이언트 SDK 3용 AWS CloudHSM KeyStore 사용
<a name="using_cloudhsm_keystore"></a>

CloudHSM KeyStore 객체는 일반적으로 [jarsigner](https://docs.oracle.com/javase/8/docs/technotes/tools/windows/jarsigner.html) 또는 [keytool](https://docs.oracle.com/javase/8/docs/technotes/tools/unix/keytool.html)과 같은 타사 애플리케이션을 통해 사용됩니다. 또한 코드를 사용하여 직접 객체에 액세스 할 수도 있습니다.

AWS CloudHSM KeyStore는 JCE [클래스 KeyStore](https://docs.oracle.com/javase/8/docs/api/java/security/KeyStore.html) 사양을 준수하며 다음 기능을 제공합니다.
+ `load`

  지정된 입력 스트림에서 키 스토어를 로드합니다. 키 스토어를 저장할 때 암호가 설정된 경우, 로드가 성공하려면 이와 동일한 암호가 제공되어야 합니다. 새로운 빈 키 스토어를 초기화하려면 두 파라미터를 모두 null로 설정합니다.

  ```
  KeyStore ks = KeyStore.getInstance("CloudHSM");
  ks.load(inputStream, password);
  ```
+ `aliases`

  지정된 키 스토어 인스턴스에 있는 모든 항목의 별칭 이름의 열거를 반환합니다. 결과는 PKCS12 파일에 로컬로 저장된 객체와 HSM에 있는 객체를 포함합니다.

  **샘플 코드:**

  ```
  KeyStore ks = KeyStore.getInstance("CloudHSM");
  for(Enumeration<String> entry = ks.aliases(); entry.hasMoreElements();) 
  	{    
  		String label = entry.nextElement();    
  		System.out.println(label);
  	}
  ```
+ `ContainsAlias`

  키 스토어가 지정된 별칭이 있는 객체에 최소 하나 이상 액세스할 수 있는 경우 true를 반환합니다. 키 스토어는 PKCS12 파일에 로컬로 저장된 객체와 HSM에 상주하는 객체를 확인합니다.
+ `DeleteEntry`

  로컬 PKCS12 파일에서 인증서 항목을 삭제합니다. HSM에 저장된 키 데이터 삭제는 AWS CloudHSM KeyStore를 사용하여 지원되지 않습니다. CloudHSM의 [key\$1mgmt\$1util](https://docs.aws.amazon.com/cloudhsm/latest/userguide/key_mgmt_util.html) 도구를 사용하여 키를 삭제할 수 있습니다.
+ `GetCertificate`

  사용 가능한 경우 별칭과 연결된 인증서를 반환합니다. 별칭이 없거나 인증서가 아닌 객체를 참조하는 경우, 함수는 NULL을 반환합니다.

  ```
  KeyStore ks = KeyStore.getInstance("CloudHSM");
  Certificate cert = ks.getCertificate(alias)
  ```
+ `GetCertificateAlias`

  데이터가 지정된 인증서와 일치하는 첫 번째 키 스토어 항목의 이름(별칭)을 반환합니다.

  ```
  KeyStore ks = KeyStore.getInstance("CloudHSM");
  String alias = ks.getCertificateAlias(cert)
  ```
+ `GetCertificateChain`

  지정된 별칭과 연결된 인증서 체인을 반환합니다. 별칭이 없거나 인증서가 아닌 객체를 참조하는 경우, 함수는 NULL을 반환합니다.
+ `GetCreationDate`

  지정된 별칭에 의해 식별된 항목의 생성 날짜를 반환합니다. 생성 날짜를 사용할 수 없는 경우 함수는 인증서가 유효해지는 날짜를 반환합니다.
+ `GetKey`

  GetKey는 HSM에 전달되고 지정된 레이블에 해당하는 키 객체를 반환합니다. `getKey`는 HSM을 직접 쿼리하므로, KeyStore에 의해 생성되었는지 여부에 관계없이 HSM의 어떤 키에 대해서도 사용할 수 있습니다.

  ```
  Key key = ks.getKey(keyLabel, null);
  ```
+ `IsCertificateEntry`

  지정된 별칭이 있는 항목이 인증서 항목을 나타내는지 확인합니다.
+ `IsKeyEntry`

  지정된 별칭이 있는 항목이 키 항목을 나타내는지 확인합니다. 이 작업은 PKCS12 파일과 HSM에서 모두 별칭을 검색합니다.
+ `SetCertificateEntry`

  지정된 인증서를 지정된 별칭에 할당합니다. 지정된 별칭이 키 또는 인증서를 식별하는 데 이미 사용 중인 경우 `KeyStoreException`이 발생합니다. JCE 코드를 사용하여 키 객체를 가져온 다음 KeyStore `SetKeyEntry` 메서드를 사용하여 인증서를 키에 연결할 수 있습니다.
+ `byte[]` 키가 있는 `SetKeyEntry`

  **이 API는 현재 클라이언트 SDK 3에서 지원되지 않습니다.**
+ `Key` 객체가 있는 `SetKeyEntry`

  지정된 키를 지정된 별칭에 할당하고 HSM 내부에 저장합니다. `Key` 객체가 `CaviumKey` 유형이 아닌 경우, 키가 추출 가능한 세션 키로 HSM에 가져오기 됩니다.

  `Key` 객체가 `PrivateKey` 유형인 경우 해당 인증서 체인이 함께 제공되어야 합니다.

  별칭이 이미 존재하는 경우 `SetKeyEntry` 호출은 `KeyStoreException`을 발생시키고 키를 덮어쓰지 못하게 합니다. 키를 덮어써야 하는 경우 해당 목적으로 KMU 또는 JCE를 사용하십시오.
+ `EngineSize`

  키 스토어의 항목 수를 반환합니다.
+ `Store`

  키 스토어를 지정된 출력 스트림에 PKCS12 파일로 저장하고 지정된 암호로 보호합니다. 또한, 모든 로드된 키(`setKey` 호출을 사용하여 설정됨)를 유지합니다.