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