JCE 공급자를 AWS CloudHSM 클라이언트 SDK 3에서 클라이언트 SDK 5로 마이그레이션 - AWS CloudHSM

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

JCE 공급자를 AWS CloudHSM 클라이언트 SDK 3에서 클라이언트 SDK 5로 마이그레이션

이 주제를 사용하여 JCE 공급자를 클라이언트 SDK 3에서 AWS CloudHSM 클라이언트 SDK 5로 마이그레이션합니다. 마이그레이션의 이점은 AWS CloudHSM 클라이언트 SDK 5의 이점 섹션을 참조하세요.

에서 AWS CloudHSM고객 애플리케이션은 AWS CloudHSM 클라이언트 소프트웨어 개발 키트()를 사용하여 암호화 작업을 수행합니다SDK. 클라이언트 SDK 5는 새로운 기능과 플랫폼 지원이 계속 추가SDK되는 기본 기능입니다.

Client SDK 3 JCE 공급자는 표준 JCE 사양에 포함되지 APIs 않은 사용자 지정 클래스 및를 사용합니다. JCE 공급자의 클라이언트 SDK 5는 JCE 사양에 불만이 있으며 특정 영역에서 클라이언트 SDK 3과 이전 버전과 호환되지 않습니다. 고객 애플리케이션은 클라이언트 SDK 5로 마이그레이션하는 과정에서 변경해야 할 수 있습니다. 이 섹션에서는 성공적인 마이그레이션에 필요한 변경 사항을 간략하게 설명합니다.

모든 공급자에 대한 마이그레이션 지침을 검토하려면 AWS CloudHSM 클라이언트 SDK 3에서 클라이언트 SDK 5로 마이그레이션 섹션을 참조하세요.

변경 사항을 해결하여 준비

이러한 중단된 변경 사항을 검토하고 그에 따라 개발 환경에서 애플리케이션을 업데이트합니다.

공급자 클래스 및 이름 변경됨

변경된 사항 클라이언트 SDK 3의 내용 클라이언트 SDK 5의 정의 예제

공급자 클래스 및 이름

클라이언트 SDK 3의 JCE 공급자 클래스를 호출CaviumProvider하며 공급자 이름이 입니다Cavium.

클라이언트 SDK 5에서는 공급자 클래스가 호출CloudHsmProvider되고 공급자 이름이 입니다CloudHSM.

CloudHsmProvider 객체를 초기화하는 방법의 예는 AWS CloudHSM GitHub 샘플 리포지토리에서 확인할 수 있습니다.

명시적 로그인 변경됨, 암시적 로그인 변경되지 않음

변경된 사항 클라이언트 SDK 3의 내용 클라이언트 SDK 5의 정의 예제

명시적 로그인

클라이언트 SDK 3은 명시적 로그인에 LoginManager 클래스를 사용합니다1.

클라이언트 SDK 5에서 CloudHSM 공급자는 명시적 로그인을 AuthProvider 위해를 구현합니다. AuthProvider는 표준 Java 클래스이며 Java가 제공업체에 로그인하는 고유한 방법을 따릅니다. Client SDK 5의 로그인 상태 관리가 개선되면 애플리케이션이 다시 연결하는 동안 더 이상 로그인을 모니터링하고 수행할 필요가 없습니다2.

클라이언트 SDK 5에서 명시적 로그인을 사용하는 방법에 대한 예는 클라우드 LoginRunner 샘플 리포지토리의 샘플을 참조하세요. AWS HSM GitHub

암시적 로그인

암시적 로그인에는 변경이 필요하지 않습니다. 클라이언트 3에서 클라이언트 SDK SDK5로 마이그레이션할 때 암시적 로그인에 대해 동일한 속성 파일과 모든 환경 변수가 계속 작동합니다.

클라이언트 5에서 암시적 로그인을 사용하는 방법에 대한 예는 LoginRunner 샘플 SDK 리포지토리의 AWS CloudHSM GitHub 샘플을 참조하세요.

  • [1] 클라이언트 SDK 3 코드 조각:

    LoginManager lm = LoginManager.getInstance(); lm.login(partition, user, pass);
  • [2] 클라이언트 SDK 5 코드 조각:

    // Construct or get the existing provider object AuthProvider provider = new CloudHsmProvider(); // Call login method on the CloudHsmProvider object // Here loginHandler is a CallbackHandler provider.login(null, loginHandler);

    클라이언트 SDK 5에서 명시적 로그인을 사용하는 방법에 대한 예는 LoginRunner 샘플 리포지토리의 AWS CloudHSM GitHub 샘플을 참조하세요.

