CNG 제공자 및 SignTool을 사용한 Windows 아티팩트 서명

이 가이드에서는 CNG 제공자 및 SignTool을 통해 Microsoft Authenticode 서명용 Cloud HSM 키를 만드는 방법을 설명합니다.

이 튜토리얼의 Terraform 기반 청사진 버전은 kms-solutions GitHub 저장소에서 확인할 수 있습니다.

사용 사례

이 문서에 설명된 워크플로는 다음 기업 보안 요구사항을 해결하는 데 도움이 됩니다.

  • FIPS140-2 Level 3 HSM으로 보호되는 비공개 키로 펌웨어에 서명합니다.
  • Windows 표준 SignTool 도구를 사용하여 Windows 아티팩트에 서명합니다.

시작하기 전에

이 튜토리얼을 완료하려면 다음이 필요합니다.

  • 서명할 아티팩트가 있는 Windows 머신이 필요합니다.
  • 포함된 .msi 설치 프로그램을 사용하여 Windows 머신에 설치할 수 있는 최신 Cloud KMS CNG 제공자 버전이 필요합니다.
  • 인증서 서명 요청 또는 인증서를 생성할 Cloud Shell 또는 자체 Linux 머신이 필요합니다. 이 머신에서 OpenSSL 설정에 설명된 구성을 완료하여 PKCS#11 라이브러리를 다운로드하고 구성합니다.

아직 실행하지 않았다면 gcloud auth application-default login을 실행해야 합니다.

아직 다운로드하지 않은 경우 Windows 머신에 SignTool을 포함한 최신 Windows SDK를 다운로드합니다.

구성

Cloud KMS 호스팅 서명 키 만들기

Cloud Shell 또는 자체 머신을 사용하여 다음 명령어를 통 Google Cloud 프로젝트에 Cloud KMS 키링을 만듭니다.

gcloud kms keyrings create "KEY_RING" --location "LOCATION"

그런 다음 방금 만든 키링에 Google Cloud 프로젝트의 Cloud KMS EC-P256-SHA256 하드웨어 서명 키를 만듭니다.

gcloud kms keys create "KEY_NAME" --keyring "KEY_RING" \
  --project "PROJECT_ID" --location "LOCATION" \
  --purpose "asymmetric-signing" --default-algorithm "ec-sign-p256-sha256" \
  --protection-level "hsm"

HSM 증명 다운로드

HSM 증명은 키가 HSM에 있음을 입증합니다. 인증 기관(CA)에서 EV(Extended Validation) 인증서를 발급할 때 이 증거가 필요할 수 있습니다.

Cloud KMS 키와 연결된 HSM 증명을 다운로드하려면 다음 단계를 완료하세요.

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

    키 관리로 이동

  2. 증명하려는 키가 포함된 키링을 선택한 다음 키를 선택합니다.

  3. 증명할 키 버전의 더보기 를 클릭한 다음 증명 확인을 클릭합니다.

  4. 증명 확인 대화상자에서 증명 번들 다운로드를 클릭합니다. 이렇게 하면 증명 및 인증서 체인이 포함된 ZIP 파일이 다운로드됩니다.

다운로드한 증명을 확인하는 방법에 대한 자세한 안내는 증명 파싱을 참조하세요.

OpenSSL로 자체 서명 인증서 만들기

이 단계는 선택사항이지만 인증 기관에서 서명한 인증서를 구매하기 위한 프로세스를 진행하고 관련 비용을 지불하기 전에 후속 단계를 숙지하는 데 도움이 됩니다.

Cloud Shell 또는 자체 머신을 사용하여 Cloud KMS 호스팅 서명 키로 자체 서명 인증서를 생성합니다. OpenSSL을 사용하여 파일 경로 대신 PKCS #11 URI를 사용하고 해당 라벨로 키를 식별할 수 있습니다. Cloud KMS PKCS #11 라이브러리에서 키 라벨은 CryptoKey 이름과 동일합니다.

openssl req -new -x509 -days 3650 -subj '/CN=test/' -sha256 -engine pkcs11 \
  -keyform engine -key pkcs11:object=KEY_NAME > ca.cert

이 명령어가 실패하면 PKCS11_MODULE_PATH가 잘못 설정되었거나 Cloud KMS 서명 키를 사용할 수 있는 올바른 권한이 없을 수 있습니다.

이제 다음과 같은 인증서가 준비되었습니다.

-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----

SignTool과 함께 사용하여 아티팩트에 서명할 수 있도록 인증서를 Windows 머신에 복사합니다.

새 인증서 서명 요청 만들기

Cloud HSM 서명 키에 대한 인증서 서명 요청(CSR)을 생성할 수 있습니다. 인증 기관에서 코드 서명에 사용할 새 인증서를 생성하기 위해 CSR이 필요한 경우 다음 단계를 완료합니다.

Cloud Shell 또는 자체 머신을 사용하여 다음 명령어를 실행합니다.

openssl req -new -subj '/CN=CERTIFICATE_NAME/' DIGEST_FLAG \
  -engine pkcs11 -keyform engine \
  -key pkcs11:id=KEY_ID > REQUEST_NAME.csr

다음을 바꿉니다.

  • CERTIFICATE_NAME: 생성할 인증서의 이름입니다.
  • DIGEST_FLAG: 다이제스트 유형을 나타내는 플래그입니다. 키 알고리즘에 따라 -sha256, -sha384 또는 -sha512를 사용합니다.
  • KEY_ID: 비대칭 서명 키 버전의 정규화된 리소스 ID입니다(예: projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1).
  • REQUEST_NAME: 인증서 서명 요청의 이름입니다.

사용 중인 키 유형에 맞는 -sigopt 옵션을 사용해야 합니다.

OpenSSL에서는 100자를 초과하는 객체 ID를 사용할 수 없습니다. 짧은 KeyRingCryptoKey 이름을 사용하거나 대신 pkcs11:object=KEY_NAME을 사용하세요. OpenSSL 객체 ID 제한에 대한 자세한 내용은 GitHub의 관련 문제를 참조하세요.

이제 CSR이 있으므로 인증 기관(CA)에 제공하여 서명 인증서를 가져올 수 있습니다. 다음 섹션에서 CA에서 제공된 인증서를 사용합니다.

SignTool로 아티팩트 서명

자체 서명되었거나 인증 기관에서 가져온 인증서를 성공적으로 만들고 Windows 머신에 복사했으므로 이를 사용하여 Windows 아티팩트에 서명할 수 있습니다.

SignTool을 사용하여 Cloud KMS 키와 인증서로 아티팩트에 서명합니다.

"PATH_TO_SIGNTOOL.EXE" sign ^
  /v /debug /fd sha256 /t http://timestamp.digicert.com ^
  /f PATH_TO_CA.CERT ^
  /csp "Google Cloud KMS Provider" ^
  /kc projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1 ^
  PATH_TO_ARTIFACT_TO_SIGN

다음을 바꿉니다.

  • PATH_TO_SIGNTOOL.EXE: signtool.exe의 경로입니다(예: C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe).
  • PATH_TO_CA.CERT: 인증서 ca.cert의 경로입니다.
  • PATH_TO_ARTIFACT_TO_SIGN: 서명하려는 아티팩트의 경로입니다.

각 명령어 옵션과 지원되는 아티팩트 파일 형식에 대한 자세한 내용은 공식 SignTool 문서를 참조하세요.