OpenSSL을 사용하여 AWS KMS로 키를 가져오려고 했지만, "InvalidCiphertext" 오류가 발생했습니다. 이 문제를 해결하려면 어떻게 해야 합니까?

최종 업데이트 날짜: 2019년 5월 8일

AWS Key Management Service(AWS KMS)에서 CMK(고객 마스터 키)를 생성했습니다. CMK 키 구성 요소 오리진을 외부로 지정하고, 래핑 키의 알고리즘으로 RSAES_OAEP_SHA_256을 선택한 후, OpenSSL을 사용하여 래핑 키로 키 구성 요소를 암호화했습니다. 그러나 암호화된 키 구성 요소를 가져올 때 요청에 실패하고 "InvalidCiphertext"와 관련된 오류 메시지가 표시됩니다. 이 가져오기 오류를 방지하려면 어떻게 해야 합니까?

간략한 설명

기본적으로 OpenSSL은 SHA-1 해시 함수를 사용합니다.

RSAES_OAEP_SHA_256 알고리즘(SHA-256 해시 함수)을 사용할 때 가져오기 오류를 방지하려면 openssl pkeyutl 명령을 사용하여 OpenSSL에서 키 구성 요소를 암호화하고 –pkeyopt rsa_padding_mode:oaep–pkeyopt rsa_oaep_md:sha256 파라미터를 지정합니다.

OpenSSL 및 RSAES_OAEP_SHA_256을 사용하여 AWS KMS로 키 구성 요소를 가져오는 전체 절차는 다음과 같습니다.

  1. 외부를 키 구성 요소 오리진으로 사용하여 CMK를 생성합니다.
  2. 래핑(퍼블릭) 키와 가져오기 토큰을 다운로드합니다.
  3. 256비트 대칭 키를 생성합니다.
  4. OpenSSL 버전에서 openssl pkeyutl을 지원하는지 확인합니다.
  5. 래핑 키를 사용하여 키 구성 요소를 암호화합니다.
  6. 암호화된 키 구성 요소를 가져옵니다.

참고: 래핑 키에 대해 RSAES_OAEP_SHA_1 암호화 알고리즘을 사용하는 경우 키 구성 요소 가져오는 방법을 참조하십시오.

​해결 방법

외부를 키 구성 요소 오리진으로 사용하여 CMK 생성

다음 AWS CLI(명령줄 인터페이스) 명령을 실행하여 외부 키 구성 요소에 대한 CMK를 생성합니다.
참고: export REGIONexport KEY_ALIAS 값을 키의 세부 정보로 대체해야 합니다.

export REGION=us-east-1
export KEY_ALIAS=cmk_with_externalmaterial
aws kms --region $REGION create-key --origin EXTERNAL --description $KEY_ALIAS
export KEY_ID=`aws kms --region $REGION list-keys --query 'Keys[?Description == "$KEY_ALIAS"].KeyId' --output text`
aws kms --region $REGION create-alias --alias-name alias/$KEY_ALIAS --target-key-id $KEY_ID

키 구성 요소를 가져올 때까지 새로 생성된 CMK 상태는 Pending Import입니다. 다음 명령을 실행하여 키의 상태를 확인합니다.

aws kms --region $REGION describe-key --key-id $KEY_ID

래핑(퍼블릭) 키와 가져오기 토큰 다운로드

다음 AWS CLI 명령을 실행하여 PublicKey(래핑 키) 및 ImportToken 값을 가져오고, base64를 사용하여 두 값을 디코딩하고, 별도의 파일에 각각 저장합니다. RSAES_OAEP_SHA_256 래핑 알고리즘은 get-parameters-for-import 명령에 지정됩니다.

export KEY_PARAMETERS=`aws kms --region $REGION get-parameters-for-import --key-id $KEY_ID --wrapping-algorithm RSAES_OAEP_SHA_256 --wrapping-key-spec RSA_2048`
echo $KEY_PARAMETERS | sed -e 's/[{}]/''/g' | awk '{n=split($0,a,","); for (i=1; i<=n;
i++) print a[i]}' | sed 's/^[ ]*//' | grep -i publickey | cut -d " " -f 2 | cut -c 2- | rev | cut -c 2- | rev > PublicKey.b64
echo $KEY_PARAMETERS | sed -e 's/[{}]/''/g' | awk '{n=split($0,a,","); for (i=1; i<=n; i++) print a[i]}' | sed 's/^[ ]//' | grep -i importtoken | cut -d " " -f 2 | cut -c 2- | rev | cut -c 2- | rev > ImportToken.b64
openssl enc -d -base64 -A -in PublicKey.b64 -out PublicKey.bin
openssl enc -d -base64 -A -in ImportToken.b64 -out ImportToken.bin
rm *.b64

