Linux에서 OpenSSL을 사용하여 키 래핑

이 주제에서는 Cloud KMS로 키를 가져오기 전에 키를 수동으로 래핑하는 방법을 보여줍니다. 키를 가져오기 전에 Google Cloud CLI를 사용하여 자동으로 래핑하지 않으려면 이 주제의 안내를 따르세요. 차이점에 대한 개요는 키 가져오기 작동 방식을 참조하세요.

시작하기 전에 단계를 제외한 5~10 분 후에 이 주제의 단계를 완료할 수 있습니다.

시작하기 전에

키를 래핑하려면 먼저 다음 기본 요건을 완료해야 합니다.

  1. 대상 키링과 키를 만들고 가져오기 작업을 만듭니다.
  2. Cloud KMS로 가져올 수 있도록 키가 로컬에서 사용 가능하고 형식이 올바른지 확인합니다.
  3. OpenSSL 패치 및 재컴파일

래핑 키 검색

이 섹션에서는 시작하기 전에에서 만든 가져오기 작업에서 래핑 키를 검색하는 방법을 보여줍니다. Google Cloud 콘솔을 사용하는 것이 좋습니다.

콘솔

  1. Google Cloud 콘솔에서 키 관리 페이지로 이동합니다.

    키 관리 페이지로 이동

  2. 가져오기 작업이 있는 키링의 이름을 클릭합니다.

  3. 페이지 상단에 있는 가져오기 작업 탭을 클릭합니다.

  4. 더보기 를 클릭한 다음 팝업 메뉴에서 래핑 키 다운로드를 클릭합니다.

gcloud CLI

가져오기 작업이 활성 상태인지 확인하려면 gcloud kms import-jobs describe 명령어를 실행합니다.

gcloud kms import-jobs describe IMPORT_JOB \
  --location LOCATION \
  --keyring KEY_RING \
  --format="value(state)"
state: ACTIVE

다음 명령을 실행하여 가져오기 작업의 공개 키를 ${HOME}/wrapping-key.pem에 저장합니다.

gcloud kms import-jobs describe \
  --location=LOCATION \
  --keyring=KEY_RING \
  --format="value(publicKey.pem)" \
  IMPORT_JOB > ${HOME}/wrapping-key.pem

API

  1. ImportJob.get 메서드를 호출합니다.

  2. ImportJob.get 응답의 publicKey 필드를 통해 공개 키를 검색합니다. 이 값은 WrappingPublicKey 유형입니다. WrappingPublicKey 유형의 pem 필드는 PEM(Privacy Enhanced Mail) 형식으로 인코딩된 공개 키입니다.

PEM 인코딩 형식에 대한 자세한 내용은 RFC 7468, 특히 일반 고려사항소유자 공개 키 정보의 텍스트 인코딩 섹션을 참조하세요.

환경 변수 설정

OpenSSL 명령어에는 입력 값으로 몇 가지 파일 경로가 필요합니다. 명령어를 더 쉽게 실행할 수 있도록 파일 경로의 환경 변수를 정의합니다. 아래에 정의한 디렉터리에 쓸 수 있는 권한이 있는지 확인합니다.

  1. PUB_WRAPPING_KEY 변수를 가져오기 작업에서 다운로드한 래핑 키의 전체 경로로 설정합니다. 래핑 키는 .pem으로 끝납니다.

    PUB_WRAPPING_KEY="WRAPPING_KEY_PATH"
    

  2. TARGET_KEY 변수를 래핑되지 않은 (대상) 키의 전체 경로로 설정합니다.

    TARGET_KEY=TARGET_KEY_PATH
    

    TARGET_KEY_PATH를 대칭 키의 .bin 파일 경로나 비대칭 키의 .der 파일 경로로 바꿉니다.

  3. RSA-AES로 래핑하는 경우 TEMP_AES_KEY 변수를 임시 AES 키의 전체 경로로 설정합니다.

    TEMP_AES_KEY=TEMP_AES_KEY_PATH
    

  4. 가져올 수 있는 래핑된 대상 키를 저장할 전체 경로로 WRAPPED_KEY 변수를 설정합니다.

    WRAPPED_KEY=WRAPPED_KEY_PATH
    

  5. 다음 명령어를 사용하여 모든 환경 변수가 올바르게 설정되었는지 확인합니다.

    echo "PUB_WRAPPING_KEY: " ${PUB_WRAPPING_KEY}; \
    echo "TARGET_KEY: " ${TARGET_KEY}; \
    echo "TEMP_AES_KEY: " ${TEMP_AES_KEY}; \
    echo "WRAPPED_KEY: " ${WRAPPED_KEY}
    