키 생성 변경됨

변경된 사항 클라이언트 SDK 3의 내용 클라이언트 SDK 5의 정의 예제

키 생성

클라이언트 SDK 3에서 Cavium[Key-type]AlgorithmParameterSpec는 키 생성 파라미터를 지정하는 데 사용됩니다. 코드 조각은 각주 1를 참조하세요.

클라이언트 SDK 5에서 KeyAttributesMap는 키 생성 속성을 지정하는 데 사용됩니다. 코드 조각은 각주 2를 참조하세요.

를 사용하여 대칭 키를 KeyAttributesMap 생성하는 방법에 대한 예는 AWS CloudHSM Github SymmetricKeys 샘플 리포지토리의 샘플을 참조하세요.

키 페어 생성

클라이언트 SDK 3에서 Cavium[Key-type]AlgorithmparameterSpec는 키 페어 생성 파라미터를 지정하는 데 사용됩니다. 코드 조각은 각주 3를 참조하세요.

클라이언트 SDK 5에서 KeyPairAttributesMap는 이러한 파라미터를 지정하는 데 사용됩니다. 코드 조각은 각주 4를 참조하세요.

를 사용하여 비대칭 키를 KeyAttributesMap 생성하는 방법에 대한 예는 AsymmetricKeys 샘플 리포지토리의 AWS CloudHSM GitHub 샘플을 참조하세요.

  • [1] 클라이언트 SDK 3 키 생성 코드 조각:

    KeyGenerator keyGen = KeyGenerator.getInstance("AES", "Cavium"); CaviumAESKeyGenParameterSpec aesSpec = new CaviumAESKeyGenParameterSpec( keySizeInBits, keyLabel, isExtractable, isPersistent); keyGen.init(aesSpec); SecretKey aesKey = keyGen.generateKey();
  • [2] 클라이언트 SDK 5 키 생성 코드 조각:

    KeyGenerator keyGen = KeyGenerator.getInstance("AES", CloudHsmProvider.PROVIDER_NAME); final KeyAttributesMap aesSpec = new KeyAttributesMap(); aesSpec.put(KeyAttribute.LABEL, keyLabel); aesSpec.put(KeyAttribute.SIZE, keySizeInBits); aesSpec.put(KeyAttribute.EXTRACTABLE, isExtractable); aesSpec.put(KeyAttribute.TOKEN, isPersistent); keyGen.init(aesSpec); SecretKey aesKey = keyGen.generateKey();
  • [3] 클라이언트 SDK 3 키 페어 생성 코드 조각:

    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("rsa", "Cavium"); CaviumRSAKeyGenParameterSpec spec = new CaviumRSAKeyGenParameterSpec( keySizeInBits, new BigInteger("65537"), label + ":public", label + ":private", isExtractable, isPersistent); keyPairGen.initialize(spec); keyPairGen.generateKeyPair();
  • [4] 클라이언트 SDK 5 키 페어 생성 코드 조각:

    KeyPairGenerator keyPairGen = KeyPairGenerator.getInstance("RSA", providerName); // Set attributes for RSA public key final KeyAttributesMap publicKeyAttrsMap = new KeyAttributesMap(); publicKeyAttrsMap.putAll(additionalPublicKeyAttributes); publicKeyAttrsMap.put(KeyAttribute.LABEL, label + ":Public"); publicKeyAttrsMap.put(KeyAttribute.MODULUS_BITS, keySizeInBits); publicKeyAttrsMap.put(KeyAttribute.PUBLIC_EXPONENT, new BigInteger("65537").toByteArray()); // Set attributes for RSA private key final KeyAttributesMap privateKeyAttrsMap = new KeyAttributesMap(); privateKeyAttrsMap.putAll(additionalPrivateKeyAttributes); privateKeyAttrsMap.put(KeyAttribute.LABEL, label + ":Private"); // Create KeyPairAttributesMap and use that to initialize the // keyPair generator KeyPairAttributesMap keyPairSpec = new KeyPairAttributesMapBuilder() .withPublic(publicKeyAttrsMap) .withPrivate(privateKeyAttrsMap) .build(); keyPairGen.initialize(keyPairSpec); keyPairGen.generateKeyPair();

