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

6분 분량
0

key_mgmt_util 명령줄 도구로 unWrapKey 명령을 사용하여 AWS CloudHSM으로 가져오려는 로컬 키가 있습니다. 하지만 일반 텍스트 키를 가져오거나 래핑할 수 없습니다.

해결 방법

임시 AES 키로 페이로드 키를 암호화합니다. 키 페어에서 퍼블릭 키로 임시 AES를 암호화합니다. 그런 다음 암호화된 페이로드 키와 암호화된 임시 키를 하나의 파일로 연결합니다. 연결된 파일은 암호화된 형식으로 CloudHSM에 전송되고 키 페어의 프라이빗 키로 해독됩니다. AES_KEY_WRAP 메커니즘은 임시 AES 키를 해독하고 이를 사용하여 페이로드 키를 해독합니다.

다음 키를 생성합니다.

  • 페이로드 AES 또는 RSA 키 CloudHSM에서 가져와서 사용하는 키입니다.
  • AES_KEY_WRAP에서 페이로드를 암호화하는 데 필요한 임시 AES 키. 암호화 가능한 크기에 대한 제한이 없으므로 AES를 사용하는 것이 모범 사례입니다.
  • 이러한 키를 CloudHSM으로 안전하게 래핑하고 언래핑하는 데 사용되는 RSA 키 페어.

시작하기 전에 엔벨로프 래핑을 허용하도록 패치된 OpenSSL 버전이 있는지 확인하세요. 지침은 CloudHSM CKM_RSA_AES_KEY_WRAP 메커니즘과 함께 사용할 수 있도록 OpenSSL에 패치를 활성화하려면 어떻게 해야 합니까?를 참조하세요.

로컬 키 생성, 암호화 및 가져오기

1.    다음 명령을 실행하여 페이로드, 휘발성 및 RSA 키를 생성합니다.

팁: 파일을 추적할 수 있도록 이러한 키는 자체 디렉터리에 생성하십시오.

openssl rand -out payload_aes 32
openssl rand -out ephemeral_aes 32
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -out public.pem -pubout -outform PEM

2.    다음 명령을 사용하여 임시 AES 키의 원시 16진수 값을 변수로 출력합니다.

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

참고: hexdump 유틸리티가 설치되어 있는지 확인하십시오. 그렇지 않으면 이 명령이 오류를 반환합니다. hexdump 유틸리티를 설치하는 방법은 OS 설명서를 참조하세요.

3.    OpenSSL enc 명령을 사용하여 페이로드를 휘발성 AES 키로 래핑합니다. -id-aes256-wrap-pad 암호는 CKM_RSA_AES_KEY_WRAP과 일치하는 RFC 3394 호환 래핑 메커니즘입니다. -iv 값은 RFC 5649(RFC 3394의 확장)에 의해 설정됩니다.

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

4.    1단계에서 생성한 RSA 키 페어의 퍼블릭 키로 AES 키를 암호화합니다.

OPENSSL_V111 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 프라이빗 키를 CloudHSM으로 가져옵니다. HSM에서 importPrivateKey를 사용하여 가져오기를 관리할 영구 AES 키를 생성합니다.

참고: user-nameuser-password는 CloudHSM 사용자 이름과 암호로 바꾸세요.

참고: HSM에서 RSA 키 페어를 생성하고 exportPubKey를 사용하여 퍼블릭 키를 내보낸 경우, 6~9단계를 건너뛸 수 있습니다.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  genSymKey -t 31 -s 32 -l aes256

경고: 이 명령은 사용자 이름 및 암호의 세부 정보를 로컬에 기록할 수 있습니다. 키를 전송한 후에는 암호를 변경하는 것이 좋습니다. 암호화 사용자 암호를 지정하는 대신 셸 기록에 암호가 기록되지 않도록 셸 스크립트를 작성할 수도 있습니다. 이 쉘 스크립트는 key_mgmt_util에 대한 모든 인수를 받아 이 명령으로 보냅니다. 이렇게 하면 셸 스크립트를 사용하여 위의 명령과 아래의 다른 key_mgmt_util 명령을 실행할 수 있습니다.

7.    다음과 유사한 출력이 나타납니다. AES 키 핸들을 기록해 둡니다. 이 핸들은 프라이빗 RSA 키를 가져오는 데 사용됩니다. 이 예제에서 키 핸들은 7입니다.

Command: genSymKey  -t  31  -s  32  -l  aes256
        Cfm3GenerateSymmetricKey returned: 0x00 : HSM Return: SUCCESS
        Symmetric Key Created.  Key Handle: 7
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

8.    프라이빗 키를 가져와 HSM으로 래핑합니다. 가져오기는 6단계에서 생성한 영구 AES 키로 보호됩니다. 참고: 옵션 -w 7은 키 핸들로 바꾸십시오.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  importPrivateKey -l private -f private.pem -w 7

9.    다음과 유사한 출력이 나타납니다. 가져온 RSA 프라이빗 키 핸들을 기록해 둡니다. 이 예제에서 가져온 RSA 프라이빗 키는 8입니다.

Cfm3WrapHostKey returned: 0x00 : HSM Return: SUCCESS
        Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
        Cfm3UnWrapKey returned: 0x00 : HSM Return: SUCCESS
        Private Key Imported.  Key Handle: 8
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

