내용으로 건너뛰기

OpenSSL 및 CloudHSM 명령줄 도구를 사용하여 키를 CloudHSM으로 안전하게 전송하려면 어떻게 해야 합니까?

6분 분량
0

CloudHSM 명령줄 도구(CloudHSM CLI)를 사용해 "key unwrap" 하위 명령을 실행하여 로컬 키를 AWS CloudHSM으로 가져오려고 합니다.

간략한 설명

먼저 페이로드 키를 임시 AES(Advanced Encryption Standard) 키로 암호화합니다. 그런 다음, 키 쌍의 퍼블릭 키로 임시 AES 키를 암호화합니다. 마지막으로 암호화된 페이로드 키와 암호화된 임시 키를 하나의 파일로 결합합니다. 파일은 암호화된 형식으로 CloudHSM에 전송되며, 프라이빗 키는 키 쌍에서 파일을 암호 해독합니다. AES_KEY_WRAP 메커니즘은 임시 AES 키를 해독하고 이 키를 사용하여 페이로드 키를 해독합니다.

참고: Linux를 실행하는 Amazon Elastic Compute Cloud(Amazon EC2) 인스턴스에서 다음 단계를 완료하십시오. 필요한 OpenSSL 버전과 유틸리티가 포함된 Amazon Linux 2023 Amazon Machine Image(AMI) 를 사용하는 것이 좋습니다.

다음 키를 생성합니다.

  • 가져온 후 CloudHSM과 함께 사용하는 페이로드 AES, RSA 또는 EC 키.
  • AES_KEY_WRAP에서 페이로드를 암호화하는 데 필요한 임시 AES 키. 암호화할 수 있는 항목에 크기 제한이 없으므로 AES를 사용하는 것이 좋습니다.
  • 키를 CloudHSM으로 안전하게 래핑 및 언래핑하기 위한 RSA 키 쌍.

봉투 래핑을 사용하려면 OpenSSL 버전 3.x가 있어야 합니다.

사용 중인 OpenSSL 버전을 확인하려면 다음 명령을 실행합니다.

openssl version

출력 예시:

OpenSSL 3.0.8 7 Feb 2023 (Library: OpenSSL 3.0.8 7 Feb 2023)

해결 방법

참고: 다음 명령에서 다음 값을 원하는 값으로 바꿉니다.

  • YOUR_CRYPTO_USER_NAME을 해당 암호화 사용자 이름으로
  • YOUR_CRYPTO_USER_PASSWORD를 해당 암호로
  • YOUR_WRAPPING_KEY_LABEL을 RSA 퍼블릭 키를 래핑하기 위해 할당된 키 레이블로
  • YOUR_UNWRAPPING_KEY_LABEL을 RSA 프라이빗 키를 언래핑하기 위해 할당된 키 레이블로
  • YOUR_IMPORTED_KEY_LABEL을 가져온 페이로드 키에 할당된 키 레이블로

키 레이블은 key generate-filekey unwrap 명령의 필터 조건이므로 래핑 및 언래핑 키 레이블은 고유해야 합니다. 또는 다른 필터 조건을 사용하여 키를 고유하게 식별할 수도 있습니다. 키 필터에 대한 자세한 내용은 CloudHSM CLI를 사용한 키 필터링을 참조하십시오.

CloudHSM CLI에 대한 암호화 사용자 자격 증명 설정

다음 명령을 실행합니다.

export CLOUDHSM_ROLE="crypto-user"
export CLOUDHSM_PIN="YOUR_CRYPTO_USER_NAME:YOUR_CRYPTO_USER_PASSWORD"

AES 페이로드 가져오기