이 명령은 PublicKey.bin에 래핑 키를 저장하고 ImportToken.bin에 가져오기 토큰을 저장합니다.

256비트 대칭 키 생성

키 구성 요소는 256비트(32비트) 대칭 키여야 합니다. 다음 명령 중 하나를 실행하여 키를 생성합니다.

OpenSSL

openssl rand -out PlaintextKeyMaterial.bin 32

또는

dd

dd if=/dev/urandom of=PlaintextKeyMaterial.bin bs=32 count=1

OpenSSL 버전에서 openssl pkeyutl을 지원하는지 확인

래핑 알고리즘으로 RSAES_OAEP_SHA_256을 사용하여 키 구성 요소를 암호화하려면 openssl pkeyutl 명령을 사용합니다.

중요: 이 명령은 OpenSSL 1.0.2 이상 버전에서만 사용할 수 있습니다.

RHEL 기반 Linux 컴퓨터를 사용하는 경우(예: Amazon Linux AMI를 사용하여 시작된 EC2 인스턴스) 다음 단계를 수행합니다.

1.    다음 명령을 실행하여 OpenSSL 버전을 확인합니다.

openssl version

2.    OpenSSL을 업데이트하려면 다음 명령을 실행합니다.

sudo yum –y update openssl

macOS를 사용하는 경우에는 다음 단계를 수행합니다.

1.    다음 Homebrew 명령을 실행합니다.

brew update
brew upgrade openssl
brew info openssl

2.    마지막 명령에서는 OpenSSL이 /usr/local/opt/openssl/bin/에 설치되었음을 알 수 있습니다. 다음 명령을 실행하여 OpenSSL 버전을 확인합니다.

/usr/local/opt/openssl/bin/openssl version

3.    항상 최신 OpenSSL 버전을 사용하려면 ~ /.bash_profile을 편집하고 파일의 끝에 다음 행을 추가합니다.

export PATH="/usr/local/opt/openssl/bin:$PATH"

4.    줄을 추가한 후 다음 명령을 실행합니다.

source ~/.bash_profile

5.    macOS 환경에서 변경 내용을 확인하려면 다음 명령을 실행합니다.

echo $PATH
openssl version

래핑 키를 사용하여 키 구성 요소 암호화

다음 명령을 사용하여 이전에 다운로드한 래핑 키 및 최신 버전의 OpenSSL을 사용하여 키 구성 요소를 암호화합니다.

참고: 래핑 키는 PublicKey.bin에 저장됩니다.

openssl pkeyutl -in PlaintextKeyMaterial.bin -out EncryptedKeyMaterial.bin -inkey PublicKey.bin -keyform DER -pubin -encrypt -pkeyopt rsa_padding_mode:oaep
-pkeyopt rsa_oaep_md:sha256

이 명령은 EncryptedKeyMaterial.bin을 생성합니다. 이 값을 암호화된 키 구성 요소로 CMK에 가져옵니다.

암호화된 키 구성 요소 가져오기

다음 AWS CLI 명령을 실행하여 암호화된 키 구성 요소를 CMK에 가져옵니다.

aws kms --region $REGION import-key-material --key-id $KEY_ID --encrypted-key-material fileb://EncryptedKeyMaterial.bin --import-token fileb://ImportToken.bin --expiration-model KEY_MATERIAL_DOES_NOT_EXPIRE

가져오기를 완료한 후 키 상태는 Enabled로 변경됩니다. 다음 명령을 실행하여 키 상태를 확인합니다.

aws kms --region $REGION describe-key --key-id $KEY_ID

이 문서가 도움이 되었습니까?

AWS에서 개선해야 할 부분이 있습니까?


도움이 필요하십니까?