10.    unWrapKey 명령과 함께 가져온 RSA 프라이빗 키를 사용하여 연결된 페이로드 키를 HSM에 언래핑합니다. 이 예제에서는 가져온 RSA 프라이빗 키의 키 핸들로 -w 8을 사용합니다.

참고: -w 8은 프라이빗 키 핸들로 바꾸세요.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password  unWrapKey -f rsa_aes_wrapped -w 8 -m 7 -noheader -l secretkey -kc 4 -kt 31

참고: AES 키를 언래핑하려면 -kc 4 -kt 31을 사용하고 RSA 프라이빗 키를 언래핑하려면 -kc 3 -kt 0을 사용해야 합니다. -m, -kc-kt 파라미터 사용에 대한 자세한 내용은 unWrapKey 예제를 참조하세요.

11.    페이로드 AES 키 가져오기에 성공하면 다음과 비슷한 출력이 표시됩니다.

참고: 이 예제에서는 CloudHSM에서 새 언래핑된 키의 키 핸들 10을 사용할 수 있습니다.

Cfm3CreateUnwrapTemplate2 returned: 0x00 : HSM Return: SUCCESS
        Cfm2UnWrapWithTemplate3 returned: 0x00 : HSM Return: SUCCESS
        Key Unwrapped.  Key Handle: 10
        Cluster Error Status
        Node id 0 and err state 0x00000000 : HSM Return: SUCCESS

페이로드 AES 키를 가져왔는지 확인

1.    래핑 키 -w 7을 사용하여 페이로드 AES 키를 디스크로 다시 내보냅니다. 페이로드 키 핸들 10을 가져온 페이로드 AES 키의 자체 값으로 바꿉니다.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exSymKey -k 10 -w 7 -out HSM.key

2.    다음 명령을 실행하여 가져온 페이로드 키와 payload_aes 키를 비교합니다.

diff HSM.key payload_aes --report-identical-files

3.    HSM.key 키와 payload_aes 키가 동일한 경우 다음과 같은 출력이 표시됩니다.

Files HSM.key and payload_aes are identical

RSA 페이로드 가져오기

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

openssl genrsa -out payload_rsa.pem 2048
openssl rand -out ephemeral_aes 32
openssl genrsa -out private.pem 2048
openssl rsa -in private.pem -out public.pem -pubout -outform PEM

2.    RSA 페이로드 가져오기에 필요한 단계 섹션의 1단계에서 OpenSSL을 사용하여 생성한 RSA 키는 PKCS #1 형식입니다. 하지만 key_mgmt_util 도구는 프라이빗 키가 PKCS #8 DER 형식이라고 가정합니다. 선호하는 텍스트 편집기를 사용하여 일반 텍스트로 키를 보고 다음과 비슷한 형식인지 확인합니다.

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

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

openssl pkcs8 -topk8 -inform PEM -outform DER -in payload_rsa.pem -out payload_rsa_pkcs8.der -nocrypt

4.    로컬 키 생성, 암호화 및 가져오기섹션의 2~9단계를 따릅니다.

참고: payload_aespayload_rsa_pkcs8.der로 바꾸십시오.

5.    다음 명령을 실행하여 페이로드 RSA 프라이빗 키를 CloudHSM으로 언래핑하고 출력 키 핸들을 메모합니다.

/opt/cloudhsm/bin/key_mgmt_util singlecmd loginHSM -u CU -s user-name -p user-password unWrapKey -f rsa_aes_wrapped -kc 3 -kt 0 -w 8 -l private_key -m 7 -noheader

참고: AES 키를 언래핑하려면 -kc 4 -kt 31을 사용하고 RSA 프라이빗 키를 언래핑하려면 -kc 3 -kt 0을 사용해야 합니다.

이제 페이로드 RSA 키가 HSM으로 언래핑되었습니다.

페이로드 RSA 프라이빗 키를 가져왔는지 확인

1.    앞서 생성한 래핑 키를 사용하여 페이로드 RSA 프라이빗 키를 디스크로 다시 내보냅니다. 페이로드 키 핸들 25를 가져온 페이로드 RSA 프라이빗 키의 자체 값으로 바꿉니다.

/opt/cloudhsm/bin/key_mgmt_util Cfm3Util singlecmd loginHSM -u CU -s user-name -p user-password exportPrivateKey -k 25 -w 7 -out HSM_rsa_private.key

2.    다음 명령을 실행하여 payload_rsa 키를 DER로 변환하지 않고 PKCS #8 형식으로 변환합니다.

openssl pkcs8 -topk8 -inform PEM -outform PEM -in payload_rsa.pem -out payload_rsa_pkcs8.pem -nocrypt

3.    다음 명령을 실행하여 가져온 페이로드 키와 payload_rsa 키를 비교합니다.

diff HSM_rsa_private.key payload_rsa_pkcs8.pem --report-identical-files

4.    HSM_rsa_private.key 키와 payload_rsa_pkcs8.pem 키가 동일한 경우 다음과 같은 출력이 표시됩니다.

Files HSM_rsa_private.key and payload_rsa_pkcs8.pem are identical

관련 정보

지원되는 PKCS #11 메커니즘

OpenSSL

PKCS#11 사양의 Oasis 요구 사항

RFC 3394

RFC 5649

AWS 공식
AWS 공식업데이트됨 2년 전