키 찾기, 삭제 및 참조 변경됨

에서 이미 생성된 키를 찾으려면 AWS CloudHSM 를 사용합니다 KeyStore. 클라이언트 SDK 3에는 Cavium 및의 두 가지 KeyStore 유형이 있습니다CloudHSM. 클라이언트 SDK 5에는 라는 한 가지 KeyStore 유형만 있습니다CloudHSM.

에서 로 이동Cavium KeyStore 하려면 KeyStore 유형을 변경CloudHSM KeyStore 해야 합니다. 또한 클라이언트 SDK 3은 키 핸들을 사용하여 키를 참조하는 반면 클라이언트 SDK 5는 키 레이블을 사용합니다. 결과 동작 변경 사항은 다음과 같습니다.

변경된 사항 클라이언트 SDK 3의 내용 클라이언트 SDK 5의 정의 예제

키 참조

클라이언트 SDK 3에서는 애플리케이션이 키 레이블 또는 키 핸들을 사용하여에서 키를 참조합니다HSM. KeyStore 에서 레이블을 사용하여 키를 찾거나 핸들을 사용하여 CaviumKey 객체를 생성합니다.

클라이언트 SDK 5에서 애플리케이션은 클라이언트 SDK 5용 AWS CloudHSM KeyStore Java 클래스를 사용하여 레이블별로 키를 찾을 수 있습니다. 핸들별로 키를 찾으려면를 AWS CloudHSM KeyStoreWithAttributes와 함께 사용합니다 AWS CloudHSM KeyReferenceSpec.

여러 항목 찾기

getEntry, getKey또는 동일한 기준을 가진 여러 항목이에 있는 시나리오getCertificate에서 키를 검색하면 발견된 첫 번째 항목Cavium KeyStore만 반환됩니다.

및를 AWS CloudHSM KeyStore 사용하면 KeyStoreWithAttributes동일한 시나리오로 인해 예외가 발생합니다. 이 문제를 해결하려면 CloudHSM의 Cloud를 사용하여 키의 속성 설정HSM CLI 명령을 사용하여 키에 고유한 레이블을 설정하는 것이 좋습니다CLI. 또는 KeyStoreWithAttributes#getKeys를 사용하여 기준과 일치하는 모든 키를 반환합니다.

모든 키 찾기

클라이언트 SDK 3에서는를 HSM 사용하여의 모든 키를 찾을 수 있습니다Util.findAllKeys().

클라이언트 SDK 5를 사용하면 KeyStoreWithAttributes 클래스를 사용하여 키를 더 간단하고 효율적으로 찾을 수 있습니다. 가능하면 키를 캐시하여 지연 시간을 최소화합니다. 자세한 내용은 애플리케이션의 키를 효과적으로 관리 단원을 참조하십시오. 에서 모든 키를 검색해야 하는 경우를 빈와 KeyStoreWithAttributes#getKeys 함께 HSM사용합니다KeyAttributesMap.

KeyStoreWithAttributes 클래스를 사용하여 키를 찾는 예제는 AWS CloudHSM Github 샘플 리포지토리에서 사용할 수 있으며 코드 조각은 1에 나와 있습니다.

키 삭제

클라이언트 SDK 3은 Util.deleteKey()를 사용하여 키를 삭제합니다.

클라이언트 SDK 5의 Key 객체는이 Destroyable 인터페이스의 destroy() 메서드를 사용하여 키를 삭제할 수 있는 인터페이스를 구현합니다.

