Este guia fornece instruções para criar uma chave do Cloud HSM para assinatura do Microsoft Authenticode usando nosso provedor CNG e a SignTool.
Você encontra uma versão do blueprint baseada no Terraform deste tutorial no repositório kms-solutions do GitHub.
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 Nível 3.
- Assine artefatos do Windows usando a ferramenta SignTool padrão 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 CNG do Cloud KMS, que pode ser instalada na sua máquina Windows usando o instalador .msi incluído.
Cloud Shell ou sua própria máquina Linux para gerar uma solicitação de assinatura de certificado ou um certificado. Nessa máquina, conclua a configuração documentada em Configuração do OpenSSL para baixar e configurar nossa biblioteca PKCS#11.
Não se esqueça de executar gcloud auth application-default login se ainda não tiver feito isso.
Se ainda não fez isso, baixe o SDK do Windows mais recente no seu computador Windows, que inclui o SignTool.
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 Google Cloud com o seguinte comando:
gcloud kms keyrings create "KEY_RING" --location "LOCATION"
Em seguida, crie uma chave de assinatura de hardware EC-P256-SHA256 do Cloud KMS no seu
projetoGoogle 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"
Baixar o atestado do HSM
Um atestado de HSM é a prova de que sua chave reside em um HSM. Essa comprovação pode ser exigida pela autoridade certificadora (AC) para emitir um certificado de validação estendida (EV).
Para fazer o download do atestado do HSM associado à sua chave do Cloud KMS, conclua as etapas a seguir:
No console do Google Cloud , acesse a página Gerenciamento de chaves.
Selecione o keyring que contém a chave que você quer atestar e selecione a chave.
Clique em Mais more_vert na versão da chave que você quer atestar e clique em Verificar atestado.
Na caixa de diálogo Verificar atestado, clique em Fazer download do pacote de atestado. Isso fará o download de um arquivo ZIP contendo as cadeias de atestado e certificado.
Consulte Analisar a atestação para instruções completas sobre como verificar a atestação baixada.
Criar um certificado autoassinado com o OpenSSL
Essa etapa é opcional, mas ajuda você a se familiarizar com as etapas seguintes antes de passar pelo processo e pela despesa de comprar um certificado assinado por uma autoridade de certificação.
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 esse comando falhar, é possível que PKCS11_MODULE_PATH tenha sido definido incorretamente ou que você não tenha as permissões corretas para usar a chave de assinatura do Cloud KMS.
Agora você terá um certificado como este:
-----BEGIN CERTIFICATE-----
...
...
...
-----END CERTIFICATE-----
Copie o certificado para sua máquina Windows para usá-lo com SignTool e assinar seus artefatos.
Criar uma nova solicitação de assinatura de certificado
É possível gerar uma solicitação de assinatura de certificado (CSR, na sigla em inglês) para uma chave de assinatura do Cloud HSM. Conclua estas etapas se a autoridade de certificação exigir uma 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 flag que indica o tipo de resumo. Use-sha256,-sha384ou-sha512, dependendo do algoritmo da chave.KEY_ID: o ID totalmente qualificado do recurso de uma versão de chave de assinatura assimétrica. 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 -sigopt corretas para o tipo de chave que você está usando.
Não é possível usar um ID de objeto com mais de 100 caracteres com o OpenSSL. Use nomes curtos
KeyRing e CryptoKey ou use pkcs11:object=KEY_NAME.
Para mais informações sobre o limite de ID de objeto do OpenSSL, consulte o
problema relacionado no GitHub (em inglês).
Agora que você tem a CSR, forneça-a à autoridade certificadora (CA) para receber o certificado de assinatura. Use o certificado fornecido pela AC na próxima seção.
Assinar um artefato com o SignTool
Agora que você criou um certificado (autoassinado ou obtido da autoridade de certificação) e o copiou para sua máquina Windows, é possível usá-lo para assinar um artefato do Windows.
Use o SignTool para assinar os artefatos usando 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 parasigntool.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 certificadoca.cert.PATH_TO_ARTIFACT_TO_SIGN: o caminho para o artefato que você quer assinar.
Para uma explicação detalhada de cada opção de comando e formatos de arquivo de artefato compatíveis, consulte a documentação oficial do SignTool (link em inglês).