Jsign 및 PKCS#11을 사용한 Windows 아티팩트 서명

이 가이드에서는 PKCS#11 및 Jsign을 통해 서명하는 Microsoft Authenicode의 Cloud HSM 키를 만드는 방법을 설명합니다.

사용 사례

이 문서에 설명된 워크플로는 다음 엔터프라이즈 보안 요구를 해결하는 데 도움이 됩니다.

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

시작하기 전에

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

  • 서명할 아티팩트가 있는 Windows 머신이 필요합니다. 이 머신에 Java가 설치되어 있는지 확인합니다.
  • 인증서 서명 요청 또는 인증서를 생성할 Cloud Shell 또는 자체 Linux 머신이 필요합니다. 이 머신에서 OpenSSL 설정에 설명된 구성을 완료합니다.

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

Windows 머신에서 다음 powershell 명령어를 사용하여 최신 Jsign 버전 JAR 파일을 다운로드합니다.

wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar

구성

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-----

Jsign과 함께 사용하여 아티팩트에 서명할 수 있도록 인증서를 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 옵션을 사용해야 합니다.

Jsign으로 아티팩트 서명

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

지원되는 파일 형식 목록을 보려면 jsign --help 명령어를 실행합니다.

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

java -jar PATH_TO_JSIGN.JAR --storetype GOOGLECLOUD \
  --storepass $(gcloud auth application-default print-access-token) \
  --keystore projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING \
  --alias KEY_NAME \
  --certfile PATH_TO_CA.CERT
  PATH_TO_ARTIFACT_TO_SIGN

다음을 바꿉니다.

  • PATH_TO_JSIGN.JAR: jsign.jar의 경로입니다.
  • PATH_TO_CA.CERT: 인증서 ca.cert의 경로입니다.
  • PATH_TO_ARTIFACT_TO_SIGN: 서명하려는 아티팩트의 경로입니다.

각 명령어 옵션에 대한 자세한 설명은 공식 Jsign 문서를 참조하세요.