키 삭제 기능을 보여주는 예제 코드는 CloudHSM Github 샘플 리포지토리에서 찾을 수 있습니다. 각에 대한 샘플 조각SDK은에 나와 있습니다2.

  • [1] 조각은 다음과 같습니다.

    KeyAttributesMap findSpec = new KeyAttributesMap(); findSpec.put(KeyAttribute.LABEL, label); findSpec.put(KeyAttribute.KEY_TYPE, keyType); KeyStoreWithAttributes keyStore = KeyStoreWithAttributes.getInstance("CloudHSM"); keyStore.load(null, null); keyStore.getKey(findSpec);
  • [2] 클라이언트 SDK 3에서 키 삭제:

    Util.deleteKey(key);

    클라이언트 SDK 5에서 키 삭제:

    ((Destroyable) key).destroy();

암호화 래핑 해제 작업 변경됨, 다른 암호화 작업 변경되지 않음

참고

암호화 encrypt/decrypt/wrap 작업에는 변경이 필요하지 않습니다.

언래핑 작업을 수행하려면 Client SDK 3 CaviumUnwrapParameterSpec 클래스를 나열된 암호화 작업과 관련된 다음 클래스 중 하나로 바꿔야 합니다.

  • AES/GCM/NoPadding 래핑 해제의 GCMUnwrapKeySpec

  • AESWrap unwrapAES/CBC/NoPadding unwrapIvUnwrapKeySpec

  • RSA OAEP unwrapOAEPUnwrapKeySpec

OAEPUnwrapkeySpec에 대한 코드 조각 예:

OAEPParameterSpec oaepParameterSpec = new OAEPParameterSpec( "SHA-256", "MGF1", MGF1ParameterSpec.SHA256, PSpecified.DEFAULT); KeyAttributesMap keyAttributesMap = new KeyAttributesMap(KeyAttributePermissiveProfile.KEY_CREATION); keyAttributesMap.put(KeyAttribute.TOKEN, true); keyAttributesMap.put(KeyAttribute.EXTRACTABLE, false); OAEPUnwrapKeySpec spec = new OAEPUnwrapKeySpec(oaepParameterSpec, keyAttributesMap); Cipher hsmCipher = Cipher.getInstance( "RSA/ECB/OAEPPadding", CloudHsmProvider.PROVIDER_NAME); hsmCipher.init(Cipher.UNWRAP_MODE, key, spec);

서명 작업 변경되지 않음

서명 작업에는 변경이 필요하지 않습니다.

클라이언트 SDK 5로 마이그레이션

이 섹션의 지침에 따라 클라이언트 3에서 클라이언트 SDK SDK5로 마이그레이션합니다.

참고

Amazon Linux, Ubuntu 16.04, Ubuntu 18.04 CentOS 6, CentOS 8 및 RHEL 6은 현재 클라이언트 SDK 5에서 지원되지 않습니다. 현재 클라이언트 SDK 3에서 이러한 플랫폼 중 하나를 사용하는 경우 클라이언트 SDK5로 마이그레이션할 때 다른 플랫폼을 선택해야 합니다.

  1. 클라이언트 SDK 3의 JCE 공급자를 제거합니다.

    Amazon Linux 2
    $ sudo yum remove cloudhsm-client-jce
    CentOS 7
    $ sudo yum remove cloudhsm-client-jce
    RHEL 7
    $ sudo yum remove cloudhsm-client-jce
    RHEL 8
    $ sudo yum remove cloudhsm-client-jce
  2. Client SDK 3용 Client Daemon을 제거합니다.

    Amazon Linux 2
    $ sudo yum remove cloudhsm-client
    CentOS 7
    $ sudo yum remove cloudhsm-client
    RHEL 7
    $ sudo yum remove cloudhsm-client
    RHEL 8
    $ sudo yum remove cloudhsm-client
    참고

    사용자 지정 구성을 다시 활성화해야 합니다.

  3. 의 단계에 따라 클라이언트 SDK JCE 공급자를 설치합니다AWS CloudHSM 클라이언트 SDK 5에 대한 JCE 공급자 설치.

  4. 클라이언트 SDK 5에는 새로운 구성 파일 형식과 명령줄 부트스트래핑 도구가 도입되었습니다. Client SDK 5 JCE 공급자를 부트스트랩하려면 사용 설명서의에 나열된 지침을 따르세요클라이언트 부트스트랩 SDK.

  5. 개발 환경에서 애플리케이션을 테스트합니다. 기존 코드를 업데이트하여 최종 마이그레이션 전에 중단되는 변경 사항을 해결합니다.

관련 주제