로컬 키를 생성하고, 암호화하고, 가져오려면 다음 단계를 완료하십시오.

  1. 페이로드 AES, 임시 AES 및 RSA 키를 생성하려면 다음 명령을 실행합니다.

    openssl rand -out payload_aes 32
    openssl rand -out ephemeral_aes 32
    /opt/cloudhsm/bin/cloudhsm-cli key generate-asymmetric-pair rsa --public-label YOUR_WRAPPING_KEY_LABEL --private-label YOUR_UNWRAPPING_KEY_LABEL --modulus-size-bits 4096 --public-exponent 65537 --private-attributes unwrap=true
    /opt/cloudhsm/bin/cloudhsm-cli key generate-file --encoding pem --path public.pem --filter attr.label=YOUR_WRAPPING_KEY_LABEL

    참고: 파일을 추적하려면 키를 자체 디렉터리에 생성하십시오.

  2. 임시 AES 키의 원시 16진수 값을 변수에 넣으려면 다음 명령을 실행합니다.

    EPHEMERAL_AES_HEX=$(hexdump -v -e '/1 "%02X"' < ephemeral_aes)

    참고: hexdump 유틸리티를 설치했는지 확인하십시오. hexdump를 설치하지 않은 경우 이전 명령에서 오류를 반환합니다. hexdump 유틸리티를 설치하는 방법에 대한 지침은 운영 체제(OS) 설명서를 참조하십시오.

  3. 임시 AES 키를 사용하여 페이로드를 래핑하려면 OpenSSL enc 명령을 실행합니다.

    openssl enc -id-aes256-wrap-pad -K $EPHEMERAL_AES_HEX -iv A65959A6 -in payload_aes -out payload_wrapped

    참고: -id-aes256-wrap-pad 암호는 CKM_RSA_AES_KEY_WRAP과 함께 사용할 수 있는 RFC 3394 호환 래핑 메커니즘입니다. RFC 3394 확장인 RFC 5649는 -iv 값을 설정합니다. 자세한 내용은 IETF 웹사이트에서 패딩 알고리즘을 사용한 AES 키 랩핑AES 키 래핑 알고리즘을 참조하십시오.

  4. RSA 키 쌍의 퍼블릭 키를 사용하여 AES 키를 암호화합니다.

    openssl pkeyutl -encrypt -in ephemeral_aes -out ephemeral_wrapped -pubin -inkey public.pem -pkeyopt rsa_padding_mode:oaep -pkeyopt rsa_oaep_md:sha1 -pkeyopt rsa_mgf1_md:sha1
  5. 로컬 컴퓨터에서 암호화된 페이로드 키와 임시 AES 키를 rsa_aes_wrapped라는 이름의 단일 파일로 결합합니다.

    cat ephemeral_wrapped payload_wrapped > rsa_aes_wrapped
  6. RSA 프라이빗 키를 key unwrap rsa-aes와 함께 사용하여 조인된 페이로드 키를 CloudHSM에 언래핑하려면 다음 명령을 실행합니다.

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class aes --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true encrypt=true

    참고: AES 키를 언래핑하려면 --key-type-class aes를 사용해야 합니다. 키 사용에 따라 --attributes를 사용하여 키 속성을 할당합니다. 옵션 및 키 속성에 대한 자세한 내용은 CloudHSM CLI의 키 속성key unwrap rsa-aes 명령을 사용하는 방법의 예를 참조하십시오.

    다음 출력과 비슷하게 페이로드 AES 키를 가져오게 됩니다.

    {
      "error_code": 0,
      "data": {
        "key": {
          "key-reference": "0x000000000068031a",
          "key-info": {
            "key-owners": [
              {
                "username": "YOUR_CRYPTO_USER_NAME",
                "key-coverage": "full"
              }
            ],
            "shared-users": [],
            "cluster-coverage": "full"
          },
          "attributes": {
            "key-type": "aes",
            "label": "YOUR_IMPORTED_KEY_LABEL",
            "id": "0x",
            "check-value": "0xb31c2a",
            "class": "secret-key",
            "encrypt": true,
            "decrypt": true,
            "token": true,
            "always-sensitive": false,
            "derive": false,
            "destroyable": true,
            "extractable": true,
            "local": false,
            "modifiable": true,
            "never-extractable": false,
            "private": true,
            "sensitive": true,
            "sign": true,
            "trusted": false,
            "unwrap": false,
            "verify": true,
            "wrap": false,
            "wrap-with-trusted": false,
            "key-length-bytes": 32
          }
        }
      }
    }

RSA 페이로드 가져오기

다음 단계를 완료하십시오.

  1. RSA 프라이빗 키를 CloudHSM으로 언래핑하려면 다음 명령을 실행하여 페이로드 키를 RSA 프라이빗 키로 변경합니다.

    openssl genrsa -out payload_rsa.pem 2048
    openssl rand -out ephemeral_aes 32
  2. 일반 텍스트 편집기를 사용하여 RSA 키의 형식을 확인합니다.

    PKCS1 format: -----BEGIN RSA PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    참고: RSA 키는 PKCS #1 형식입니다. 하지만 CloudHSM CLI에서는 프라이빗 키가 PKCS #8 DER 형식이라고 가정합니다.

  3. payload_rsa.pem 키를 PKCS #8 형식 및 DER 인코딩으로 변환하려면 다음 명령을 실행합니다.

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt
  4. AES 페이로드 가져오기 섹션의 2~5단계를 완료합니다. payload_aespayload_rsa_pkcs8.der로 바꾸십시오.

  5. 페이로드 RSA 프라이빗 키를 CloudHSM으로 언래핑하려면 다음 명령을 실행합니다.

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class rsa-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true

    참고: RSA 키를 언래핑하려면 --key-type-class rsa-private을 사용해야 합니다. 키 사용에 따라 --attributes를 사용하여 키 속성을 할당합니다.

EC 페이로드 가져오기

페이로드를 가져오려면 다음 단계를 완료하십시오.

  1. EC 프라이빗 키를 CloudHSM으로 언래핑하려면 다음 명령을 실행하여 페이로드 키를 EC 프라이빗 키로 변경합니다.

    openssl ecparam -name secp256k1 -genkey -noout -out payload_ec.pemopenssl rand -out ephemeral_aes 32
  2. 일반 텍스트 편집기를 사용하여 EC 키의 형식을 확인합니다.

    PKCS1 format: -----BEGIN EC PRIVATE KEY----- - PKCS8 format: -----BEGIN PRIVATE KEY-----

    참고: EC 키는 PKCS #1 형식입니다. 하지만 CloudHSM CLI에서는 프라이빗 키가 PKCS #8 DER 형식이라고 가정합니다.

  3. payload_ec.pem 키를 PKCS #8 형식 및 DER 인코딩으로 변환하려면 다음 명령을 실행합니다.

    openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_ec.pem -out payload_ec_pkcs8.der -nocrypt
  4. AES 페이로드 가져오기 섹션의 2~5단계를 완료합니다. payload_aespayload_ec_pkcs8.der로 바꾸십시오.

  5. 페이로드 EC 프라이빗 키를 CloudHSM으로 언래핑하려면 다음 명령을 실행합니다.

    /opt/cloudhsm/bin/cloudhsm-cli key unwrap rsa-aes --data-path rsa_aes_wrapped --key-type-class ec-private --label YOUR_IMPORTED_KEY_LABEL --hash-function sha1 --mgf mgf1-sha1 --filter attr.label=YOUR_UNWRAPPING_KEY_LABEL --attributes decrypt=true sign=true

    참고: EC 키를 언래핑하려면 --key-type-class ec-private을 사용해야 합니다. 키 사용에 따라 --attributes를 사용하여 키 속성을 할당합니다.

관련 정보

AWS CloudHSM 클라이언트 SDK 5용 PKCS #11 라이브러리에 지원되는 메커니즘

AWS 공식업데이트됨 7달 전