Use o Jsign e o PKCS#11 para assinar artefactos do Windows

Este guia fornece instruções para criar uma chave do Cloud HSM para a assinatura do Microsoft Authenticode através do PKCS#11 e do Jsign.

Exemplos de utilização

O fluxo de trabalho descrito neste documento ajuda a satisfazer as seguintes necessidades de segurança empresariais:

  • Assine o firmware com uma chave privada protegida por um HSM de nível 3 da FIPS140-2.
  • Assine artefactos do Windows sem ter de usar o signtool.

Antes de começar

Para concluir este tutorial, precisa do seguinte:

  • Um computador Windows com os artefactos que quer assinar. Certifique-se de que o Java está instalado neste computador.
  • Cloud Shell ou a sua própria máquina Linux, para gerar um pedido de assinatura de certificado ou um certificado. Neste computador, conclua a configuração documentada em Configuração do OpenSSL.

Não se esqueça de executar gcloud auth application-default login, se ainda não o fez.

Na sua máquina Windows, transfira o ficheiro 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

Crie uma chave de assinatura alojada no Cloud KMS

Usando o Cloud Shell ou a sua própria máquina, crie um conjunto de chaves do Cloud KMS no seu Google Cloud projeto através do seguinte comando:

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

Em seguida, crie uma EC-P256-SHA256chave de assinatura de hardware do Cloud KMSGoogle Cloud no seu projeto, no conjunto de chaves que 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"

Transfira a atestação da HSM

Uma atestação de HSM é uma prova de que a sua chave reside num HSM. Esta prova pode ser exigida pela sua autoridade de certificação (CA) para emitir um certificado de validação alargada (EV).

Para transferir a atestação do HSM associada à sua chave do Cloud KMS, conclua os seguintes passos:

  1. Na Google Cloud consola, aceda à página Gestão de chaves.

    Aceda à gestão de chaves

  2. Selecione o porta-chaves que contém a chave que quer atestar e, de seguida, selecione a chave.

  3. Clique em Mais para a versão da chave que quer atestar e, de seguida, clique em Validar atestação.

  4. Na caixa de diálogo Validar atestação, clique em Transferir pacote de atestação. Esta ação transfere um ficheiro ZIP com as cadeias de atestação e de certificados.

Consulte o artigo Analisar a atestação para ver instruções completas sobre como validar a atestação transferida.

Crie um certificado autoassinado com o OpenSSL

Este passo é opcional, mas ajuda a familiarizar-se com os passos seguintes antes de passar pelo processo e pelos custos de compra de um certificado assinado por uma autoridade de certificação.

Usando o Cloud Shell ou a sua própria máquina, gere um certificado autoassinado com a chave de assinatura alojada no Cloud KMS. Pode usar o OpenSSL para usar um URI PKCS #11 em vez de um caminho de ficheiro e identificar a chave pela respetiva etiqueta. Na biblioteca PKCS #11 do Cloud KMS, a etiqueta 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 este comando falhar, PKCS11_MODULE_PATH pode ter sido definido incorretamente ou pode não ter as autorizações corretas para usar a chave de assinatura do Cloud KMS.

Agora, deve ter um certificado com o seguinte aspeto:

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

Copie o certificado para o seu computador Windows para o poder usar com o Jsign para assinar os seus artefactos.

Crie um novo pedido de assinatura de certificado

Pode gerar um pedido de assinatura de certificado (CSR) para uma chave de assinatura do Cloud HSM. Conclua estes passos se a sua autoridade de certificação exigir um CSR para gerar um novo certificado para assinatura de código.

Usando o Cloud Shell ou a 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 o seguinte:

  • CERTIFICATE_NAME: um nome para o certificado que quer gerar.
  • DIGEST_FLAG: um sinalizador que indica o tipo de resumo. Use -sha256, -sha384 ou -sha512, consoante o algoritmo da chave.
  • KEY_ID: o ID do recurso totalmente qualificado de uma versão da 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 o pedido de assinatura do certificado.

Certifique-se de que usa as -sigopt opções corretas para o tipo de chave que está a usar.

Agora que tem o CSR, pode fornecê-lo à autoridade de certificação (CA) para obter o certificado de assinatura. Use o certificado fornecido pela CA na secção seguinte.

Assine um artefacto com o Jsign

Agora que criou com êxito um certificado (autoassinado ou obtido na autoridade de certificação) e o copiou para o seu computador Windows, pode usá-lo para assinar um artefacto do Windows.

Para ver uma lista dos formatos de ficheiros suportados, execute o comando jsign --help.

Use o Jsign para assinar os artefactos com a sua chave do Cloud KMS e o seu 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 o seguinte:

  • PATH_TO_JSIGN.JAR: o caminho para jsign.jar.
  • PATH_TO_CA.CERT: o caminho para o seu certificado ca.cert.
  • PATH_TO_ARTIFACT_TO_SIGN: o caminho para o artefacto que quer assinar.

Para uma explicação detalhada de cada opção de comando, consulte a documentação oficial do Jsign.