Este guia fornece instruções para criar uma chave do Cloud HSM para assinatura Microsoft Authenticode usando PKCS#11 e Jsign.
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.
- Assine artefatos do Windows sem precisar usar a ferramenta de sinalização.
Antes de começar
Para concluir este tutorial, você precisa do seguinte:
- Uma máquina Windows com os artefatos que você quer assinar. Verifique se o Java está instalado nesta máquina.
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 em Configuração do OpenSSL.
Lembre-se de executar gcloud auth application-default login
caso ainda não tenha feito isso.
Na máquina Windows, faça o download do arquivo JAR da versão mais recente do Jsign usando o seguinte comando do PowerShell:
wget https://github.com/ebourg/jsign/releases/download/JSIGN.VERSION/jsign-JSIGN.VERSION.jar -O jsign.jar
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"
Baixar o atestado do HSM
Um atestado do HSM é a prova de que sua chave reside em um HSM. Essa comprovação pode ser necessária para que sua autoridade certificadora (AC) emita um certificado de validação estendida (EV).
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 Como analisar o atestado para ver instruções completas sobre como verificar o atestado baixado.
Criar um certificado autoassinado com o OpenSSL
Esta etapa é opcional, mas ajuda você a se familiarizar com as etapas posteriores antes de passar pelo processo e pela despesa 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. Você pode usar o OpenSSL para utilizar uma URI PKCS #11 em vez de um caminho de arquivo e identifica 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 na sua máquina Windows para que você possa usá-lo com Jsign 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 um Cloud HSM chave de assinatura. Conclua estas etapas se sua autoridade certificadora 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ê queremos 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.
Agora que você tem a CSR, pode enviá-la à autoridade certificadora (AC) para receber o certificado de assinatura. Use o certificado fornecido pela sua AC na próxima seção.
Assinar um artefato com Jsign
Agora que você criou um certificado (autoassinado ou da autoridade certificadora) e copiá-los para sua máquina Windows ele pode ser usado para assinar um artefato do Windows.
Para ver uma lista de formatos de arquivo compatíveis, execute o comando jsign --help
.
Use o Jsign para assinar os artefatos, usando sua chave do Cloud KMS e sua certificado.
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
Substitua:
PATH_TO_JSIGN.JAR
: o caminho parajsign.jar
.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, consulte a documentação Documentação do Jsign.