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-SHA256
chave 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:
Na Google Cloud consola, aceda à página Gestão de chaves.
Selecione o porta-chaves que contém a chave que quer atestar e, de seguida, selecione a chave.
Clique em Mais more_vert para a versão da chave que quer atestar e, de seguida, clique em Validar atestação.
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 parajsign.jar
.PATH_TO_CA.CERT
: o caminho para o seu certificadoca.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.