변수가 올바르게 설정되면 키를 래핑할 준비가 된 것입니다. 다음에서는 RSA만 또는 RSA-AES 등 두 가지 방식을 설명합니다.

키 래핑

RSA로 키 래핑

이 방식에서 대상 키는 RSA 블록에 래핑됩니다. 따라서 대상 키 크기가 제한됩니다. 예를 들어 이 메서드를 사용하여 다른 RSA 키를 래핑할 수 없습니다. 지원되는 가져오기 메서드는 rsa-oaep-3072-sha256rsa-oaep-4096-sha256입니다.

  • CKM_RSA_PKCS_OAEP 알고리즘을 사용하여 래핑 공개 키로 대상 키를 래핑합니다.

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TARGET_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:sha256 \
      -pkeyopt rsa_mgf1_md:sha256
    

RSA-AES로 키 래핑

이 방식에서 대상 키는 임시 AES 키로 래핑됩니다. 그러면 임시 AES 키가 RSA 키로 래핑됩니다. 이러한 래핑된 키 두 개를 연결하고 가져옵니다. 대상 키는 RSA가 아닌 AES로 래핑되므로 이 방식을 사용하여 큰 키를 래핑할 수 있습니다. 지원되는 가져오기 메서드는 rsa-oaep-3072-sha1-aes-256, rsa-oaep-4096-sha1-aes-256, rsa-oaep-3072-sha256-aes-256, rsa-oaep-4096-sha256-aes-256입니다.

  1. 32바이트 길이의 임시 무작위 AES 키를 생성하고 ${TEMP_AES_KEY}로 식별된 위치에 저장합니다.

    openssl rand -out "${TEMP_AES_KEY}" 32
    

  2. CKM_RSA_PKCS_OAEP 알고리즘을 사용하여 래핑 공개 키로 임시 AES 키를 래핑합니다. 가져오기 메서드가 rsa-oaep-3072-sha1-aes-256 또는 rsa-oaep-4096-sha1-aes-256이면 rsa_oaep_mdrsa_mgf1_mdsha1을 사용합니다. rsa-oaep-3072-sha256-aes-256rsa-oaep-4096-sha256-aes-256sha256을 사용합니다.

    openssl pkeyutl \
      -encrypt \
      -pubin \
      -inkey ${PUB_WRAPPING_KEY} \
      -in ${TEMP_AES_KEY} \
      -out ${WRAPPED_KEY} \
      -pkeyopt rsa_padding_mode:oaep \
      -pkeyopt rsa_oaep_md:{sha1|sha256} \
      -pkeyopt rsa_mgf1_md:{sha1|sha256}
    

  3. OpenSSL_V110 변수를 openssl.sh 스크립트의 경로로 설정합니다. OpenSSL의 패치 및 재컴파일에 대한 안내에 정확히 따랐다면 변수 값을 수정하지 않고 이 명령어를 사용할 수 있습니다.

    OPENSSL_V110="${HOME}/local/bin/openssl.sh"
    

  4. CKM_AES_KEY_WRAP_PAD 알고리즘을 사용하여 임시 AES 키로 대상 키를 래핑하고 WRAPPED_KEY에 추가합니다.

    "${OPENSSL_V110}" enc \
      -id-aes256-wrap-pad \
      -iv A65959A6 \
      -K $( hexdump -v -e '/1 "%02x"' < "${TEMP_AES_KEY}" ) \
      -in "${TARGET_KEY}" >> "${WRAPPED_KEY}"
    

    -iv A65959A6 플래그는 A65959A6을 대체 초기값으로 설정합니다. 이는 RFC 5649 사양의 요구사항입니다.

다음 단계