Usar o provedor CNG e o SignTool para assinar artefatos do Windows

Este guia fornece instruções para criar uma chave do Cloud HSM para assinatura Authenticode da Microsoft usando nosso provedor de CNG e a SignTool.

Encontre uma versão do blueprint baseada no Terraform deste tutorial no repositório do GitHub kms-solutions.

Casos de uso

O fluxo de trabalho descrito neste documento ajuda a atender às seguintes necessidades de segurança empresarial:

  • Assine o firmware com uma chave privada protegida por um HSM FIPS140-2 de nível 3.
  • Assinar artefatos do Windows usando a ferramenta padrão SignTool do Windows.

Antes de começar

Para concluir este tutorial, você precisa do seguinte:

  • Uma máquina Windows com os artefatos que você quer assinar.
  • A versão mais recente do provedor de CNG do Cloud KMS, que pode ser instalado na máquina Windows usando o instalador .msi incluído.
  • o Cloud Shell ou sua própria máquina Linux, para gerar uma solicitação de assinatura de certificado ou um certificado. Nesta máquina, conclua a configuração documentada na configuração do OpenSSL para fazer o download e configurar a biblioteca PKCS#11.

Execute gcloud auth application-default login se ainda não tiver feito isso.

Faça o download do SDK do Windows mais recente na sua máquina Windows, que inclui o SignTool, caso ainda não tenha feito isso.

Configuração

Criar uma chave de assinatura hospedada no Cloud KMS

Usando o Cloud Shell ou sua própria máquina, crie um keyring do Cloud KMS no seu projeto do Google Cloud usando o seguinte comando:

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

Depois, crie uma chave de assinatura de hardware EC-P256-SHA256 do Cloud KMS na sua projeto do Google Cloud, no keyring que você acabou de criar:

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"

Fazer o download do atestado do HSM

Um atestado do HSM é a prova de que sua chave reside em um HSM. Essa prova pode ser exigido pela sua autoridade certificadora (CA) para emitir uma validação estendida (EV) certificado.

Para fazer o download do atestado do HSM associado à chave do Cloud KMS, conclua as etapas a seguir:

  1. No console do Google Cloud, acesse a página Gerenciamento de chaves.

    Vá para Gerenciamento de chaves

  2. Selecione o keyring que contém a chave que você quer atestar e selecione a chave.

  3. Clique em Mais na versão da chave que você quer atestar e clique em Verificar atestado.

  4. Na caixa de diálogo Verificar atestado, clique em Fazer o download do pacote de atestado. Isso faz o download de um arquivo ZIP contendo o atestado e o certificado cadeias de caracteres.

Consulte Analisar o atestado para conferir instruções completas sobre como verificar o atestado transferido por download.

Criar um certificado autoassinado com o OpenSSL

Esta etapa é opcional, mas ajuda você a se familiarizar com as etapas antes de passar pelo processo e as despesas de compra de um certificado assinado por uma autoridade certificadora.

Usando o Cloud Shell ou sua própria máquina, gere um certificado autoassinado com a chave de assinatura hospedada no Cloud KMS. É possível usar o OpenSSL para usar um URI PKCS #11 em vez de um caminho de arquivo e identificar a chave pelo rótulo. Na biblioteca PKCS #11 do Cloud KMS, o rótulo da chave é equivalente ao nome da CryptoKey.

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

Se o comando falhar, é possível que PKCS11_MODULE_PATH tenha sido definido incorretamente. talvez você não tenha as permissões corretas para usar a API Cloud KMS chave de assinatura.

Agora você terá um certificado como este:

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

Copie o certificado para a máquina Windows para que ele possa ser usado com a SignTool para assinar seus artefatos.

Criar uma nova solicitação de assinatura de certificado

É possível gerar uma solicitação de assinatura de certificado (CSR) para uma chave de assinatura do Cloud HSM. Siga estas etapas se a autoridade de certificação exigir um CSR para gerar um novo certificado para assinatura de código.

Usando o Cloud Shell ou sua própria máquina, execute o seguinte comando:

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

Substitua:

  • CERTIFICATE_NAME: um nome para o certificado que você quer gerar.
  • DIGEST_FLAG: uma sinalização que indica o tipo de resumo. Use -sha256, -sha384 ou -sha512, dependendo do algoritmo da chave.
  • KEY_ID: o ID de recurso totalmente qualificado de uma versão da chave de assinatura, por exemplo, projects/PROJECT_ID/locations/LOCATION/keyRings/KEY_RING/cryptoKeys/KEY_NAME/cryptoKeyVersions/1.
  • REQUEST_NAME: um nome para a solicitação de assinatura de certificado.

Use as opções corretas de -sigopt de acordo com o tipo de chave usando.

Não é possível usar um ID de objeto com mais de 100 caracteres no OpenSSL. Usar abreviação KeyRing e CryptoKey ou use pkcs11:object=KEY_NAME. Para mais informações sobre o limite de ID de objeto do OpenSSL, consulte a no GitHub (link em inglês).

Agora que você tem a CSR, pode fornecê-la ao seu certificado Autoridade (CA) para obter o certificado de assinatura. Use o certificado fornecido pela sua AC na próxima seção.

Assinar um artefato com o SignTool

Agora que você criou um certificado (autoassinado ou obtido da Autoridade Certificadora) e o copiou para sua máquina Windows, ele pode ser usado para assinar um artefato do Windows.

Use o SignTool para assinar os artefatos com sua chave do Cloud KMS e seu certificado.

"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

Substitua:

  • PATH_TO_SIGNTOOL.EXE: o caminho para signtool.exe (por exemplo, C:\\Program Files (x86)\\Windows Kits\\10\\bin\\10.0.19041.0\\x64\\signtool.exe.
  • PATH_TO_CA.CERT: o caminho para o certificado ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: o caminho para o artefato que que você quer assinar.

Para uma explicação detalhada de cada opção de comando e arquivo de artefato compatível formatos, consulte a documentação oficial do SignTool.